0 | module IotaTime.Locale.Unix.Platform
 1 |
 2 | import Data.Vect
 3 |
 4 | %default total
 5 |
 6 | %foreign "C:iotatime_unix_locale_snapshot, libiotatime_unix"
 7 | prim__unixLocaleSnapshot : String -> PrimIO AnyPtr
 8 |
 9 | %foreign "C:iotatime_unix_locale_item, libiotatime_unix"
10 | prim__unixLocaleItem : AnyPtr -> Int -> String
11 |
12 | %foreign "C:iotatime_unix_locale_free, libiotatime_unix"
13 | prim__unixLocaleFree : AnyPtr -> PrimIO ()
14 |
15 | export
16 | record UnixLocaleData where
17 |   constructor MkUnixLocaleData
18 |   unixMonthNames : Vect 12 String
19 |   unixMonthNamesShort : Vect 12 String
20 |   unixDayNames : Vect 7 String
21 |   unixDayNamesShort : Vect 7 String
22 |   unixAmName : String
23 |   unixPmName : String
24 |   unixRawDateFormat : String
25 |   unixRawTimeFormat : String
26 |   unixRawDateTimeFormat : String
27 |
28 | export
29 | localeMonthNames : UnixLocaleData -> Vect 12 String
30 | localeMonthNames = unixMonthNames
31 |
32 | export
33 | localeMonthNamesShort : UnixLocaleData -> Vect 12 String
34 | localeMonthNamesShort = unixMonthNamesShort
35 |
36 | export
37 | localeDayNames : UnixLocaleData -> Vect 7 String
38 | localeDayNames = unixDayNames
39 |
40 | export
41 | localeDayNamesShort : UnixLocaleData -> Vect 7 String
42 | localeDayNamesShort = unixDayNamesShort
43 |
44 | export
45 | localeAmName : UnixLocaleData -> String
46 | localeAmName = unixAmName
47 |
48 | export
49 | localePmName : UnixLocaleData -> String
50 | localePmName = unixPmName
51 |
52 | export
53 | localeDateFormat : UnixLocaleData -> String
54 | localeDateFormat = unixRawDateFormat
55 |
56 | export
57 | localeTimeFormat : UnixLocaleData -> String
58 | localeTimeFormat = unixRawTimeFormat
59 |
60 | export
61 | localeDateTimeFormat : UnixLocaleData -> String
62 | localeDateTimeFormat = unixRawDateTimeFormat
63 |
64 | items : (count : Nat) -> Int -> AnyPtr -> Vect count String
65 | items Z offset pointer = []
66 | items (S count) offset pointer =
67 |   prim__unixLocaleItem pointer offset :: items count (offset + 1) pointer
68 |
69 | export
70 | loadUnixLocaleData : String -> IO (Maybe UnixLocaleData)
71 | loadUnixLocaleData name = do
72 |   pointer <- primIO (prim__unixLocaleSnapshot name)
73 |   if prim__nullAnyPtr pointer /= 0
74 |     then pure Nothing
75 |     else do
76 |       let value = MkUnixLocaleData
77 |             (items 12 0 pointer)
78 |             (items 12 12 pointer)
79 |             (items 7 24 pointer)
80 |             (items 7 31 pointer)
81 |             (prim__unixLocaleItem pointer 38)
82 |             (prim__unixLocaleItem pointer 39)
83 |             (prim__unixLocaleItem pointer 40)
84 |             (prim__unixLocaleItem pointer 41)
85 |             (prim__unixLocaleItem pointer 42)
86 |       primIO (prim__unixLocaleFree pointer)
87 |       pure (Just value)