2 | module UUID.Driver.JS
5 | import UUID.Data.Vect
7 | %foreign "javascript:lambda: size => new Uint8Array(size)"
8 | prim__Uint8Array : Int32 -> PrimIO AnyPtr
10 | %foreign "javascript:lambda: (arr, idx, x) => arr.set([x], idx)"
11 | prim__Uint8ArraySetByte : GCAnyPtr -> Int32 -> Bits8 -> PrimIO ()
13 | %foreign "javascript:lambda: (arr, idx) => arr.at(idx)"
14 | prim__Uint8ArrayAtByte : GCAnyPtr -> Int32 -> Bits8
16 | %foreign "javascript:lambda: str => require('uuid').parse(str)"
17 | prim__parse : String -> PrimIO AnyPtr
19 | %foreign "javascript:lambda: buf => require('uuid').stringify(buf)"
20 | prim__stringify : GCAnyPtr -> PrimIO String
22 | %foreign "javascript:lambda: buf => require('uuid').v1(null, buf)"
23 | prim__v1 : GCAnyPtr -> PrimIO AnyPtr
25 | %foreign "javascript:lambda: (name, ns, buf) => require('uuid').v3(name, ns, buf)"
26 | prim__v3 : String -> GCAnyPtr -> GCAnyPtr -> PrimIO AnyPtr
28 | %foreign "javascript:lambda: buf => require('uuid').v4(null, buf)"
29 | prim__v4 : GCAnyPtr -> PrimIO AnyPtr
31 | %foreign "javascript:lambda: (name, ns, buf) => require('uuid').v5(name, ns, buf)"
32 | prim__v5 : String -> GCAnyPtr -> GCAnyPtr -> PrimIO AnyPtr
34 | %foreign "javascript:lambda: str => +(require('uuid').validate(str))"
35 | prim__validate : String -> Int
37 | assert_gc'ed : AnyPtr -> GCAnyPtr
38 | assert_gc'ed = believe_me
40 | allocByteArray : IO GCAnyPtr
42 | ptr <- primIO $
prim__Uint8Array 16
43 | pure $
assert_gc'ed ptr
45 | unparse' : UUID -> String
46 | unparse' uuid = unsafePerformIO $
primIO $
prim__stringify uuid.ptr
48 | export Eq UUID where (==) = (==) `on` unparse'
49 | export Ord UUID where compare = compare `on` unparse'
51 | toByteArray : Vect 16 Bits8 -> GCAnyPtr
52 | toByteArray bytes = unsafePerformIO $
do
53 | uuid <- allocByteArray
54 | traverse_ (\(i, x) => primIO $
prim__Uint8ArraySetByte uuid (cast i) x) $
enumerate bytes
59 | toBytes uuid = map (prim__Uint8ArrayAtByte uuid.ptr . cast) (range 16)
62 | uuid <- allocByteArray
63 | uuid <- primIO $
prim__v1 uuid
64 | pure (MkUUID $
assert_gc'ed uuid, True)
66 | uuid3 ns name = unsafePerformIO $
do
67 | uuid <- allocByteArray
68 | uuid <- primIO $
prim__v3 name (toByteArray ns) uuid
69 | pure $
MkUUID $
assert_gc'ed uuid
72 | uuid <- allocByteArray
73 | uuid <- primIO $
prim__v4 uuid
74 | pure $
MkUUID $
assert_gc'ed uuid
76 | uuid5 ns name = unsafePerformIO $
do
77 | uuid <- allocByteArray
78 | uuid <- primIO $
prim__v5 name (toByteArray ns) uuid
79 | pure $
MkUUID $
assert_gc'ed uuid
82 | let ok = prim__validate str == 1 in
83 | if not ok then Nothing else Just $
unsafePerformIO $
do
84 | uuid <- primIO $
prim__parse str
85 | pure $
MkUUID $
assert_gc'ed uuid