@@ -20,21 +20,26 @@ module Data.Intl.DateTimeFormat
20 , formatJSDate
20 , formatJSDate
21 , module Data.Intl.DateTimeFormat.Types
21 , module Data.Intl.DateTimeFormat.Types
22 , supportedLocalesOf
22 , supportedLocalesOf
25import Data.Intl.DateTimeFormat.Types
27import Data.Intl.DateTimeFormat.Types
27import Data.Either (Either(..))
29import Data.Either (Either(..))
30+import Data.Foreign (F, Foreign, isUndefined, readString)
31+import Data.Foreign.Index ((!))
28import Data.Function.Uncurried (Fn3, runFn3)
32import Data.Function.Uncurried (Fn3, runFn3)
29import Data.Generic.Rep (class Generic)
33import Data.Generic.Rep (class Generic)
30import Data.Intl.DateTimeFormat.Generic (class FormatComponent, defaultComponentRecord, formatComponent, genericFormatComponent)
34import Data.Intl.DateTimeFormat.Generic (class FormatComponent, defaultComponentRecord, formatComponent, genericFormatComponent)
31import Data.JSDate (JSDate)
35import Data.JSDate (JSDate)
32−import Data.Maybe (Maybe, fromMaybe, maybe)
36+import Data.Maybe (Maybe(..), fromMaybe, maybe)
33import Data.Newtype (class Newtype)
37import Data.Newtype (class Newtype)
34import Data.StrMap (union)
38import Data.StrMap (union)
35import Data.Symbol (SProxy(..))
39import Data.Symbol (SProxy(..))
40+import Data.Traversable (sequence)
36import Data.Variant (Variant, default, on)
41import Data.Variant (Variant, default, on)
37−import Prelude (class Eq, class Show, Unit, id, show, (#), ($))
42+import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (>>=))
38import Unsafe.Coerce (unsafeCoerce)
43import Unsafe.Coerce (unsafeCoerce)
40foreign import data LocalesOption' :: Type
45foreign import data LocalesOption' :: Type
@@ -291,6 +296,39 @@ createDateTimeFormatter ls opts = createDateTimeFormatterImpl (toLocale ls) (for
291foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
296foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
293foreign import supportedLocalesOfImpl :: Fn3 (String -> Either String (Array String)) (Array String -> Either String (Array String)) (Array String) (Either String (Array String))
298foreign import supportedLocalesOfImpl :: Fn3 (String -> Either String (Array String)) (Array String -> Either String (Array String)) (Array String) (Either String (Array String))
300+foreign import formatToPartsImpl :: DateTimeFormatter -> JSDate -> Array Foreign
302+formatToParts :: DateTimeFormatter -> JSDate -> F (Array FormatParts)
303+formatToParts formatter date = sequence $ readFormatParts <$> formatToPartsImpl formatter date
295supportedLocalesOf :: Array String -> Either String (Array String)
305supportedLocalesOf :: Array String -> Either String (Array String)
296supportedLocalesOf locales = runFn3 supportedLocalesOfImpl Left Right locales
306supportedLocalesOf locales = runFn3 supportedLocalesOfImpl Left Right locales
308+foreign import resolvedOptionsImpl :: DateTimeFormatter -> Foreign
310+resolvedOptions :: DateTimeFormatter -> F ResolvedOptions
311+resolvedOptions fmt = do
312+ locale <- obj ! "locale" >>= readString
313+ calendar <- obj ! "calendar" >>= readString
314+ numberingSystem <- obj ! "numberingSystem" >>= readString
315+ timeZone <- obj ! "timeZone" >>= readString
316+ era <- obj ! "era" >>= readMaybeString
317+ weekday <- obj ! "weekday" >>= readMaybeString
318+ year <- obj ! "year" >>= readMaybeString
319+ day <- obj ! "day" >>= readMaybeString
320+ hour <- obj ! "hour" >>= readMaybeString
321+ minute <- obj ! "minute" >>= readMaybeString
322+ second <- obj ! "second" >>= readMaybeString
323+ timeZoneName <- obj ! "timeZoneName" >>= readMaybeString
325+ pure $ ResolvedOptions { locale, calendar, numberingSystem, timeZone, era, weekday, year, day, hour, minute, second, timeZoneName }
328+ obj = resolvedOptionsImpl fmt
330+ readMaybeString :: Foreign -> F (Maybe String)
334+ else Just <$> readString f