git.iko.soy/purescript-intl
on master help sign in
createDateTimeFormatter - use F monad
b9e6360Marcin Szamotulski
src/Data/Intl/DateTimeFormat.js+3−3
@@ -8,11 +8,11 @@ exports.dateTimeFormatImpl = function(locales) {
8 };
8 };
9};
9};
10
10
11−exports.createDateTimeFormatterImpl = function(Left, Right, locales, opts) {
11+exports.createDateTimeFormatterImpl = function(throwError, pure, locales, opts) {
12 try {
12 try {
13− return Right(Intl.DateTimeFormat(locales, opts));
13+ return pure(Intl.DateTimeFormat(locales, opts));
14 } catch (e) {
14 } catch (e) {
15− return Left(e.message);
15+ return throwError(e.message);
16 }
16 }
17};
17};
18
18
src/Data/Intl/DateTimeFormat.purs+13−7
@@ -26,8 +26,9 @@ module Data.Intl.DateTimeFormat
26
26
27import Data.Intl.DateTimeFormat.Types
27import Data.Intl.DateTimeFormat.Types
28
28
29+import Control.Monad.Error.Class (throwError)
29import Data.Either (Either(..))
30import Data.Either (Either(..))
30−import Data.Foreign (F, Foreign, isUndefined, readString)
31+import Data.Foreign (F, Foreign, ForeignError(..), isUndefined, readString)
31import Data.Foreign.Index ((!))
32import Data.Foreign.Index ((!))
32import Data.Function.Uncurried (Fn3, Fn4, runFn3, runFn4)
33import Data.Function.Uncurried (Fn3, Fn4, runFn3, runFn4)
33import Data.Generic.Rep (class Generic)
34import Data.Generic.Rep (class Generic)
@@ -39,7 +40,7 @@ import Data.StrMap (union)
39import Data.Symbol (SProxy(..))
40import Data.Symbol (SProxy(..))
40import Data.Traversable (sequence)
41import Data.Traversable (sequence)
41import Data.Variant (Variant, default, on)
42import Data.Variant (Variant, default, on)
42−import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (>>=))
43+import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (<<<), (>>=))
43import Unsafe.Coerce (unsafeCoerce)
44import Unsafe.Coerce (unsafeCoerce)
44
45
45foreign import data LocalesOption' :: Type
46foreign import data LocalesOption' :: Type
@@ -282,19 +283,24 @@ foreign import data DateTimeFormatter :: Type
282
283
283foreign import createDateTimeFormatterImpl
284foreign import createDateTimeFormatterImpl
284 :: Fn4
285 :: Fn4
285− (String -> Either String DateTimeFormatter)
286+ (forall a. String -> F a)
286− (DateTimeFormatter -> Either String DateTimeFormatter)
287+ (forall a. a -> F a)
287 LocalesOption'
288 LocalesOption'
288 DateTimeFormatOptions_
289 DateTimeFormatOptions_
289− (Either String DateTimeFormatter)
290+ (F DateTimeFormatter)
290
291
291createDateTimeFormatter
292createDateTimeFormatter
292 :: forall a
293 :: forall a
293 .(FormatComponent a)
294 .(FormatComponent a)
294 => LocalesOption
295 => LocalesOption
295 -> DateTimeFormatOptions a
296 -> DateTimeFormatOptions a
296− -> Either String DateTimeFormatter
297+ -> F DateTimeFormatter
298+createDateTimeFormatter ls opts =
297−createDateTimeFormatter ls opts = runFn4 createDateTimeFormatterImpl Left Right (toLocale ls) (formatDateTimeOptions opts)
299+ runFn4 createDateTimeFormatterImpl
300+ (throwError <<< pure <<< ForeignError)
301+ pure
302+ (toLocale ls)
303+ (formatDateTimeOptions opts)
298
304
299foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
305foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
300
306
test/Test/Main.purs+14−11
@@ -9,7 +9,7 @@ import Data.DateTime (Date, DateTime(..), Month(..), canonicalDate)
9import Data.Either (Either(..), fromRight, isLeft)
9import Data.Either (Either(..), fromRight, isLeft)
10import Data.Enum (toEnum)
10import Data.Enum (toEnum)
11import Data.Foldable (intercalate)
11import Data.Foldable (intercalate)
12−import Data.Foreign (renderForeignError)
12+import Data.Foreign (F, renderForeignError)
13import Data.Generic.Rep (class Generic)
13import Data.Generic.Rep (class Generic)
14import 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)
14import 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)
15import Data.Intl.DateTimeFormat.Generic (class FormatComponent, genericFormatComponent)
15import Data.Intl.DateTimeFormat.Generic (class FormatComponent, genericFormatComponent)
@@ -52,6 +52,9 @@ main :: Tests
52main = do
52main = do
53 let
53 let
54
54
55+ unsafeFromF :: forall a. F a -> a
56+ unsafeFromF = unsafePartial fromRight <<< runExcept
57+
55 locales :: LocalesOption
58 locales :: LocalesOption
56 locales = inj (SProxy :: SProxy "locale") "en-US"
59 locales = inj (SProxy :: SProxy "locale") "en-US"
57
60
@@ -69,7 +72,7 @@ main = do
69 (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
72 (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
70 )
73 )
71
74
72− fmtHourMinute = unsafePartial $ fromRight $
75+ fmtHourMinute = unsafeFromF $
73 createDateTimeFormatter locales opts
76 createDateTimeFormatter locales opts
74 where
77 where
75 opts :: DateTimeFormatOptions'
78 opts :: DateTimeFormatOptions'
@@ -83,7 +86,7 @@ main = do
83 (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
86 (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
84 )
87 )
85
88
86− fmtHourMinuteSecond = unsafePartial $ fromRight $
89+ fmtHourMinuteSecond = unsafeFromF $
87 createDateTimeFormatter locales opts
90 createDateTimeFormatter locales opts
88 where
91 where
89 opts :: DateTimeFormatOptions'
92 opts :: DateTimeFormatOptions'
@@ -97,7 +100,7 @@ main = do
97 (inj (SProxy :: SProxy "hourMinuteSecond") (HourMinuteSecond {hour: Numeric, minute: Numeric, second: Numeric}))
100 (inj (SProxy :: SProxy "hourMinuteSecond") (HourMinuteSecond {hour: Numeric, minute: Numeric, second: Numeric}))
98 )
101 )
99
102
100− fmtWeekdayYearMonthDayHourMinuteSecond = unsafePartial $ fromRight $
103+ fmtWeekdayYearMonthDayHourMinuteSecond = unsafeFromF $
101 createDateTimeFormatter locales opts
104 createDateTimeFormatter locales opts
102 where
105 where
103 opts :: DateTimeFormatOptions'
106 opts :: DateTimeFormatOptions'
@@ -123,7 +126,7 @@ main = do
123 )
126 )
124 )
127 )
125
128
126− fmtWeekdayYearMonthDay = unsafePartial $ fromRight $
129+ fmtWeekdayYearMonthDay = unsafeFromF $
127 createDateTimeFormatter locales opts
130 createDateTimeFormatter locales opts
128 where
131 where
129 opts :: DateTimeFormatOptions'
132 opts :: DateTimeFormatOptions'
@@ -146,7 +149,7 @@ main = do
146 )
149 )
147 )
150 )
148
151
149− fmtYearMonthDay = unsafePartial $ fromRight $
152+ fmtYearMonthDay = unsafeFromF $
150 createDateTimeFormatter locales opts
153 createDateTimeFormatter locales opts
151 where
154 where
152 opts :: DateTimeFormatOptions'
155 opts :: DateTimeFormatOptions'
@@ -168,7 +171,7 @@ main = do
168 )
171 )
169 )
172 )
170
173
171− fmtYearMonth = unsafePartial $ fromRight $
174+ fmtYearMonth = unsafeFromF $
172 createDateTimeFormatter locales opts
175 createDateTimeFormatter locales opts
173 where
176 where
174 opts :: DateTimeFormatOptions'
177 opts :: DateTimeFormatOptions'
@@ -189,7 +192,7 @@ main = do
189 )
192 )
190 )
193 )
191
194
192− fmtMonthDay = unsafePartial $ fromRight $
195+ fmtMonthDay = unsafeFromF $
193 createDateTimeFormatter locales opts
196 createDateTimeFormatter locales opts
194 where
197 where
195 opts :: DateTimeFormatOptions'
198 opts :: DateTimeFormatOptions'
@@ -210,7 +213,7 @@ main = do
210 )
213 )
211 )
214 )
212
215
213− fmtEraYear = unsafePartial $ fromRight $
216+ fmtEraYear = unsafeFromF $
214 createDateTimeFormatter locales opts
217 createDateTimeFormatter locales opts
215 where
218 where
216 opts :: DateTimeFormatOptions EraYear
219 opts :: DateTimeFormatOptions EraYear
@@ -231,7 +234,7 @@ main = do
231 )
234 )
232 )
235 )
233
236
234− fmtEra = unsafePartial $ fromRight $
237+ fmtEra = unsafeFromF $
235 createDateTimeFormatter locales opts
238 createDateTimeFormatter locales opts
236 where
239 where
237 opts :: DateTimeFormatOptions Era
240 opts :: DateTimeFormatOptions Era
@@ -277,7 +280,7 @@ main = do
277 Nothing -> unsafeCrashWith "jsDate not parsed"
280 Nothing -> unsafeCrashWith "jsDate not parsed"
278 Just d -> do
281 Just d -> do
279
282
280− assert' "fmtError expected to return error" $ isLeft fmtError
283+ assert' "fmtError expected to return error" $ isLeft (runExcept fmtError)
281
284
282 let fmtDate1 = formatJSDate fmtWeekdayYearMonthDayHourMinuteSecond d
285 let fmtDate1 = formatJSDate fmtWeekdayYearMonthDayHourMinuteSecond d
283 fmtDate1Expected = "Tue, January 2, 2018, 12:00:00 PM"
286 fmtDate1Expected = "Tue, January 2, 2018, 12:00:00 PM"