git.iko.soy/purescript-intl
on master help sign in
DateTimeFormat.Types

* do not use generics for default FormatComponent instances * turn FormatCompoentRecord into a newtype * update tests

commit8c30a6ca1c9ff630b594dea0b96e8df4f705ad23 authorMarcin Szamotulski <mszamot@gmail.com> dateSun 25 Jun 2017, 23:22 (9 years ago) parente7a118c
5 files changed+73−47
src/Data/Intl/DateTimeFormat.purs+12−13 src/Data/Intl/DateTimeFormat/Class.purs+5−2 src/Data/Intl/DateTimeFormat/Generic.purs+3−3 src/Data/Intl/DateTimeFormat/Types.purs+50−27 test/Test/Main.purs+3−2
src/Data/Intl/DateTimeFormat.purs+12−13
@@ -22,15 +22,14 @@ import Data.Either (Either(..))
2222import Data.Foreign (F, Foreign, ForeignError(..), isUndefined, readString)
2323import Data.Foreign.Index ((!))
2424import Data.Function.Uncurried (Fn3, Fn4, runFn3, runFn4)
25−import Data.Generic.Rep (class Generic)
26−import Data.Intl.DateTimeFormat.Generic (class FormatComponent, defaultComponentRecord, formatComponent, genericFormatComponent)
25+import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(FormatComponentRecord), formatComponent)
2726import Data.JSDate (JSDate)
2827import Data.Maybe (Maybe(..), fromMaybe, maybe)
29−import Data.Newtype (class Newtype)
28+import Data.Newtype (class Newtype, un)
3029import Data.StrMap (union)
3130import Data.Symbol (SProxy(..))
3231import Data.Traversable (sequence)
33−import Data.Variant (Variant, default, on)
32+import Data.Variant (Variant, case_, default, on)
3433import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (<<<), (>>=))
3534import Unsafe.Coerce (unsafeCoerce)
3635
@@ -121,15 +120,15 @@ formatDateTimeOptions (DateTimeFormatOptions opts comps) = merge opts' (compsCoe
121120 , hour12: fromMaybe (unsafeCoerce undefined) opts.hour12
122121 , formatMatcher: maybe undefinedString show opts.formatMatcher
123122 }
124− comps' = default (defaultComponentRecord)
125− # on (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond") formatComponent
126− # on (SProxy :: SProxy "weekdayYearMonthDay") formatComponent
127− # on (SProxy :: SProxy "yearMonthDay") formatComponent
128− # on (SProxy :: SProxy "yearMonth") formatComponent
129− # on (SProxy :: SProxy "monthDay") formatComponent
130− # on (SProxy :: SProxy "hourMinuteSecond") formatComponent
131− # on (SProxy :: SProxy "hourMinute") formatComponent
132− # on (SProxy :: SProxy "custom") formatComponent
123+ comps' = case_
124+ # on (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond") (un FormatComponentRecord <<< formatComponent)
125+ # on (SProxy :: SProxy "weekdayYearMonthDay") (un FormatComponentRecord <<< formatComponent)
126+ # on (SProxy :: SProxy "yearMonthDay") (un FormatComponentRecord <<< formatComponent)
127+ # on (SProxy :: SProxy "yearMonth") (un FormatComponentRecord <<< formatComponent)
128+ # on (SProxy :: SProxy "monthDay") (un FormatComponentRecord <<< formatComponent)
129+ # on (SProxy :: SProxy "hourMinuteSecond") (un FormatComponentRecord <<< formatComponent)
130+ # on (SProxy :: SProxy "hourMinute") (un FormatComponentRecord <<< formatComponent)
131+ # on (SProxy :: SProxy "custom") (un FormatComponentRecord <<< formatComponent)
133132 $ comps
134133
135134 toUndefined :: Maybe String -> String
src/Data/Intl/DateTimeFormat/Class.purs+5−2
@@ -1,9 +1,10 @@
11module Data.Intl.DateTimeFormat.Class where
22
33import Data.Maybe (Maybe(..))
4+import Data.Newtype (class Newtype)
45import Prelude (Unit)
56
6−type FormatComponentRecord =
7+newtype FormatComponentRecord = FormatComponentRecord
78 { era :: Maybe String
89 , weekday :: Maybe String
910 , year :: Maybe String
@@ -15,8 +16,10 @@ type FormatComponentRecord =
1516 , timeZoneName :: Maybe String
1617 }
1718
19+derive instance newtypeFormatComponentRecord :: Newtype FormatComponentRecord _
20+
1821defaultComponentRecord :: FormatComponentRecord
19−defaultComponentRecord =
22+defaultComponentRecord = FormatComponentRecord
2023 { era: Nothing
2124 , weekday: Nothing
2225 , year: Nothing
src/Data/Intl/DateTimeFormat/Generic.purs+3−3
@@ -7,7 +7,7 @@ module Data.Intl.DateTimeFormat.Generic
77 ) where
88
99import Data.Generic.Rep (class Generic, Constructor(Constructor), Field(..), NoConstructors, Product(..), Rec(..), from)
10−import Data.Intl.DateTimeFormat.Class (FormatComponentRecord)
10+import Data.Intl.DateTimeFormat.Class (FormatComponentRecord(..))
1111import Data.Intl.DateTimeFormat.Types (MonthRep, NumericRep, TimeZoneNameRep, StringRep)
1212import Data.Maybe (Maybe(..))
1313import Data.StrMap (StrMap, lookup, singleton, union)
@@ -20,7 +20,7 @@ class GenericFormatComponentFields a where
2020 genericFormatComponentFields :: a -> StrMap String
2121
2222instance genericFormatComponentNoConsturctors :: GenericFormatComponent NoConstructors where
23− genericFormatComponent' a =
23+ genericFormatComponent' a = FormatComponentRecord
2424 { era: Nothing
2525 , weekday: Nothing
2626 , year: Nothing
@@ -80,7 +80,7 @@ instance genericFormatComponentFieldsProduct
8080instance genericFormatComponentRec
8181 :: (GenericFormatComponentFields a)
8282 => GenericFormatComponent (Rec a) where
83− genericFormatComponent' (Rec a) =
83+ genericFormatComponent' (Rec a) = FormatComponentRecord
8484 { era: "era" `lookup` u
8585 , weekday: "weekday" `lookup` u
8686 , year: "year" `lookup` u
src/Data/Intl/DateTimeFormat/Types.purs+50−27
@@ -19,12 +19,10 @@ module Data.Intl.DateTimeFormat.Types
1919
2020import Data.Foreign (F, Foreign, ForeignError(..), fail, readString)
2121import Data.Foreign.Index ((!))
22−import Data.Generic (class Generic)
23−import Data.Intl.DateTimeFormat.Class (class FormatComponent)
24−import Data.Intl.DateTimeFormat.Generic (genericFormatComponent)
25−import Data.Maybe (Maybe)
26−import Data.Newtype (class Newtype)
27−import Prelude (class Show, bind, pure, ($), (<>), (>>=))
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 Show, bind, pure, show, ($), (<>), (>>=))
2826
2927foreign import data Undefined :: Type
3028foreign import undefined :: Undefined
@@ -112,10 +110,17 @@ newtype WeekdayYearMonthDayHourMinuteSecond = WeekdayYearMonthDayHourMinuteSecon
112110 , second :: NumericRep
113111 }
114112
115−derive instance genericWeekdayYearMonthDayHourMinuteSecond :: Generic WeekdayYearMonthDayHourMinuteSecond _
116−
117113instance formatComponentWeekdayYearMonthDayHourMinuteSecond :: FormatComponent WeekdayYearMonthDayHourMinuteSecond where
118− formatComponent = genericFormatComponent
114+ formatComponent (WeekdayYearMonthDayHourMinuteSecond { weekday, year, month, day, hour, minute, second }) = over FormatComponentRecord
115+ (\r -> r { weekday = Just (show weekday)
116+ , year = Just (show year)
117+ , month = Just (show month)
118+ , day = Just (show day)
119+ , hour = Just (show hour)
120+ , minute = Just (show minute)
121+ , second = Just (show second)
122+ }
123+ ) defaultComponentRecord
119124
120125newtype WeekdayYearMonthDay = WeekdayYearMonthDay
121126 { weekday :: StringRep
@@ -124,10 +129,15 @@ newtype WeekdayYearMonthDay = WeekdayYearMonthDay
124129 , day :: NumericRep
125130 }
126131
127−derive instance genericWeekdayYearMonthDay :: Generic WeekdayYearMonthDay _
128−
129132instance formatComponentWeekdayYearMonthDay :: FormatComponent WeekdayYearMonthDay where
130− formatComponent = genericFormatComponent
133+ formatComponent (WeekdayYearMonthDay { weekday, year, month, day }) = over FormatComponentRecord
134+ (\r -> r { weekday = Just (show weekday)
135+ , year = Just (show year)
136+ , month = Just (show month)
137+ , day = Just (show day)
138+ }
139+ ) defaultComponentRecord
140+
131141
132142newtype YearMonthDay = YearMonthDay
133143 { year :: NumericRep
@@ -135,30 +145,38 @@ newtype YearMonthDay = YearMonthDay
135145 , day :: NumericRep
136146 }
137147
138−derive instance genericYearMonthDay :: Generic YearMonthDay _
139−
140148instance formatComponentYearMonthDay :: FormatComponent YearMonthDay where
141− formatComponent = genericFormatComponent
149+ formatComponent (YearMonthDay { year, month, day }) = over FormatComponentRecord
150+ (\r -> r { year = Just (show year)
151+ , month = Just (show month)
152+ , day = Just (show day)
153+ }
154+ ) defaultComponentRecord
155+
142156
143157newtype YearMonth = YearMonth
144158 { year :: NumericRep
145159 , month :: MonthRep
146160 }
147161
148−derive instance genericYearMonth :: Generic YearMonth _
149−
150162instance formatComponentYearMonth :: FormatComponent YearMonth where
151− formatComponent = genericFormatComponent
163+ formatComponent (YearMonth { year, month }) = over FormatComponentRecord
164+ (\r -> r { year = Just (show year)
165+ , month = Just (show month)
166+ }
167+ ) defaultComponentRecord
152168
153169newtype MonthDay = MonthDay
154170 { month :: MonthRep
155171 , day :: NumericRep
156172 }
157173
158−derive instance genericMonthDay :: Generic MonthDay _
159−
160174instance formatComponentMonthDay :: FormatComponent MonthDay where
161− formatComponent = genericFormatComponent
175+ formatComponent (MonthDay { month, day }) = over FormatComponentRecord
176+ (\r -> r { month = Just (show month)
177+ , day = Just (show day)
178+ }
179+ ) defaultComponentRecord
162180
163181newtype HourMinuteSecond = HourMinuteSecond
164182 { hour :: NumericRep
@@ -166,17 +184,22 @@ newtype HourMinuteSecond = HourMinuteSecond
166184 , second :: NumericRep
167185 }
168186
169−derive instance genericHourMinuteSecond :: Generic HourMinuteSecond _
170−
171187instance formatComponentHourMinuteSecond :: FormatComponent HourMinuteSecond where
172− formatComponent = genericFormatComponent
188+ formatComponent (HourMinuteSecond { hour, minute, second }) = over FormatComponentRecord
189+ (\r -> r { hour = Just (show hour)
190+ , minute = Just (show minute)
191+ , second = Just (show second)
192+ }
193+ ) defaultComponentRecord
173194
174195newtype HourMinute = HourMinute
175196 { hour :: NumericRep
176197 , minute :: NumericRep
177198 }
178199
179−derive instance genericHourMinute :: Generic HourMinute _
180−
181200instance formatComponentHourMinute :: FormatComponent HourMinute where
182− formatComponent = genericFormatComponent
201+ formatComponent (HourMinute { hour, minute }) = over FormatComponentRecord
202+ (\r -> r { hour = Just (show hour)
203+ , minute = Just (show minute)
204+ }
205+ ) defaultComponentRecord
test/Test/Main.purs+3−2
@@ -12,7 +12,8 @@ import Data.Foldable (intercalate)
1212import Data.Foreign (F, renderForeignError)
1313import Data.Generic.Rep (class Generic)
1414import 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.Generic (class FormatComponent, genericFormatComponent)
15+import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(..))
16+import Data.Intl.DateTimeFormat.Generic (genericFormatComponent)
1617import Data.JSDate (JSDate, fromDateTime)
1718import Data.Maybe (Maybe(..), isJust, isNothing)
1819import Data.Symbol (SProxy(..))
@@ -36,7 +37,7 @@ instance formatComponentEraYear :: FormatComponent EraYear where
3637newtype Era = Era StringRep
3738
3839instance formatComponentEra :: FormatComponent Era where
39− formatComponent (Era r) =
40+ formatComponent (Era r) = FormatComponentRecord
4041 { era: Just (show r)
4142 , weekday: Nothing
4243 , year: Nothing