git.iko.soy/purescript-intl
on 2fe5be6 help sign in
12 files changed−1205
since splitsnapshots
unifiedsplit
.gitignore−1 .travis.yml−24 README.md−9 bower.json−27 package.json−31 src/Data/Intl/DateTimeFormat.js−39 src/Data/Intl/DateTimeFormat.purs−343 src/Data/Intl/DateTimeFormat/Class.purs−41 src/Data/Intl/DateTimeFormat/Generic.purs−98 src/Data/Intl/DateTimeFormat/Types.js−3 src/Data/Intl/DateTimeFormat/Types.purs−246 test/Test/Main.purs−343
.gitignore−1
@@ -6,4 +6,3 @@ node_modules
66# Generated files
77.psci
88output
9−.purs-repl
.travis.ymldeleted−24
@@ -1,24 +0,0 @@
1−language: node_js
2−dist: trusty
3−sudo: required
4−node_js: stable
5−env:
6− - PATH=$HOME/purescript:$PATH
7−install:
8− - 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')
9− - wget -O $HOME/purescript.tar.gz https://github.com/purescript/purescript/releases/download/$TAG/linux64.tar.gz
10− - tar -xvf $HOME/purescript.tar.gz -C $HOME/
11− - chmod a+x $HOME/purescript
12− - npm install -g bower
13− - npm install
14−script:
15− - locale
16− - bower install --production
17− - npm run -s build
18− - bower install
19− - npm -s test
20−after_success:
21−- >-
22− test $TRAVIS_TAG &&
23− echo $GITHUB_TOKEN | pulp login &&
24− echo y | pulp publish --no-push
README.mddeleted−9
@@ -1,9 +0,0 @@
1−# PureScript bindings to Intl - JavaScript Internalisation API
2−
3−[![Maintainer: coot](https://img.shields.io/badge/maintainer-coot-lightgrey.svg)](http://github.com/coot)
4−[![Documentation](https://pursuit.purescript.org/packages/purescript-intl/badge)](https://pursuit.purescript.org/packages/purescript-intl)
5−[![Build Status](https://travis-ci.org/coot/purescript-intl.svg?branch=master)](https://travis-ci.org/coot/purescript-intl)
6−
7−[Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl)
8−is ECMAScript Internalisation API. This library provides type safe PureScript
9−bindings.
bower.jsondeleted−27
@@ -1,27 +0,0 @@
1−{
2− "name": "purescript-intl",
3− "ignore": [
4− "**/.*",
5− "node_modules",
6− "bower_components",
7− "output"
8− ],
9− "license": "MPL-2.0",
10− "repository": {
11− "type": "git",
12− "url": "git://github.com/coot/purescript-intl.git"
13− },
14− "dependencies": {
15− "purescript-prelude": "^3.0.0",
16− "purescript-console": "^3.0.0",
17− "purescript-unsafe-coerce": "^3.0.0",
18− "purescript-variant": "^1.1.0",
19− "purescript-generics-rep": "^5.1.0",
20− "purescript-maps": "^3.3.1",
21− "purescript-js-date": "^5.0.0"
22− },
23− "devDependencies": {
24− "purescript-psci-support": "^3.0.0",
25− "purescript-assert": "^3.0.0"
26− }
27−}
package.jsondeleted−31
@@ -1,31 +0,0 @@
1−{
2− "name": "purescript-intl",
3− "version": "0.1.0",
4− "description": "PureScript interface to Intl",
5− "main": "index.js",
6− "directories": {
7− "test": "test"
8− },
9− "scripts": {
10− "build": "pulp build",
11− "test": "pulp test"
12− },
13− "repository": {
14− "type": "git",
15− "url": "git+https://github.com/coot/purescript-intl.git"
16− },
17− "keywords": [
18− "Intl",
19− "internalisation",
20− "purescript"
21− ],
22− "author": "Marcin Szamotulski",
23− "license": "MPL-2.0",
24− "bugs": {
25− "url": "https://github.com/coot/purescript-intl/issues"
26− },
27− "homepage": "https://github.com/coot/purescript-intl#readme",
28− "devDependencies": {
29− "pulp": "^11.0.0"
30− }
31−}
src/Data/Intl/DateTimeFormat.jsdeleted−39
@@ -1,39 +0,0 @@
1−"use strict";
2−
3−exports.dateTimeFormatImpl = function(locales) {
4− return function(options) {
5− return new Intl.DateTimeFormat(locales, options);
6− };
7−};
8−
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− }
15−};
16−
17−exports.formatJSDate = function(formatter) {
18− return function(date) {
19− return formatter.format(date)
20− };
21−};
22−
23−exports.formatToPartsImpl = function(formatter) {
24− return function(date) {
25− return formatter.formatToParts(date);
26− };
27−};
28−
29−exports.supportedLocalesOfImpl = function(Left, Right, locales) {
30− try {
31− return Right(Intl.DateTimeFormat.supportedLocalesOf(locales))
32− } catch (e) {
33− return Left(e.message)
34− }
35−}
36−
37−exports.resolvedOptionsImpl = function(formatter) {
38− return formatter.resolvedOptions();
39−};
src/Data/Intl/DateTimeFormat.pursdeleted−343
@@ -1,343 +0,0 @@
1−module Data.Intl.DateTimeFormat
2− ( LocalesOption
3− , LocaleMatcher(..)
4− , TimeZone(..)
5− , FormatMatcher(..)
6− , DateTimeFormatOptions(..)
7− , DateTimeFormatOptions'
8− , DateTimeComponents(..)
9− , DateTimeFormat
10− , createDateTimeFormat
11− , formatJSDate
12− , module Data.Intl.DateTimeFormat.Types
13− , supportedLocalesOf
14− , formatToParts
15− , resolvedOptions
16− ) where
17−
18−import Data.Intl.DateTimeFormat.Types
19−
20−import Control.Monad.Error.Class (throwError)
21−import Data.Either (Either(..))
22−import Data.Foreign (F, Foreign, ForeignError(..), isUndefined, readString)
23−import Data.Foreign.Index ((!))
24−import Data.Function.Uncurried (Fn3, Fn4, runFn3, runFn4)
25−import Data.Intl.DateTimeFormat.Class (class FormatComponent, FormatComponentRecord(FormatComponentRecord), formatComponent)
26−import Data.JSDate (JSDate)
27−import Data.Maybe (Maybe(..), fromMaybe, maybe)
28−import Data.Newtype (class Newtype, un)
29−import Data.StrMap (union)
30−import Data.Symbol (SProxy(..))
31−import Data.Traversable (sequence)
32−import Data.Variant (Variant, case_, default, on)
33−import Prelude (class Eq, class Show, Unit, bind, id, pure, show, (#), ($), (<$>), (<<<), (>>=))
34−import Unsafe.Coerce (unsafeCoerce)
35−
36−foreign import data LocalesOption' :: Type
37−
38−foreign import dateTimeFormatImpl :: LocalesOption' -> DateTimeFormatOptions_ -> DateTimeFormat
39−
40−newtype DateTimeFormatOptions_ = DateTimeFormatOptions_
41− { localeMatcher :: String
42− , timeZone :: String
43− , hour12 :: Boolean
44− , formatMatcher :: String
45− , weekday :: String
46− , era :: String
47− , year :: String
48− , month :: String
49− , day :: String
50− , hour :: String
51− , minutes :: String
52− , second :: String
53− , timeZoneName :: String
54− }
55−
56−type LocalesOption = Variant (locale :: String, locales :: Array String, undefined :: Undefined)
57−
58−toLocale :: LocalesOption -> LocalesOption'
59−toLocale = unsafeCoerce $
60− default undefined
61− # on (SProxy :: SProxy "locale") id
62− # on (SProxy :: SProxy "locales") id
63−
64−data LocaleMatcher
65− = LMLookup
66− | LMBestFit
67−
68−instance showLocaleMatcher :: Show LocaleMatcher where
69− show LMLookup = "lookup"
70− show LMBestFit = "best fit"
71−
72−newtype TimeZone = TimeZone String
73−
74−instance showTimeZone :: Show TimeZone where
75− show (TimeZone tz) = tz
76−
77−derive instance newtypeTimeZone :: Newtype TimeZone _
78−
79−derive instance eqTimeZone :: Eq TimeZone
80−
81−data FormatMatcher
82− = FMBasic
83− | FMBestFit
84−
85−instance showFormatMatcher :: Show FormatMatcher where
86− show FMBasic = "basic"
87− show FMBestFit = "best fit"
88−
89−type DateTimeComponents a =
90− Variant
91− ( weekdayYearMonthDayHourMinuteSecond :: WeekdayYearMonthDayHourMinuteSecond
92− , weekdayYearMonthDay :: WeekdayYearMonthDay
93− , yearMonthDay :: YearMonthDay
94− , yearMonth :: YearMonth
95− , monthDay :: MonthDay
96− , hourMinuteSecond :: HourMinuteSecond
97− , hourMinute :: HourMinute
98− , custom :: a
99− )
100−
101−data DateTimeFormatOptions a = DateTimeFormatOptions
102− { localeMatcher :: Maybe LocaleMatcher
103− , timeZone :: Maybe TimeZone
104− , hour12 :: Maybe Boolean
105− , formatMatcher :: Maybe FormatMatcher
106− }
107− (DateTimeComponents a)
108−
109−type DateTimeFormatOptions' = DateTimeFormatOptions Unit
110−
111−formatDateTimeOptions :: forall a. (FormatComponent a) => DateTimeFormatOptions a -> DateTimeFormatOptions_
112−formatDateTimeOptions (DateTimeFormatOptions opts comps) = merge opts' (compsCoerce comps')
113− where
114−
115− undefinedString :: String
116− undefinedString = unsafeCoerce undefined
117−
118− opts' = { localeMatcher: maybe undefinedString show opts.localeMatcher
119− , timeZone: maybe undefinedString show opts.timeZone
120− , hour12: fromMaybe (unsafeCoerce undefined) opts.hour12
121− , formatMatcher: maybe undefinedString show opts.formatMatcher
122− }
123− comps' = un FormatComponentRecord $ case_
124− # on (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond") formatComponent
125− # on (SProxy :: SProxy "weekdayYearMonthDay") formatComponent
126− # on (SProxy :: SProxy "yearMonthDay") formatComponent
127− # on (SProxy :: SProxy "yearMonth") formatComponent
128− # on (SProxy :: SProxy "monthDay") formatComponent
129− # on (SProxy :: SProxy "hourMinuteSecond") formatComponent
130− # on (SProxy :: SProxy "hourMinute") formatComponent
131− # on (SProxy :: SProxy "custom") formatComponent
132− $ comps
133−
134− toUndefined :: Maybe String -> String
135− toUndefined m = fromMaybe (unsafeCoerce undefined) m
136−
137− compsCoerce
138− :: { weekday :: Maybe String
139− , era :: Maybe String
140− , year :: Maybe String
141− , month :: Maybe String
142− , day :: Maybe String
143− , hour :: Maybe String
144− , minute :: Maybe String
145− , second :: Maybe String
146− , timeZoneName :: Maybe String
147− }
148− -> { weekday :: String
149− , era :: String
150− , year :: String
151− , month :: String
152− , day :: String
153− , hour :: String
154− , minute :: String
155− , second :: String
156− , timeZoneName :: String
157− }
158− compsCoerce { weekday, era, year, month, day, hour, minute, second, timeZoneName }
159− = { weekday: toUndefined weekday
160− , era: toUndefined era
161− , year: toUndefined year
162− , month: toUndefined month
163− , day: toUndefined day
164− , hour: toUndefined hour
165− , minute: toUndefined minute
166− , second: toUndefined second
167− , timeZoneName: toUndefined timeZoneName
168− }
169−
170− merge
171− :: { localeMatcher :: String
172− , timeZone :: String
173− , hour12 :: Boolean
174− , formatMatcher :: String
175− }
176− -> { weekday :: String
177− , era :: String
178− , year :: String
179− , month :: String
180− , day :: String
181− , hour :: String
182− , minute :: String
183− , second :: String
184− , timeZoneName :: String
185− }
186− -> DateTimeFormatOptions_
187− merge a b = unsafeCoerce $ union (unsafeCoerce a) (unsafeCoerce b)
188−
189−foreign import data DateTimeFormat :: Type
190−
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
282− :: forall a
283− .(FormatComponent a)
284− => LocalesOption
285− -> 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)
312−formatToParts formatter date = sequence $ readFormatParts <$> formatToPartsImpl formatter date
313−
314−supportedLocalesOf :: Array String -> Either String (Array String)
315−supportedLocalesOf locales = runFn3 supportedLocalesOfImpl Left Right locales
316−
317−foreign import resolvedOptionsImpl :: DateTimeFormat -> Foreign
318−
319−resolvedOptions :: DateTimeFormat -> F ResolvedOptions
320−resolvedOptions fmt = do
321− locale <- obj ! "locale" >>= readString
322− calendar <- obj ! "calendar" >>= readString
323− numberingSystem <- obj ! "numberingSystem" >>= readString
324− timeZone <- obj ! "timeZone" >>= readString
325− era <- obj ! "era" >>= readMaybeString
326− weekday <- obj ! "weekday" >>= readMaybeString
327− year <- obj ! "year" >>= readMaybeString
328− day <- obj ! "day" >>= readMaybeString
329− hour <- obj ! "hour" >>= readMaybeString
330− minute <- obj ! "minute" >>= readMaybeString
331− second <- obj ! "second" >>= readMaybeString
332− timeZoneName <- obj ! "timeZoneName" >>= readMaybeString
333−
334− pure $ ResolvedOptions { locale, calendar, numberingSystem, timeZone, era, weekday, year, day, hour, minute, second, timeZoneName }
335−
336− where
337− obj = resolvedOptionsImpl fmt
338−
339− readMaybeString :: Foreign -> F (Maybe String)
340− readMaybeString f =
341− if isUndefined f
342− then pure Nothing
343− else Just <$> readString f
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.pursdeleted−98
@@ -1,98 +0,0 @@
1−module Data.Intl.DateTimeFormat.Generic
2− ( class GenericFormatComponent
3− , genericFormatComponent'
4− , genericFormatComponent
5− , class GenericFormatComponentFields
6− , genericFormatComponentFields
7− ) where
8−
9−import Data.Generic.Rep (class Generic, Constructor(Constructor), Field(..), NoConstructors, Product(..), Rec(..), from)
10−import Data.Intl.DateTimeFormat.Class (FormatComponentRecord(..))
11−import Data.Intl.DateTimeFormat.Types (MonthRep, NumericRep, TimeZoneNameRep, StringRep)
12−import Data.Maybe (Maybe(..))
13−import Data.StrMap (StrMap, lookup, singleton, union)
14−import Prelude (show)
15−
16−class GenericFormatComponent a where
17− genericFormatComponent' :: a -> FormatComponentRecord
18−
19−class GenericFormatComponentFields a where
20− genericFormatComponentFields :: a -> StrMap String
21−
22−instance genericFormatComponentNoConsturctors :: GenericFormatComponent NoConstructors where
23− genericFormatComponent' a = FormatComponentRecord
24− { era: Nothing
25− , weekday: Nothing
26− , year: Nothing
27− , month: Nothing
28− , day: Nothing
29− , hour: Nothing
30− , minute: Nothing
31− , second: Nothing
32− , timeZoneName: Nothing
33− }
34−
35−instance genericFormatComponentConstructor :: (GenericFormatComponent a) => GenericFormatComponent (Constructor name a) where
36− genericFormatComponent' (Constructor a) = genericFormatComponent' a
37−
38−instance genericFormatComponentFieldsEra
39− :: GenericFormatComponentFields (Field "era" StringRep) where
40− genericFormatComponentFields (Field a) = singleton "era" (show a)
41−
42−instance genericFormatComponentFieldsWeekday
43− :: GenericFormatComponentFields (Field "weekday" StringRep) where
44− genericFormatComponentFields (Field a) = singleton "weekday" (show a)
45−
46−instance genericFormatComponentFieldsYear
47− :: GenericFormatComponentFields (Field "year" NumericRep) where
48− genericFormatComponentFields (Field a) = singleton "year" (show a)
49−
50−instance genericFormatComponentFieldsMonth
51− :: GenericFormatComponentFields (Field "month" MonthRep) where
52− genericFormatComponentFields (Field a) = singleton "month" (show a)
53−
54−instance genericFormatComponentFieldsDay
55− :: GenericFormatComponentFields (Field "day" NumericRep) where
56− genericFormatComponentFields (Field a) = singleton "day" (show a)
57−
58−instance genericFormatComponentFieldsHour
59− :: GenericFormatComponentFields (Field "hour" NumericRep) where
60− genericFormatComponentFields (Field a) = singleton "hour" (show a)
61−
62−instance genericFormatComponentFieldsMinute
63− :: GenericFormatComponentFields (Field "minute" NumericRep) where
64− genericFormatComponentFields (Field a) = singleton "minute" (show a)
65−
66−instance genericFormatComponentFieldsSecond
67− :: GenericFormatComponentFields (Field "second" NumericRep) where
68− genericFormatComponentFields (Field a) = singleton "second" (show a)
69−
70−instance genericFormatComponentFieldsTimeZoneName
71− :: GenericFormatComponentFields (Field "timeZoneName" TimeZoneNameRep) where
72− genericFormatComponentFields (Field a) = singleton "timeZoneName" (show a)
73−
74−instance genericFormatComponentFieldsProduct
75− :: (GenericFormatComponentFields a, GenericFormatComponentFields b)
76− => GenericFormatComponentFields (Product a b) where
77− genericFormatComponentFields (Product a b) =
78− union (genericFormatComponentFields a) (genericFormatComponentFields b)
79−
80−instance genericFormatComponentRec
81− :: (GenericFormatComponentFields a)
82− => GenericFormatComponent (Rec a) where
83− genericFormatComponent' (Rec a) = FormatComponentRecord
84− { era: "era" `lookup` u
85− , weekday: "weekday" `lookup` u
86− , year: "year" `lookup` u
87− , month: "month" `lookup` u
88− , day: "day" `lookup` u
89− , hour: "hour" `lookup` u
90− , minute: "minute" `lookup` u
91− , second: "second" `lookup` u
92− , timeZoneName: "timeZoneName" `lookup` u
93− }
94− where
95− u = genericFormatComponentFields a
96−
97−genericFormatComponent :: forall a rep. Generic a rep => GenericFormatComponent rep => a -> FormatComponentRecord
98−genericFormatComponent a = genericFormatComponent' (from a)
src/Data/Intl/DateTimeFormat/Types.jsdeleted−3
@@ -1,3 +0,0 @@
1−"use strict";
2−
3−exports["undefined"] = undefined;
src/Data/Intl/DateTimeFormat/Types.pursdeleted−246
@@ -1,246 +0,0 @@
1−module Data.Intl.DateTimeFormat.Types
2− ( StringRep(..)
3− , NumericRep(..)
4− , MonthRep(..)
5− , TimeZoneNameRep(..)
6− , FormatParts(..)
7− , readFormatParts
8− , ResolvedOptions(..)
9− , WeekdayYearMonthDayHourMinuteSecond(..)
10− , WeekdayYearMonthDay(..)
11− , YearMonthDay(..)
12− , YearMonth(..)
13− , MonthDay(..)
14− , HourMinuteSecond(..)
15− , HourMinute(..)
16− , Undefined
17− , undefined
18− ) where
19−
20−import Data.Foreign (F, Foreign, ForeignError(..), fail, readString)
21−import 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
30−
31−data StringRep = Narrow | Short | Long
32−
33−derive instance eqStringRep :: Eq StringRep
34−
35−instance showStringRep :: Show StringRep where
36− show Narrow = "narrow"
37− show Short = "short"
38− show Long = "long"
39−
40−data NumericRep = Numeric | TwoDigit
41−
42−derive instance eqNumericRep :: Eq NumericRep
43−
44−instance showNumericRep :: Show NumericRep where
45− show Numeric = "numeric"
46− show TwoDigit = "2-digit"
47−
48−data MonthRep = MonthNumeric | MonthTwoDigit | MonthNarrow | MonthShort | MonthLong
49−
50−derive instance eqMonthRep :: Eq MonthRep
51−
52−instance showMonthRep :: Show MonthRep where
53− show MonthNumeric = "numeric"
54− show MonthTwoDigit = "2-digit"
55− show MonthNarrow = "narrow"
56− show MonthShort = "short"
57− show MonthLong = "long"
58−
59−data TimeZoneNameRep = TimeZoneNameShort | TimeZoneNameLong
60−
61−derive instance eqTimeZoneNameRep :: Eq TimeZoneNameRep
62−
63−instance showTimeZoneRep :: Show TimeZoneNameRep where
64− show TimeZoneNameShort = "short"
65− show TimeZoneNameLong = "long"
66−
67−data FormatParts
68− = Era String
69− | Year String
70− | Month String
71− | Weekday String
72− | Day String
73− | Hour String
74− | Minute String
75− | DayPeriod String
76− | Literal String
77−
78−derive instance eqFormatParts :: Eq FormatParts
79−
80−readFormatParts :: Foreign -> F FormatParts
81−readFormatParts val = do
82− type_ <- val ! "type" >>= readString
83− value <- val ! "value" >>= readString
84− case type_ of
85− "era" -> pure $ Era value
86− "year" -> pure $ Year value
87− "month" -> pure $ Month value
88− "weekday" -> pure $ Weekday value
89− "month" -> pure $ Month value
90− "day" -> pure $ Day value
91− "hour" -> pure $ Hour value
92− "minute" -> pure $ Minute value
93− "dayperiod" -> pure $ DayPeriod value
94− "literal" -> pure $ Literal value
95− _ -> fail $ ForeignError ("type " <> type_ <> " is not supported by purescript-intl")
96−
97−newtype ResolvedOptions = ResolvedOptions
98− { locale :: String
99− , numberingSystem :: String
100− , calendar :: String
101− , timeZone :: String
102− , era :: Maybe String
103− , weekday :: Maybe String
104− , year :: Maybe String
105− , day :: Maybe String
106− , hour :: Maybe String
107− , minute :: Maybe String
108− , second :: Maybe String
109− , timeZoneName :: Maybe String
110− }
111−
112−derive 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.pursdeleted−343
@@ -1,343 +0,0 @@
1−module Test.Main where
2−
3−import Prelude
4−
5−import Control.Monad.Eff (Eff)
6−import Control.Monad.Eff.Console (CONSOLE)
7−import Control.Monad.Except (runExcept)
8−import Data.DateTime (Date, DateTime(..), Month(..), canonicalDate)
9−import Data.Either (Either(..), fromRight, isLeft)
10−import Data.Enum (toEnum)
11−import Data.Foldable (intercalate)
12−import Data.Foreign (F, renderForeignError)
13−import 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)
17−import Data.JSDate (JSDate, fromDateTime)
18−import Data.Maybe (Maybe(..), isJust, isNothing)
19−import Data.Symbol (SProxy(..))
20−import Data.Time (Time(..))
21−import Data.Variant (inj)
22−import Partial.Unsafe (unsafeCrashWith, unsafePartial)
23−import Test.Assert (ASSERT, assert')
24−
25−type Tests = Eff (console :: CONSOLE, assert :: ASSERT) Unit
26−
27−newtype EraYear = EraYear
28− { era :: StringRep
29− , year :: NumericRep
30− }
31−
32−derive instance genericEraYear :: Generic EraYear _
33−
34−instance formatComponentEraYear :: FormatComponent EraYear where
35− formatComponent = genericFormatComponent
36−
37−newtype Era = Era StringRep
38−
39−instance formatComponentEra :: FormatComponent Era where
40− formatComponent (Era r) = FormatComponentRecord
41− { era: Just (show r)
42− , weekday: Nothing
43− , year: Nothing
44− , month: Nothing
45− , day: Nothing
46− , hour: Nothing
47− , minute: Nothing
48− , second: Nothing
49− , timeZoneName: Nothing
50− }
51−
52−main :: Tests
53−main = do
54− let
55−
56− unsafeFromF :: forall a. F a -> a
57− unsafeFromF = unsafePartial fromRight <<< runExcept
58−
59− locales :: LocalesOption
60− locales = inj (SProxy :: SProxy "locale") "en-US"
61−
62− fmtError =
63− createDateTimeFormat (inj (SProxy :: SProxy "locale") "") opts
64− where
65− opts :: DateTimeFormatOptions'
66− opts =
67− (DateTimeFormatOptions
68− { localeMatcher: Nothing
69− , timeZone: (Just (TimeZone "Europe/London"))
70− , hour12: Just false
71− , formatMatcher: Nothing
72− }
73− (inj (SProxy :: SProxy "hourMinute") (HourMinute {hour: TwoDigit, minute: TwoDigit}))
74− )
75−
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
92− where
93− opts :: DateTimeFormatOptions'
94− opts =
95− (DateTimeFormatOptions
96− { localeMatcher: Nothing
97− , timeZone: (Just (TimeZone "Europe/London"))
98− , hour12: Just false
99− , formatMatcher: Nothing
100− }
101− (inj (SProxy :: SProxy "hourMinuteSecond") (HourMinuteSecond {hour: Numeric, minute: Numeric, second: Numeric}))
102− )
103−
104− fmtWeekdayYearMonthDayHourMinuteSecond = unsafeFromF $
105− createDateTimeFormat locales opts
106− where
107− opts :: DateTimeFormatOptions'
108− opts =
109− (DateTimeFormatOptions
110− { localeMatcher: Nothing
111− , timeZone: (Just (TimeZone "Europe/London"))
112− , hour12: Just true
113− , formatMatcher: Nothing
114− }
115− (inj
116− (SProxy :: SProxy "weekdayYearMonthDayHourMinuteSecond")
117− (WeekdayYearMonthDayHourMinuteSecond
118− { weekday: Short
119− , year: Numeric
120− , month: MonthLong
121− , day: Numeric
122− , hour: Numeric
123− , minute: Numeric
124− , second: Numeric
125− }
126− )
127− )
128− )
129−
130− fmtWeekdayYearMonthDay = unsafeFromF $
131− createDateTimeFormat locales opts
132− where
133− opts :: DateTimeFormatOptions'
134− opts =
135− (DateTimeFormatOptions
136− { localeMatcher: Nothing
137− , timeZone: (Just (TimeZone "Europe/London"))
138− , hour12: Just true
139− , formatMatcher: Nothing
140− }
141− (inj
142− (SProxy :: SProxy "weekdayYearMonthDay")
143− (WeekdayYearMonthDay
144− { weekday: Long
145− , year: TwoDigit
146− , month: MonthShort
147− , day: TwoDigit
148− }
149− )
150− )
151− )
152−
153− fmtYearMonthDay = unsafeFromF $
154− createDateTimeFormat locales opts
155− where
156− opts :: DateTimeFormatOptions'
157− opts =
158− (DateTimeFormatOptions
159− { localeMatcher: Nothing
160− , timeZone: (Just (TimeZone "Europe/London"))
161− , hour12: Just true
162− , formatMatcher: Nothing
163− }
164− (inj
165− (SProxy :: SProxy "yearMonthDay")
166− (YearMonthDay
167− { year: TwoDigit
168− , month: MonthNarrow
169− , day: TwoDigit
170− }
171− )
172− )
173− )
174−
175− fmtYearMonth = unsafeFromF $
176− createDateTimeFormat locales opts
177− where
178− opts :: DateTimeFormatOptions'
179− opts =
180− (DateTimeFormatOptions
181− { localeMatcher: Nothing
182− , timeZone: (Just (TimeZone "Europe/London"))
183− , hour12: Just true
184− , formatMatcher: Nothing
185− }
186− (inj
187− (SProxy :: SProxy "yearMonth")
188− (YearMonth
189− { year: Numeric
190− , month: MonthNumeric
191− }
192− )
193− )
194− )
195−
196− fmtMonthDay = unsafeFromF $
197− createDateTimeFormat locales opts
198− where
199− opts :: DateTimeFormatOptions'
200− opts =
201− (DateTimeFormatOptions
202− { localeMatcher: Nothing
203− , timeZone: (Just (TimeZone "Europe/London"))
204− , hour12: Just true
205− , formatMatcher: Nothing
206− }
207− (inj
208− (SProxy :: SProxy "monthDay")
209− (MonthDay
210− { month: MonthTwoDigit
211− , day: TwoDigit
212− }
213− )
214− )
215− )
216−
217− fmtEraYear = unsafeFromF $
218− createDateTimeFormat locales opts
219− where
220− opts :: DateTimeFormatOptions EraYear
221− opts =
222− (DateTimeFormatOptions
223− { localeMatcher: Nothing
224− , timeZone: (Just (TimeZone "Europe/London"))
225− , hour12: Just true
226− , formatMatcher: Nothing
227− }
228− (inj
229− (SProxy :: SProxy "custom")
230− (EraYear
231− { era: Long
232− , year: Numeric
233− }
234− )
235− )
236− )
237−
238− fmtEra = unsafeFromF $
239− createDateTimeFormat locales opts
240− where
241− opts :: DateTimeFormatOptions Era
242− opts =
243− (DateTimeFormatOptions
244− { localeMatcher: Nothing
245− , timeZone: (Just (TimeZone "Europe/London"))
246− , hour12: Just true
247− , formatMatcher: Nothing
248− }
249− (inj
250− (SProxy :: SProxy "custom")
251− (Era Short)
252− )
253− )
254−
255−
256− date :: Maybe Date
257− date = do
258− y <- toEnum 2018
259− let m = January
260− d <- toEnum 2
261− pure $ canonicalDate y m d
262−
263− time :: Maybe Time
264− time = do
265− h <- toEnum 12
266− m <- toEnum 0
267− s <- toEnum 0
268− ms <- toEnum 0
269− pure $ Time h m s ms
270−
271− dt :: Maybe DateTime
272− dt = do
273− d <- date
274− t <- time
275− pure $ DateTime d t
276−
277− jsDate :: Maybe JSDate
278− jsDate = fromDateTime <$> dt
279−
280− case jsDate of
281− Nothing -> unsafeCrashWith "jsDate not parsed"
282− Just d -> do
283−
284− assert' "fmtError expected to return error" $ isLeft (runExcept fmtError)
285−
286− let fmtDate1 = formatJSDate fmtWeekdayYearMonthDayHourMinuteSecond d
287− fmtDate1Expected = "Tue, January 2, 2018, 12:00:00 PM"
288− assert' ("fmtWeekdayYearMonthDayHourMinuteSecond: got: '" <> fmtDate1 <> "' expected: '" <> fmtDate1Expected <> "'")
289− $ fmtDate1 == fmtDate1Expected
290− let fmtDate2 = formatJSDate fmtWeekdayYearMonthDay d
291− fmtDate2Expected = "Tuesday, Jan 02, 18"
292− assert' ("fmtWeekdayYearMonthDayString: got '" <> fmtDate2 <> "' expected: '" <> fmtDate2Expected <> "'")
293− $ fmtDate2 == fmtDate2Expected
294− let fmtDate3 = formatJSDate fmtYearMonthDay d
295− fmtDate3Expected = "J 02, 18"
296− assert' ("fmtYearMonthDayString: got '" <> fmtDate3 <> "' expected: '" <> fmtDate3Expected <> "'")
297− $ fmtDate3 == fmtDate3Expected
298− let fmtDate4 = formatJSDate fmtYearMonth d
299− fmtDate4Expected = "1/2018"
300− assert' ("fmtYearMonthString: got '" <> fmtDate4 <> "' expected: '" <> fmtDate4Expected <> "'")
301− $ fmtDate4 == fmtDate4Expected
302− let fmtDate5 = formatJSDate fmtMonthDay d
303− fmtDate5Expected = "01/02"
304− assert' ("fmtMonthDayString: got '" <> fmtDate5 <> "' expected: '" <> fmtDate5Expected <> "'")
305− $ fmtDate5 == fmtDate5Expected
306− let fmtDate6 = formatJSDate fmtHourMinuteSecond d
307− fmtDate6Expected = "12:00:00"
308− assert' ("fmtHourMinuteSecondString: got '" <> fmtDate6 <> "' expected: '" <> fmtDate6Expected <> "'")
309− $ fmtDate6 == fmtDate6Expected
310− let fmtDate7 = formatJSDate fmtHourMinute d
311− fmtDate7Expected = "12:00"
312− assert' ("fmtHourMinuteString: got '" <> fmtDate7 <> "' expected: '" <> fmtDate7Expected <> "'")
313− $ fmtDate7 == fmtDate7Expected
314− let fmtDate8 = formatJSDate fmtEraYear d
315− fmtDate8Expected = "2018 Anno Domini"
316− assert' ("fmtEraYear: got '" <> fmtDate8 <> "' expected: '" <> fmtDate8Expected <> "'")
317− $ fmtDate8 == fmtDate8Expected
318− let fmtDate9 = formatJSDate fmtEra d
319− fmtDate9Expected = "1 2, 2018 AD"
320− assert' ("fmtEra: got '" <> fmtDate9 <> "' expected: '" <> fmtDate9Expected <> "'")
321− $ fmtDate9 == fmtDate9Expected
322−
323− let slocs = supportedLocalesOf ["en-US", "jp-JP"]
324− assert' ("supportedLocalesOf: got: " <> show slocs) $ slocs == Right ["en-US"]
325−
326− let err = supportedLocalesOf ["en_US"]
327− assert' ("supportedLocalesOf got: " <> show err) $ isLeft err
328−
329− -- formatToParts is not supported in node
330− -- let parts = runExcept $ formatToParts fmtHourMinute d
331− -- assert' ("") $ isRight parts
332−
333− case runExcept (resolvedOptions fmtHourMinuteSecond) of
334− Left errs-> assert' ("resolvedOptions error: " <> (intercalate "; " $ renderForeignError <$> errs)) false
335− Right (ResolvedOptions {locale, year, day, weekday, hour, minute, second}) -> do
336− assert' ("resolvedOptions locale: got: " <> locale) $ (locale == "en-US") || (locale == "en")
337− assert' ("resolvedOptions year: got Just") $ isNothing year
338− assert' ("resolvedOptions day: got Just") $ isNothing day
339− assert' ("resolvedOptions weekday: got Just") $ isNothing weekday
340− assert' ("resolvedOptions hour: got Nothing") $ isJust hour
341− assert' ("resolvedOptions minute: got Nothing") $ isJust minute
342− assert' ("resolvedOptions second: got Nothing") $ isJust second
343−