git.iko.soy/purescript-intl
on 2df977c help sign in
9 files changed+198−393
since splitsnapshots
unifiedsplit
.travis.yml+3 bower.json+1−1 src/Data/Intl/DateTimeFormat.js+6−6 src/Data/Intl/DateTimeFormat.purs+122−131 src/Data/Intl/DateTimeFormat/Class.purs−41 src/Data/Intl/DateTimeFormat/Generic.purs+39−5 src/Data/Intl/DateTimeFormat/Types.js−3 src/Data/Intl/DateTimeFormat/Types.purs+3−161 test/Test/Main.purs+24−45
.travis.yml+3
@@ -4,6 +4,9 @@ sudo: required
44node_js: stable
55env:
66 - PATH=$HOME/purescript:$PATH
7+cache:
8+ - directories:
9+ - $HOME/purescript
710install:
811 - TAG=$(wget -q -O - https://github.com/purescript/purescript/releases/latest --server-response --max-redirect 0 2>&1 | sed -n -e 's/.*Location:.*tag\///p')
912 - wget -O $HOME/purescript.tar.gz https://github.com/purescript/purescript/releases/download/$TAG/linux64.tar.gz
bower.json+1−1
@@ -9,7 +9,7 @@
99 "license": "MPL-2.0",
1010 "repository": {
1111 "type": "git",
12− "url": "git://github.com/coot/purescript-intl.git"
12+ "url": "git://github.com/purescript/purescript-prelude.git"
1313 },
1414 "dependencies": {
1515 "purescript-prelude": "^3.0.0",
src/Data/Intl/DateTimeFormat.js+6−6
@@ -1,17 +1,17 @@
11"use strict";
22
3+exports["undefined"] = undefined;
4+
35exports.dateTimeFormatImpl = function(locales) {
46 return function(options) {
57 return new Intl.DateTimeFormat(locales, options);
68 };
79};
810
9−exports.createDateTimeFormatImpl = function(throwError, pure, locales, opts) {
10− try {
11− return pure(Intl.DateTimeFormat(locales, opts));
12− } catch (e) {
13− return throwError(e.message);
14− }
11+exports.createDateTimeFormatterImpl = function(locales) {
12+ return function(opts) {
13+ return Intl.DateTimeFormat(locales, opts);
14+ };
1515};
1616
1717exports.formatJSDate = function(formatter) {
src/Data/Intl/DateTimeFormat.purs+122−131
@@ -1,13 +1,22 @@
1−module Data.Intl.DateTimeFormat
1+module Data.Intl.DateTimeFormat
22 ( LocalesOption
33 , LocaleMatcher(..)
44 , TimeZone(..)
55 , FormatMatcher(..)
6+ , WeekdayYearMonthDayHourMinuteSecond(..)
7+ , WeekdayYearMonthDay(..)
8+ , YearMonthDay(..)
9+ , YearMonth(..)
10+ , MonthDay(..)
11+ , HourMinuteSecond(..)
12+ , HourMinute(..)
13+ , Undefined
14+ , undefined
615 , DateTimeFormatOptions(..)
716 , DateTimeFormatOptions'
817 , DateTimeComponents(..)
9− , DateTimeFormat
10− , createDateTimeFormat
18+ , DateTimeFormatter
19+ , createDateTimeFormatter
1120 , formatJSDate
1221 , module Data.Intl.DateTimeFormat.Types
1322 , supportedLocalesOf
@@ -17,23 +26,27 @@ module Data.Intl.DateTimeFormat
1726
1827import Data.Intl.DateTimeFormat.Types
1928
20−import Control.Monad.Error.Class (throwError)
2129import Data.Either (Either(..))
22−import Data.Foreign (F, Foreign, ForeignError(..), isUndefined, readString)
30+import Data.Foreign (F, Foreign, isUndefined, readString)
2331import Data.Foreign.Index ((!))
24−import Data.Function.Uncurried (Fn3, Fn4, runFn3, runFn4)
25−import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(FormatComponentRecord), formatComponent)
32+import Data.Function.Uncurried (Fn3, runFn3)
33+import Data.Generic.Rep (class Generic)
34+import Data.Intl.DateTimeFormat.Generic (class FormatComponent, defaultComponentRecord, formatComponent, genericFormatComponent)
2635import Data.JSDate (JSDate)
2736import Data.Maybe (Maybe(..), fromMaybe, maybe)
28−import Data.Newtype (class Newtype, un)
37+import Data.Newtype (class Newtype)
2938import Data.StrMap (union)
3039import Data.Symbol (SProxy(..))
3140import Data.Traversable (sequence)
32−import Data.Variant (Variant, case_, default, on)
33−import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (<<<), (>>=))
41+import Data.Variant (Variant, default, on)
42+import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (>>=))
3443import Unsafe.Coerce (unsafeCoerce)
3544
3645foreign import data LocalesOption' :: Type
46+foreign import data DateTimeFormat :: Type
47+
48+foreign import data Undefined :: Type
49+foreign import undefined :: Undefined
3750
3851foreign import dateTimeFormatImpl :: LocalesOption' -> DateTimeFormatOptions_ -> DateTimeFormat
3952
@@ -86,6 +99,85 @@ instance showFormatMatcher :: Show FormatMatcher where
8699 show FMBasic = "basic"
87100 show FMBestFit = "best fit"
88101
102+newtype WeekdayYearMonthDayHourMinuteSecond = WeekdayYearMonthDayHourMinuteSecond
103+ { weekday :: StringRep
104+ , year :: NumericRep
105+ , month :: MonthRep
106+ , day :: NumericRep
107+ , hour :: NumericRep
108+ , minute :: NumericRep
109+ , second :: NumericRep
110+ }
111+
112+derive instance genericWeekdayYearMonthDayHourMinuteSecond :: Generic WeekdayYearMonthDayHourMinuteSecond _
113+
114+instance formatComponentWeekdayYearMonthDayHourMinuteSecond :: FormatComponent WeekdayYearMonthDayHourMinuteSecond where
115+ formatComponent = genericFormatComponent
116+
117+newtype WeekdayYearMonthDay = WeekdayYearMonthDay
118+ { weekday :: StringRep
119+ , year :: NumericRep
120+ , month :: MonthRep
121+ , day :: NumericRep
122+ }
123+
124+derive instance genericWeekdayYearMonthDay :: Generic WeekdayYearMonthDay _
125+
126+instance formatComponentWeekdayYearMonthDay :: FormatComponent WeekdayYearMonthDay where
127+ formatComponent = genericFormatComponent
128+
129+newtype YearMonthDay = YearMonthDay
130+ { year :: NumericRep
131+ , month :: MonthRep
132+ , day :: NumericRep
133+ }
134+
135+derive instance genericYearMonthDay :: Generic YearMonthDay _
136+
137+instance formatComponentYearMonthDay :: FormatComponent YearMonthDay where
138+ formatComponent = genericFormatComponent
139+
140+newtype YearMonth = YearMonth
141+ { year :: NumericRep
142+ , month :: MonthRep
143+ }
144+
145+derive instance genericYearMonth :: Generic YearMonth _
146+
147+instance formatComponentYearMonth :: FormatComponent YearMonth where
148+ formatComponent = genericFormatComponent
149+
150+newtype MonthDay = MonthDay
151+ { month :: MonthRep
152+ , day :: NumericRep
153+ }
154+
155+derive instance genericMonthDay :: Generic MonthDay _
156+
157+instance formatComponentMonthDay :: FormatComponent MonthDay where
158+ formatComponent = genericFormatComponent
159+
160+newtype HourMinuteSecond = HourMinuteSecond
161+ { hour :: NumericRep
162+ , minute :: NumericRep
163+ , second :: NumericRep
164+ }
165+
166+derive instance genericHourMinuteSecond :: Generic HourMinuteSecond _
167+
168+instance formatComponentHourMinuteSecond :: FormatComponent HourMinuteSecond where
169+ formatComponent = genericFormatComponent
170+
171+newtype HourMinute = HourMinute
172+ { hour :: NumericRep
173+ , minute :: NumericRep
174+ }
175+
176+derive instance genericHourMinute :: Generic HourMinute _
177+
178+instance formatComponentHourMinute :: FormatComponent HourMinute where
179+ formatComponent = genericFormatComponent
180+
89181type DateTimeComponents a =
90182 Variant
91183 ( weekdayYearMonthDayHourMinuteSecond :: WeekdayYearMonthDayHourMinuteSecond
@@ -120,7 +212,7 @@ formatDateTimeOptions (DateTimeFormatOptions opts comps) = merge opts' (compsCoe
120212 , hour12: fromMaybe (unsafeCoerce undefined) opts.hour12
121213 , formatMatcher: maybe undefinedString show opts.formatMatcher
122214 }
123− comps' = un FormatComponentRecord $ case_
215+ comps' = default (defaultComponentRecord)
124216 # on (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond") formatComponent
125217 # on (SProxy :: SProxy "weekdayYearMonthDay") formatComponent
126218 # on (SProxy :: SProxy "yearMonthDay") formatComponent
@@ -186,137 +278,36 @@ formatDateTimeOptions (DateTimeFormatOptions opts comps) = merge opts' (compsCoe
186278 -> DateTimeFormatOptions_
187279 merge a b = unsafeCoerce $ union (unsafeCoerce a) (unsafeCoerce b)
188280
189−foreign import data DateTimeFormat :: Type
281+foreign import data DateTimeFormatter :: Type
190282
191−foreign import createDateTimeFormatImpl
192− :: Fn4
193− (forall a. String -> F a)
194− (forall a. a -> F a)
195− LocalesOption'
196− DateTimeFormatOptions_
197− (F DateTimeFormat)
198−
199−-- | Examples
200−-- | ``` purescript
201−-- | import Data.Variant (inj)
202−-- |
203−-- | fmtHourMinute = F DateTimeFormat
204−-- | fmtHourMinute = createDateTimeFormat locale opts
205−-- | where
206−-- | locale = inj (SProxy :: SProxy "locale") "en-GB"
207−-- | opts = (DateTimeFormatOptions
208−-- | { localeMatcher: Nothing
209−-- | , timeZone: (Just (TimeZone "Europe/London"))
210−-- | , hour12: Just false
211−-- | , formatMatcher: Nothing
212−-- | }
213−-- | (inj (SProxy :: SProxy "hourMinute")
214−-- | (HourMinute {hour: TwoDigit, minute: TwoDigit}))
215−-- |
216−-- |
217−-- | fmtDate :: F DateTimeFormat
218−-- | fmtDate = createDateTimeFormat locale opts
219−-- | wher
220−-- | locale = inj (SProxy :: SProxy "locale") "en-GB"
221−-- | opts :: DateTimeFormatOptions'
222−-- | opts =
223−-- | (DateTimeFormatOptions
224−-- | { localeMatcher: Nothing
225−-- | , timeZone: (Just (TimeZone "Europe/London"))
226−-- | , hour12: Just true
227−-- | , formatMatcher: Nothing
228−-- | }
229−-- | (inj
230−-- | (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond")
231−-- | (WeekdayYearMonthDayHourMinuteSecond
232−-- | { weekday: Short
233−-- | , year: Numeric
234−-- | , month: MonthLong
235−-- | , day: Numeric
236−-- | , hour: Numeric
237−-- | , minute: Numeric
238−-- | , second: Numeric
239−-- | }
240−-- | )
241−-- | )
242−-- | )
243−-- | ```
244−-- | You have predifined types: `WeekdayYearMonthDayHourMinuteSecond`,
245−-- | `WeekdayYearMonthDay`, `YearMonthDay`, `YearMonth`, `MonthDay`,
246−-- | `HourMinuteSecond`, `HourMinute`. But you can also provide your own by
247−-- | implementing `FormatComponent` class (or by deriving it), e.g.
248−-- | ``` purescript
249−-- | newtype EraYear = EraYear
250−-- | { era :: StringRep
251−-- | , year :: NumericRep
252−-- | }
253−-- |
254−-- | derive instance genericEraYear :: Generic EraYear _
255−-- |
256−-- | instance formatComponentEraYear :: FormatComponent EraYear where
257−-- | formatComponent = genericFormatComponent
258−-- |
259−-- | fmtEraYear :: F DateTimeFormat
260−-- | fmtEraYear = createDateTimeFormat locales opts
261−-- | where
262−-- | locale = inj (SProxy :: SProxy "locale") "en-GB"
263−-- | opts :: DateTimeFormatOptions EraYear
264−-- | opts =
265−-- | (DateTimeFormatOptions
266−-- | { localeMatcher: Nothing
267−-- | , timeZone: (Just (TimeZone "Europe/London"))
268−-- | , hour12: Just true
269−-- | , formatMatcher: Nothing
270−-- | }
271−-- | (inj
272−-- | (SProxy :: SProxy "custom")
273−-- | (EraYear
274−-- | { era: Long
275−-- | , year: Numeric
276−-- | }
277−-- | )
278−-- | )
279−-- | )
280−-- | ```
281−createDateTimeFormat
283+foreign import createDateTimeFormatterImpl
284+ :: LocalesOption'
285+ -> DateTimeFormatOptions_
286+ -> DateTimeFormatter
287+
288+createDateTimeFormatter
282289 :: forall a
283290 .(FormatComponent a)
284291 => LocalesOption
285292 -> DateTimeFormatOptions a
286− -> F DateTimeFormat
287−createDateTimeFormat ls opts =
288− runFn4 createDateTimeFormatImpl
289− (throwError <<< pure <<< ForeignError)
290− pure
291− (toLocale ls)
292− (formatDateTimeOptions opts)
293−
294−-- | Examples
295−-- | ``` purescript
296−-- | formatJSDate (either (const "") id $ runExcept fmtHourMinute) date -- "12:00"
297−-- | formatJSDate (either (const "") id $ fmtDate) date -- "Tue, January 2, 2018, 12:00:00 PM"
298−-- | formatJSDate (either (const "") id $ fmtEraYear) date -- "2018 Anno Domini"
299−-- | ```
300−foreign import formatJSDate :: DateTimeFormat -> JSDate -> String
301−
302−foreign import supportedLocalesOfImpl
303− :: Fn3
304− (String -> Either String (Array String))
305− (Array String -> Either String (Array String))
306− (Array String)
307− (Either String (Array String))
308−
309−foreign import formatToPartsImpl :: DateTimeFormat -> JSDate -> Array Foreign
310−
311−formatToParts :: DateTimeFormat -> JSDate -> F (Array FormatParts)
293+ -> DateTimeFormatter
294+createDateTimeFormatter ls opts = createDateTimeFormatterImpl (toLocale ls) (formatDateTimeOptions opts)
295+
296+foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
297+
298+foreign import supportedLocalesOfImpl :: Fn3 (String -> Either String (Array String)) (Array String -> Either String (Array String)) (Array String) (Either String (Array String))
299+
300+foreign import formatToPartsImpl :: DateTimeFormatter -> JSDate -> Array Foreign
301+
302+formatToParts :: DateTimeFormatter -> JSDate -> F (Array FormatParts)
312303formatToParts formatter date = sequence $ readFormatParts <$> formatToPartsImpl formatter date
313304
314305supportedLocalesOf :: Array String -> Either String (Array String)
315306supportedLocalesOf locales = runFn3 supportedLocalesOfImpl Left Right locales
316307
317−foreign import resolvedOptionsImpl :: DateTimeFormat -> Foreign
308+foreign import resolvedOptionsImpl :: DateTimeFormatter -> Foreign
318309
319−resolvedOptions :: DateTimeFormat -> F ResolvedOptions
310+resolvedOptions :: DateTimeFormatter -> F ResolvedOptions
320311resolvedOptions fmt = do
321312 locale <- obj ! "locale" >>= readString
322313 calendar <- obj ! "calendar" >>= readString
src/Data/Intl/DateTimeFormat/Class.pursdeleted−41
@@ -1,41 +0,0 @@
1−module Data.Intl.DateTimeFormat.Class where
2−
3−import Data.Maybe (Maybe(..))
4−import Data.Newtype (class Newtype)
5−import Prelude (class Eq, Unit)
6−
7−newtype FormatComponentRecord = FormatComponentRecord
8− { era :: Maybe String
9− , weekday :: Maybe String
10− , year :: Maybe String
11− , month :: Maybe String
12− , day :: Maybe String
13− , hour :: Maybe String
14− , minute :: Maybe String
15− , second :: Maybe String
16− , timeZoneName :: Maybe String
17− }
18−
19−derive instance newtypeFormatComponentRecord :: Newtype FormatComponentRecord _
20−
21−derive instance eqFormatComponentRecord :: Eq FormatComponentRecord
22−
23−defaultComponentRecord :: FormatComponentRecord
24−defaultComponentRecord = FormatComponentRecord
25− { era: Nothing
26− , weekday: Nothing
27− , year: Nothing
28− , month: Nothing
29− , day: Nothing
30− , hour: Nothing
31− , minute: Nothing
32− , second: Nothing
33− , timeZoneName: Nothing
34− }
35−
36−
37−class FormatComponent a where
38− formatComponent :: a -> FormatComponentRecord
39−
40−instance unitFormatComponent :: FormatComponent Unit where
41− formatComponent _ = defaultComponentRecord
src/Data/Intl/DateTimeFormat/Generic.purs+39−5
@@ -1,17 +1,51 @@
11module Data.Intl.DateTimeFormat.Generic
2− ( class GenericFormatComponent
2+ ( class FormatComponent
3+ , formatComponent
4+ , class GenericFormatComponent
35 , genericFormatComponent'
46 , genericFormatComponent
57 , class GenericFormatComponentFields
68 , genericFormatComponentFields
9+ , defaultComponentRecord
10+ , FormatComponentRecord
711 ) where
812
913import Data.Generic.Rep (class Generic, Constructor(Constructor), Field(..), NoConstructors, Product(..), Rec(..), from)
10−import Data.Intl.DateTimeFormat.Class (FormatComponentRecord(..))
1114import Data.Intl.DateTimeFormat.Types (MonthRep, NumericRep, TimeZoneNameRep, StringRep)
1215import Data.Maybe (Maybe(..))
1316import Data.StrMap (StrMap, lookup, singleton, union)
14−import Prelude (show)
17+import Prelude (Unit, show)
18+
19+type FormatComponentRecord =
20+ { era :: Maybe String
21+ , weekday :: Maybe String
22+ , year :: Maybe String
23+ , month :: Maybe String
24+ , day :: Maybe String
25+ , hour :: Maybe String
26+ , minute :: Maybe String
27+ , second :: Maybe String
28+ , timeZoneName :: Maybe String
29+ }
30+
31+defaultComponentRecord :: FormatComponentRecord
32+defaultComponentRecord =
33+ { era: Nothing
34+ , weekday: Nothing
35+ , year: Nothing
36+ , month: Nothing
37+ , day: Nothing
38+ , hour: Nothing
39+ , minute: Nothing
40+ , second: Nothing
41+ , timeZoneName: Nothing
42+ }
43+
44+class FormatComponent a where
45+ formatComponent :: a -> FormatComponentRecord
46+
47+instance unitFormatComponent :: FormatComponent Unit where
48+ formatComponent _ = defaultComponentRecord
1549
1650class GenericFormatComponent a where
1751 genericFormatComponent' :: a -> FormatComponentRecord
@@ -20,7 +54,7 @@ class GenericFormatComponentFields a where
2054 genericFormatComponentFields :: a -> StrMap String
2155
2256instance genericFormatComponentNoConsturctors :: GenericFormatComponent NoConstructors where
23− genericFormatComponent' a = FormatComponentRecord
57+ genericFormatComponent' a =
2458 { era: Nothing
2559 , weekday: Nothing
2660 , year: Nothing
@@ -80,7 +114,7 @@ instance genericFormatComponentFieldsProduct
80114instance genericFormatComponentRec
81115 :: (GenericFormatComponentFields a)
82116 => GenericFormatComponent (Rec a) where
83− genericFormatComponent' (Rec a) = FormatComponentRecord
117+ genericFormatComponent' (Rec a) =
84118 { era: "era" `lookup` u
85119 , weekday: "weekday" `lookup` u
86120 , year: "year" `lookup` u
src/Data/Intl/DateTimeFormat/Types.jsdeleted−3
@@ -1,3 +0,0 @@
1−"use strict";
2−
3−exports["undefined"] = undefined;
src/Data/Intl/DateTimeFormat/Types.purs+3−161
@@ -6,32 +6,16 @@ module Data.Intl.DateTimeFormat.Types
66 , FormatParts(..)
77 , readFormatParts
88 , ResolvedOptions(..)
9− , WeekdayYearMonthDayHourMinuteSecond(..)
10− , WeekdayYearMonthDay(..)
11− , YearMonthDay(..)
12− , YearMonth(..)
13− , MonthDay(..)
14− , HourMinuteSecond(..)
15− , HourMinute(..)
16− , Undefined
17− , undefined
189 ) where
1910
2011import Data.Foreign (F, Foreign, ForeignError(..), fail, readString)
2112import Data.Foreign.Index ((!))
22−import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(..), defaultComponentRecord)
23−import Data.Maybe (Maybe(..))
24−import Data.Newtype (class Newtype, over)
25−import Prelude (class Eq, class Show, bind, pure, show, ($), (<>), (>>=))
26−
27−foreign import data Undefined :: Type
28−
29−foreign import undefined :: Undefined
13+import Data.Maybe (Maybe)
14+import Data.Newtype (class Newtype)
15+import Prelude (class Show, bind, pure, ($), (<>), (>>=))
3016
3117data StringRep = Narrow | Short | Long
3218
33−derive instance eqStringRep :: Eq StringRep
34−
3519instance showStringRep :: Show StringRep where
3620 show Narrow = "narrow"
3721 show Short = "short"
@@ -39,16 +23,12 @@ instance showStringRep :: Show StringRep where
3923
4024data NumericRep = Numeric | TwoDigit
4125
42−derive instance eqNumericRep :: Eq NumericRep
43−
4426instance showNumericRep :: Show NumericRep where
4527 show Numeric = "numeric"
4628 show TwoDigit = "2-digit"
4729
4830data MonthRep = MonthNumeric | MonthTwoDigit | MonthNarrow | MonthShort | MonthLong
4931
50−derive instance eqMonthRep :: Eq MonthRep
51−
5232instance showMonthRep :: Show MonthRep where
5333 show MonthNumeric = "numeric"
5434 show MonthTwoDigit = "2-digit"
@@ -58,8 +38,6 @@ instance showMonthRep :: Show MonthRep where
5838
5939data TimeZoneNameRep = TimeZoneNameShort | TimeZoneNameLong
6040
61−derive instance eqTimeZoneNameRep :: Eq TimeZoneNameRep
62−
6341instance showTimeZoneRep :: Show TimeZoneNameRep where
6442 show TimeZoneNameShort = "short"
6543 show TimeZoneNameLong = "long"
@@ -75,8 +53,6 @@ data FormatParts
7553 | DayPeriod String
7654 | Literal String
7755
78−derive instance eqFormatParts :: Eq FormatParts
79−
8056readFormatParts :: Foreign -> F FormatParts
8157readFormatParts val = do
8258 type_ <- val ! "type" >>= readString
@@ -110,137 +86,3 @@ newtype ResolvedOptions = ResolvedOptions
11086 }
11187
11288derive instance newtypeResolvedOptions :: Newtype ResolvedOptions _
113−
114−derive instance eqResolvedOptions :: Eq ResolvedOptions
115−
116−newtype WeekdayYearMonthDayHourMinuteSecond = WeekdayYearMonthDayHourMinuteSecond
117− { weekday :: StringRep
118− , year :: NumericRep
119− , month :: MonthRep
120− , day :: NumericRep
121− , hour :: NumericRep
122− , minute :: NumericRep
123− , second :: NumericRep
124− }
125−
126−derive instance newtypeWeekdayYearMonthDayHourMinuteSecond :: Newtype WeekdayYearMonthDayHourMinuteSecond _
127−
128−derive instance eqWeekdayYearMonthDayHourMinuteSecond :: Eq WeekdayYearMonthDayHourMinuteSecond
129−
130−instance formatComponentWeekdayYearMonthDayHourMinuteSecond :: FormatComponent WeekdayYearMonthDayHourMinuteSecond where
131− formatComponent (WeekdayYearMonthDayHourMinuteSecond { weekday, year, month, day, hour, minute, second }) = over FormatComponentRecord
132− (\r -> r { weekday = Just (show weekday)
133− , year = Just (show year)
134− , month = Just (show month)
135− , day = Just (show day)
136− , hour = Just (show hour)
137− , minute = Just (show minute)
138− , second = Just (show second)
139− }
140− ) defaultComponentRecord
141−
142−newtype WeekdayYearMonthDay = WeekdayYearMonthDay
143− { weekday :: StringRep
144− , year :: NumericRep
145− , month :: MonthRep
146− , day :: NumericRep
147− }
148−
149−derive instance newtypeWeekdayYearMonthDay :: Newtype WeekdayYearMonthDay _
150−
151−derive instance eqWeekdayYearMonthDay :: Eq WeekdayYearMonthDay
152−
153−instance formatComponentWeekdayYearMonthDay :: FormatComponent WeekdayYearMonthDay where
154− formatComponent (WeekdayYearMonthDay { weekday, year, month, day }) = over FormatComponentRecord
155− (\r -> r { weekday = Just (show weekday)
156− , year = Just (show year)
157− , month = Just (show month)
158− , day = Just (show day)
159− }
160− ) defaultComponentRecord
161−
162−
163−newtype YearMonthDay = YearMonthDay
164− { year :: NumericRep
165− , month :: MonthRep
166− , day :: NumericRep
167− }
168−
169−derive instance newtypeYearMonthDay :: Newtype YearMonthDay _
170−
171−derive instance eqYearMonthDay :: Eq YearMonthDay
172−
173−instance formatComponentYearMonthDay :: FormatComponent YearMonthDay where
174− formatComponent (YearMonthDay { year, month, day }) = over FormatComponentRecord
175− (\r -> r { year = Just (show year)
176− , month = Just (show month)
177− , day = Just (show day)
178− }
179− ) defaultComponentRecord
180−
181−
182−newtype YearMonth = YearMonth
183− { year :: NumericRep
184− , month :: MonthRep
185− }
186−
187−derive instance newtypeYearMonth :: Newtype YearMonth _
188−
189−derive instance eqYearMonth :: Eq YearMonth
190−
191−instance formatComponentYearMonth :: FormatComponent YearMonth where
192− formatComponent (YearMonth { year, month }) = over FormatComponentRecord
193− (\r -> r { year = Just (show year)
194− , month = Just (show month)
195− }
196− ) defaultComponentRecord
197−
198−newtype MonthDay = MonthDay
199− { month :: MonthRep
200− , day :: NumericRep
201− }
202−
203−derive instance newtypeMonthDay :: Newtype MonthDay _
204−
205−derive instance eqMonthDay :: Eq MonthDay
206−
207−instance formatComponentMonthDay :: FormatComponent MonthDay where
208− formatComponent (MonthDay { month, day }) = over FormatComponentRecord
209− (\r -> r { month = Just (show month)
210− , day = Just (show day)
211− }
212− ) defaultComponentRecord
213−
214−newtype HourMinuteSecond = HourMinuteSecond
215− { hour :: NumericRep
216− , minute :: NumericRep
217− , second :: NumericRep
218− }
219−
220−derive instance newtypeHourMinuteSecond :: Newtype HourMinuteSecond _
221−
222−derive instance eqHourMinuteSecond :: Eq HourMinuteSecond
223−
224−instance formatComponentHourMinuteSecond :: FormatComponent HourMinuteSecond where
225− formatComponent (HourMinuteSecond { hour, minute, second }) = over FormatComponentRecord
226− (\r -> r { hour = Just (show hour)
227− , minute = Just (show minute)
228− , second = Just (show second)
229− }
230− ) defaultComponentRecord
231−
232−newtype HourMinute = HourMinute
233− { hour :: NumericRep
234− , minute :: NumericRep
235− }
236−
237−derive instance newtypeHourMinute :: Newtype HourMinute _
238−
239−derive instance eqHourMinute :: Eq HourMinute
240−
241−instance formatComponentHourMinute :: FormatComponent HourMinute where
242− formatComponent (HourMinute { hour, minute }) = over FormatComponentRecord
243− (\r -> r { hour = Just (show hour)
244− , minute = Just (show minute)
245− }
246− ) defaultComponentRecord
test/Test/Main.purs+24−45
@@ -6,20 +6,19 @@ import Control.Monad.Eff (Eff)
66import Control.Monad.Eff.Console (CONSOLE)
77import Control.Monad.Except (runExcept)
88import Data.DateTime (Date, DateTime(..), Month(..), canonicalDate)
9−import Data.Either (Either(..), fromRight, isLeft)
9+import Data.Either (Either(..), isLeft)
1010import Data.Enum (toEnum)
1111import Data.Foldable (intercalate)
12−import Data.Foreign (F, renderForeignError)
12+import Data.Foreign (renderForeignError)
1313import Data.Generic.Rep (class Generic)
14−import Data.Intl.DateTimeFormat (DateTimeFormatOptions(DateTimeFormatOptions), DateTimeFormatOptions', HourMinute(HourMinute), HourMinuteSecond(HourMinuteSecond), LocalesOption, MonthDay(MonthDay), MonthRep(MonthTwoDigit, MonthNumeric, MonthNarrow, MonthShort, MonthLong), NumericRep(Numeric, TwoDigit), ResolvedOptions(..), StringRep(Short, Long), TimeZone(TimeZone), WeekdayYearMonthDay(WeekdayYearMonthDay), WeekdayYearMonthDayHourMinuteSecond(WeekdayYearMonthDayHourMinuteSecond), YearMonth(YearMonth), YearMonthDay(YearMonthDay), createDateTimeFormat, formatJSDate, resolvedOptions, supportedLocalesOf)
15−import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(..))
16−import Data.Intl.DateTimeFormat.Generic (genericFormatComponent)
14+import Data.Intl.DateTimeFormat (DateTimeFormatOptions(DateTimeFormatOptions), DateTimeFormatOptions', HourMinute(HourMinute), HourMinuteSecond(HourMinuteSecond), LocalesOption, MonthDay(MonthDay), MonthRep(MonthTwoDigit, MonthNumeric, MonthNarrow, MonthShort, MonthLong), NumericRep(Numeric, TwoDigit), ResolvedOptions(..), StringRep(Short, Long), TimeZone(TimeZone), WeekdayYearMonthDay(WeekdayYearMonthDay), WeekdayYearMonthDayHourMinuteSecond(WeekdayYearMonthDayHourMinuteSecond), YearMonth(YearMonth), YearMonthDay(YearMonthDay), createDateTimeFormatter, formatJSDate, resolvedOptions, supportedLocalesOf)
15+import Data.Intl.DateTimeFormat.Generic (class FormatComponent, genericFormatComponent)
1716import Data.JSDate (JSDate, fromDateTime)
1817import Data.Maybe (Maybe(..), isJust, isNothing)
1918import Data.Symbol (SProxy(..))
2019import Data.Time (Time(..))
2120import Data.Variant (inj)
22−import Partial.Unsafe (unsafeCrashWith, unsafePartial)
21+import Partial.Unsafe (unsafeCrashWith)
2322import Test.Assert (ASSERT, assert')
2423
2524type Tests = Eff (console :: CONSOLE, assert :: ASSERT) Unit
@@ -37,7 +36,7 @@ instance formatComponentEraYear :: FormatComponent EraYear where
3736newtype Era = Era StringRep
3837
3938instance formatComponentEra :: FormatComponent Era where
40− formatComponent (Era r) = FormatComponentRecord
39+ formatComponent (Era r) =
4140 { era: Just (show r)
4241 , weekday: Nothing
4342 , year: Nothing
@@ -53,14 +52,11 @@ main :: Tests
5352main = do
5453 let
5554
56− unsafeFromF :: forall a. F a -> a
57− unsafeFromF = unsafePartial fromRight <<< runExcept
58−
5955 locales :: LocalesOption
6056 locales = inj (SProxy :: SProxy "locale") "en-US"
6157
62− fmtError =
63− createDateTimeFormat (inj (SProxy :: SProxy "locale") "") opts
58+ fmtHourMinute =
59+ createDateTimeFormatter locales opts
6460 where
6561 opts :: DateTimeFormatOptions'
6662 opts =
@@ -73,22 +69,8 @@ main = do
7369 (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
7470 )
7571
76− fmtHourMinute = unsafeFromF $
77− createDateTimeFormat locales opts
78− where
79− opts :: DateTimeFormatOptions'
80− opts =
81− (DateTimeFormatOptions
82− { localeMatcher: Nothing
83− , timeZone: (Just (TimeZone "Europe/London"))
84− , hour12: Just false
85− , formatMatcher: Nothing
86− }
87− (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
88− )
89−
90− fmtHourMinuteSecond = unsafeFromF $
91− createDateTimeFormat locales opts
72+ fmtHourMinuteSecond =
73+ createDateTimeFormatter locales opts
9274 where
9375 opts :: DateTimeFormatOptions'
9476 opts =
@@ -101,8 +83,8 @@ main = do
10183 (inj (SProxy :: SProxy "hourMinuteSecond") (HourMinuteSecond {hour: Numeric, minute: Numeric, second: Numeric}))
10284 )
10385
104− fmtWeekdayYearMonthDayHourMinuteSecond = unsafeFromF $
105− createDateTimeFormat locales opts
86+ fmtWeekdayYearMonthDayHourMinuteSecond =
87+ createDateTimeFormatter locales opts
10688 where
10789 opts :: DateTimeFormatOptions'
10890 opts =
@@ -127,8 +109,8 @@ main = do
127109 )
128110 )
129111
130− fmtWeekdayYearMonthDay = unsafeFromF $
131− createDateTimeFormat locales opts
112+ fmtWeekdayYearMonthDay =
113+ createDateTimeFormatter locales opts
132114 where
133115 opts :: DateTimeFormatOptions'
134116 opts =
@@ -150,8 +132,8 @@ main = do
150132 )
151133 )
152134
153− fmtYearMonthDay = unsafeFromF $
154− createDateTimeFormat locales opts
135+ fmtYearMonthDay =
136+ createDateTimeFormatter locales opts
155137 where
156138 opts :: DateTimeFormatOptions'
157139 opts =
@@ -172,8 +154,8 @@ main = do
172154 )
173155 )
174156
175− fmtYearMonth = unsafeFromF $
176− createDateTimeFormat locales opts
157+ fmtYearMonth =
158+ createDateTimeFormatter locales opts
177159 where
178160 opts :: DateTimeFormatOptions'
179161 opts =
@@ -193,8 +175,8 @@ main = do
193175 )
194176 )
195177
196− fmtMonthDay = unsafeFromF $
197− createDateTimeFormat locales opts
178+ fmtMonthDay =
179+ createDateTimeFormatter locales opts
198180 where
199181 opts :: DateTimeFormatOptions'
200182 opts =
@@ -214,8 +196,8 @@ main = do
214196 )
215197 )
216198
217− fmtEraYear = unsafeFromF $
218− createDateTimeFormat locales opts
199+ fmtEraYear =
200+ createDateTimeFormatter locales opts
219201 where
220202 opts :: DateTimeFormatOptions EraYear
221203 opts =
@@ -235,8 +217,8 @@ main = do
235217 )
236218 )
237219
238− fmtEra = unsafeFromF $
239− createDateTimeFormat locales opts
220+ fmtEra =
221+ createDateTimeFormatter locales opts
240222 where
241223 opts :: DateTimeFormatOptions Era
242224 opts =
@@ -280,9 +262,6 @@ main = do
280262 case jsDate of
281263 Nothing -> unsafeCrashWith "jsDate not parsed"
282264 Just d -> do
283−
284− assert' "fmtError expected to return error" $ isLeft (runExcept fmtError)
285−
286265 let fmtDate1 = formatJSDate fmtWeekdayYearMonthDayHourMinuteSecond d
287266 fmtDate1Expected = "Tue, January 2, 2018, 12:00:00 PM"
288267 assert' ("fmtWeekdayYearMonthDayHourMinuteSecond: got: '" <> fmtDate1 <> "' expected: '" <> fmtDate1Expected <> "'")