9 | import UUID.Data.Vect
11 | ffi : String -> String
12 | ffi fn = "C:\{fn},libidris2_uuid,idris2_uuid.h"
14 | %foreign (ffi "sizeof_uuid_t")
15 | sizeOfUUID_t : Bits64
17 | %foreign (ffi "uuid_get")
18 | prim__uuidGetByte : GCAnyPtr -> Bits64 -> Bits8
20 | %foreign (ffi "uuid_set")
21 | prim__uuidSetByte : GCAnyPtr -> Bits64 -> Bits8 -> PrimIO ()
23 | %foreign (ffi "idris2_uuid_compare")
24 | prim__uuidCompare : GCAnyPtr -> GCAnyPtr -> Int
26 | %foreign (ffi "idris2_uuid_generate_random")
27 | prim__uuidGenerateRandom : GCAnyPtr -> PrimIO ()
29 | %foreign (ffi "idris2_uuid_generate_time_safe")
30 | prim__uuidGenerateTimeSafe : GCAnyPtr -> PrimIO Int
32 | %foreign (ffi "idris2_uuid_generate_md5")
33 | prim__uuidGenerateMD5 : GCAnyPtr -> GCAnyPtr -> String -> Bits64 -> PrimIO ()
35 | %foreign (ffi "idris2_uuid_generate_sha1")
36 | prim__uuidGenerateSHA1 : GCAnyPtr -> GCAnyPtr -> String -> Bits64 -> PrimIO ()
38 | %foreign (ffi "idris2_uuid_parse")
39 | prim__uuidParse : String -> GCAnyPtr -> PrimIO Int
41 | %foreign (ffi "idris2_uuid_unparse")
42 | prim__uuidUnparse : GCAnyPtr -> PrimIO String
44 | compare' : UUID -> UUID -> Ordering
45 | compare' = flip compare 0 .: prim__uuidCompare `on` ptr
47 | export Eq UUID where x == y = compare' x y == EQ
48 | export Ord UUID where compare = compare'
50 | allocUUID : IO GCAnyPtr
51 | allocUUID = onCollectAny !(malloc $
cast sizeOfUUID_t) free
53 | toByteArray : Vect 16 Bits8 -> GCAnyPtr
54 | toByteArray bytes = unsafePerformIO $
do
56 | traverse_ (\(i, x) => primIO $
prim__uuidSetByte uuid (cast i) x) $
enumerate bytes
61 | toBytes uuid = map (prim__uuidGetByte uuid.ptr . cast) (range 16)
65 | ok <- primIO $
prim__uuidGenerateTimeSafe uuid
66 | pure (MkUUID uuid, ok == 0)
68 | uuid3 ns name = unsafePerformIO $
do
70 | primIO $
prim__uuidGenerateMD5 uuid (toByteArray ns) name (cast $
length name)
75 | primIO $
prim__uuidGenerateRandom uuid
78 | uuid5 ns name = unsafePerformIO $
do
80 | primIO $
prim__uuidGenerateSHA1 uuid (toByteArray ns) name (cast $
length name)
83 | parse str = unsafePerformIO $
do
85 | ok <- primIO $
prim__uuidParse str uuid
86 | pure $
if ok == 0 then Just (MkUUID uuid) else Nothing
88 | unparse uuid = unsafePerformIO $
primIO $
prim__uuidUnparse uuid.ptr