@@ -20,21 +20,26 @@ module Data.Intl.DateTimeFormat
2020 , formatJSDate
2121 , module Data.Intl.DateTimeFormat.Types
2222 , supportedLocalesOf
23+ , formatToParts
24+ , resolvedOptions
2325 ) where
2426
2527import Data.Intl.DateTimeFormat.Types
2628
2729import Data.Either (Either(..))
30+import Data.Foreign (F, Foreign, isUndefined, readString)
31+import Data.Foreign.Index ((!))
2832import Data.Function.Uncurried (Fn3, runFn3)
2933import Data.Generic.Rep (class Generic)
3034import Data.Intl.DateTimeFormat.Generic (class FormatComponent, defaultComponentRecord, formatComponent, genericFormatComponent)
3135import Data.JSDate (JSDate)
32−import Data.Maybe (Maybe, fromMaybe, maybe)
36+import Data.Maybe (Maybe(..), fromMaybe, maybe)
3337import Data.Newtype (class Newtype)
3438import Data.StrMap (union)
3539import Data.Symbol (SProxy(..))
40+import Data.Traversable (sequence)
3641import 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, (#), ($), (<$>), (>>=))
3843import Unsafe.Coerce (unsafeCoerce)
3944
4045foreign import data LocalesOption' :: Type
@@ -291,6 +296,39 @@ createDateTimeFormatter ls opts = createDateTimeFormatterImpl (toLocale ls) (for
291296foreign import formatJSDate :: DateTimeFormatter -> JSDate -> String
292297
293298foreign 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)
303+formatToParts formatter date = sequence $ readFormatParts <$> formatToPartsImpl formatter date
294304
295305supportedLocalesOf :: Array String -> Either String (Array String)
296306supportedLocalesOf locales = runFn3 supportedLocalesOfImpl Left Right locales
307+
308+foreign import resolvedOptionsImpl :: DateTimeFormatter -> Foreign
309+
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
324+
325+ pure $ ResolvedOptions { locale, calendar, numberingSystem, timeZone, era, weekday, year, day, hour, minute, second, timeZoneName }
326+
327+ where
328+ obj = resolvedOptionsImpl fmt
329+
330+ readMaybeString :: Foreign -> F (Maybe String)
331+ readMaybeString f =
332+ if isUndefined f
333+ then pure Nothing
334+ else Just <$> readString f