Skip to content

Commit 1d08a1e

Browse files
authored
Merge pull request #20 from pete-murphy/locale-sensitive-functions
feat: Add locale-sensitive functions
2 parents a9a08ba + c66eb39 commit 1d08a1e

File tree

10 files changed

+428
-28
lines changed

10 files changed

+428
-28
lines changed

src/JS/Intl/Collator.purs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ module JS.Intl.Collator
1313
, supportedLocalesOf_
1414
, compare
1515
, resolvedOptions
16+
17+
-- * Options
18+
, convertOptionsWithDefaults
1619
) where
1720

1821
import Prelude hiding (compare)
@@ -61,6 +64,20 @@ defaultOptions =
6164
, collation: Collation.toString Collation.Default
6265
}
6366

67+
convertOptionsWithDefaults
68+
:: forall provided all
69+
. ConvertOptionsWithDefaults
70+
ToCollatorOptions
71+
{ | CollatorOptions }
72+
provided
73+
all
74+
=> provided
75+
-> all
76+
convertOptionsWithDefaults =
77+
ConvertableOptions.convertOptionsWithDefaults
78+
ToCollatorOptions
79+
defaultOptions
80+
6481
foreign import _new
6582
:: EffectFn2
6683
(Array Locale)
@@ -89,10 +106,7 @@ new locales providedOptions =
89106
Effect.Uncurried.runEffectFn2
90107
_new
91108
locales
92-
options
93-
where
94-
options :: { | CollatorOptions }
95-
options = ConvertableOptions.convertOptionsWithDefaults ToCollatorOptions defaultOptions providedOptions
109+
(convertOptionsWithDefaults providedOptions)
96110

97111
instance ConvertOption ToCollatorOptions "localeMatcher" LocaleMatcher String where
98112
convertOption _ _ = LocaleMatcher.toString
@@ -150,10 +164,7 @@ supportedLocalesOf locales providedOptions =
150164
Function.Uncurried.runFn2
151165
_supportedLocalesOf
152166
locales
153-
options
154-
where
155-
options :: { | CollatorOptions }
156-
options = ConvertableOptions.convertOptionsWithDefaults ToCollatorOptions defaultOptions providedOptions
167+
(convertOptionsWithDefaults providedOptions)
157168

158169
supportedLocalesOf_
159170
:: Array Locale

src/JS/Intl/DateTimeFormat.purs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ module JS.Intl.DateTimeFormat
1616
, formatRangeToParts
1717
, formatToParts
1818
, resolvedOptions
19+
20+
-- * Options
21+
, convertOptionsWithDefaults
1922
) where
2023

2124
import Prelude
@@ -92,6 +95,20 @@ defaultOptions :: { | DateTimeFormatOptions }
9295
defaultOptions =
9396
Unsafe.Coerce.unsafeCoerce {}
9497

98+
convertOptionsWithDefaults
99+
:: forall provided all
100+
. ConvertOptionsWithDefaults
101+
ToDateTimeFormatOptions
102+
{ | DateTimeFormatOptions }
103+
provided
104+
all
105+
=> provided
106+
-> all
107+
convertOptionsWithDefaults =
108+
ConvertableOptions.convertOptionsWithDefaults
109+
ToDateTimeFormatOptions
110+
defaultOptions
111+
95112
foreign import _new
96113
:: EffectFn2
97114
(Array Locale)
@@ -116,14 +133,11 @@ new
116133
=> Array Locale
117134
-> { | provided }
118135
-> Effect DateTimeFormat
119-
new locales provided =
136+
new locales providedOptions =
120137
Effect.Uncurried.runEffectFn2
121138
_new
122139
locales
123-
options
124-
where
125-
options :: { | DateTimeFormatOptions }
126-
options = ConvertableOptions.convertOptionsWithDefaults ToDateTimeFormatOptions defaultOptions provided
140+
(convertOptionsWithDefaults providedOptions)
127141

128142
instance ConvertOption ToDateTimeFormatOptions "localeMatcher" LocaleMatcher String where
129143
convertOption _ _ = LocaleMatcher.toString
@@ -240,14 +254,11 @@ supportedLocalesOf
240254
=> Array Locale
241255
-> { | provided }
242256
-> Array String
243-
supportedLocalesOf locales provided =
257+
supportedLocalesOf locales providedOptions =
244258
Function.Uncurried.runFn2
245259
_supportedLocalesOf
246260
locales
247-
options
248-
where
249-
options :: { | DateTimeFormatOptions }
250-
options = ConvertableOptions.convertOptionsWithDefaults ToDateTimeFormatOptions defaultOptions provided
261+
(convertOptionsWithDefaults providedOptions)
251262

252263
supportedLocalesOf_
253264
:: Array Locale

src/JS/Intl/NumberFormat.purs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ module JS.Intl.NumberFormat
1616
, formatRangeToParts
1717
, formatToParts
1818
, resolvedOptions
19+
20+
-- * Options
21+
, convertOptionsWithDefaults
1922
) where
2023

2124
import Prelude
@@ -95,6 +98,20 @@ defaultOptions :: { | NumberFormatOptions }
9598
defaultOptions =
9699
Unsafe.Coerce.unsafeCoerce {}
97100

101+
convertOptionsWithDefaults
102+
:: forall provided all
103+
. ConvertOptionsWithDefaults
104+
ToNumberFormatOptions
105+
{ | NumberFormatOptions }
106+
provided
107+
all
108+
=> provided
109+
-> all
110+
convertOptionsWithDefaults =
111+
ConvertableOptions.convertOptionsWithDefaults
112+
ToNumberFormatOptions
113+
defaultOptions
114+
98115
foreign import _new
99116
:: EffectFn2
100117
(Array Locale)
@@ -113,14 +130,11 @@ new
113130
=> Array Locale
114131
-> { | provided }
115132
-> Effect NumberFormat
116-
new locales provided =
133+
new locales providedOptions =
117134
Effect.Uncurried.runEffectFn2
118135
_new
119136
locales
120-
options
121-
where
122-
options :: { | NumberFormatOptions }
123-
options = ConvertableOptions.convertOptionsWithDefaults ToNumberFormatOptions defaultOptions provided
137+
(convertOptionsWithDefaults providedOptions)
124138

125139
instance ConvertOption ToNumberFormatOptions "localeMatcher" LocaleMatcher String where
126140
convertOption _ _ = LocaleMatcher.toString
@@ -262,14 +276,11 @@ supportedLocalesOf
262276
=> Array Locale
263277
-> { | provided }
264278
-> Array String
265-
supportedLocalesOf locales provided =
279+
supportedLocalesOf locales providedOptions =
266280
Function.Uncurried.runFn2
267281
_supportedLocalesOf
268282
locales
269-
options
270-
where
271-
options :: { | NumberFormatOptions }
272-
options = ConvertableOptions.convertOptionsWithDefaults ToNumberFormatOptions defaultOptions provided
283+
(convertOptionsWithDefaults providedOptions)
273284

274285
supportedLocalesOf_
275286
:: Array Locale

src/JS/LocaleSensitive/Date.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"use strict";
2+
3+
export function _toLocaleString(locales, options, date) {
4+
return date.toLocaleString(locales, options);
5+
}
6+
7+
export function _toLocaleDateString(locales, options, date) {
8+
return date.toLocaleDateString(locales, options);
9+
}
10+
11+
export function _toLocaleTimeString(locales, options, date) {
12+
return date.toLocaleTimeString(locales, options);
13+
}

src/JS/LocaleSensitive/Date.purs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
module JS.LocaleSensitive.Date
2+
( toLocaleString
3+
, toLocaleDateString
4+
, toLocaleTimeString
5+
) where
6+
7+
import ConvertableOptions (class ConvertOptionsWithDefaults)
8+
import Data.DateTime (DateTime)
9+
import Data.JSDate (JSDate)
10+
import Data.JSDate as JSDate
11+
import Effect (Effect)
12+
import Effect.Uncurried (EffectFn3)
13+
import Effect.Uncurried as Effect.Uncurried
14+
import JS.Intl.DateTimeFormat (DateTimeFormatOptions, ToDateTimeFormatOptions)
15+
import JS.Intl.DateTimeFormat as DateTimeFormat
16+
import JS.Intl.Locale (Locale)
17+
18+
foreign import _toLocaleString
19+
:: EffectFn3
20+
(Array Locale)
21+
{ | DateTimeFormatOptions }
22+
JSDate
23+
String
24+
25+
foreign import _toLocaleDateString
26+
:: EffectFn3
27+
(Array Locale)
28+
{ | DateTimeFormatOptions }
29+
JSDate
30+
String
31+
32+
foreign import _toLocaleTimeString
33+
:: EffectFn3
34+
(Array Locale)
35+
{ | DateTimeFormatOptions }
36+
JSDate
37+
String
38+
39+
-- | Returns a string with a language-sensitive representation of a date and
40+
-- | time in the user agent's timezone.
41+
-- | When formatting large numbers of dates, it is better to use
42+
-- | `Intl.DateTimeFormat.format`.
43+
toLocaleString
44+
:: forall provided
45+
. ConvertOptionsWithDefaults
46+
ToDateTimeFormatOptions
47+
{ | DateTimeFormatOptions }
48+
{ | provided }
49+
{ | DateTimeFormatOptions }
50+
=> Array Locale
51+
-> { | provided }
52+
-> DateTime
53+
-> Effect String
54+
toLocaleString locales providedOptions dateTime =
55+
Effect.Uncurried.runEffectFn3
56+
_toLocaleString
57+
locales
58+
(DateTimeFormat.convertOptionsWithDefaults providedOptions)
59+
(JSDate.fromDateTime dateTime)
60+
61+
-- | Returns a string with a language-sensitive representation of a date in the
62+
-- | user agent's timezone.
63+
-- | When formatting large numbers of dates, it is better to use
64+
-- | `Intl.DateTimeFormat.format`.
65+
toLocaleDateString
66+
:: forall provided
67+
. ConvertOptionsWithDefaults
68+
ToDateTimeFormatOptions
69+
{ | DateTimeFormatOptions }
70+
{ | provided }
71+
{ | DateTimeFormatOptions }
72+
=> Array Locale
73+
-> { | provided }
74+
-> DateTime
75+
-> Effect String
76+
toLocaleDateString locales providedOptions dateTime =
77+
Effect.Uncurried.runEffectFn3
78+
_toLocaleDateString
79+
locales
80+
(DateTimeFormat.convertOptionsWithDefaults providedOptions)
81+
(JSDate.fromDateTime dateTime)
82+
83+
-- | Returns a string with a language-sensitive representation of a time in the
84+
-- | user agent's timezone.
85+
-- | When formatting large numbers of dates, it is better to use
86+
-- | `Intl.DateTimeFormat.format`.
87+
toLocaleTimeString
88+
:: forall provided
89+
. ConvertOptionsWithDefaults
90+
ToDateTimeFormatOptions
91+
{ | DateTimeFormatOptions }
92+
{ | provided }
93+
{ | DateTimeFormatOptions }
94+
=> Array Locale
95+
-> { | provided }
96+
-> DateTime
97+
-> Effect String
98+
toLocaleTimeString locales providedOptions dateTime =
99+
Effect.Uncurried.runEffectFn3
100+
_toLocaleTimeString
101+
locales
102+
(DateTimeFormat.convertOptionsWithDefaults providedOptions)
103+
(JSDate.fromDateTime dateTime)

src/JS/LocaleSensitive/Number.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"use strict";
2+
3+
export function _toLocaleString(locales, options, number) {
4+
return number.toLocaleString(locales, options);
5+
}

src/JS/LocaleSensitive/Number.purs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module JS.LocaleSensitive.Number
2+
( toLocaleString
3+
) where
4+
5+
import ConvertableOptions (class ConvertOptionsWithDefaults)
6+
import Effect (Effect)
7+
import Effect.Uncurried (EffectFn3)
8+
import Effect.Uncurried as Effect.Uncurried
9+
import JS.Intl.Locale (Locale)
10+
import JS.Intl.NumberFormat (NumberFormatOptions, ToNumberFormatOptions)
11+
import JS.Intl.NumberFormat as NumberFormat
12+
13+
foreign import _toLocaleString
14+
:: EffectFn3
15+
(Array Locale)
16+
{ | NumberFormatOptions }
17+
Number
18+
String
19+
20+
-- | Returns a string with a language-sensitive representation of this number.
21+
-- | When formatting large numbers of numbers, it is better to use
22+
-- | `Intl.NumberFormat.format` instead.
23+
toLocaleString
24+
:: forall provided
25+
. ConvertOptionsWithDefaults
26+
ToNumberFormatOptions
27+
{ | NumberFormatOptions }
28+
{ | provided }
29+
{ | NumberFormatOptions }
30+
=> Array Locale
31+
-> { | provided }
32+
-> Number
33+
-> Effect String
34+
toLocaleString locales providedOptions =
35+
Effect.Uncurried.runEffectFn3
36+
_toLocaleString
37+
locales
38+
(NumberFormat.convertOptionsWithDefaults providedOptions)

src/JS/LocaleSensitive/String.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"use strict";
2+
3+
export function _localeCompare(locales, options, a, b) {
4+
return a.localeCompare(b, locales, options);
5+
}
6+
7+
export function _toLocaleLowerCase(locales, string) {
8+
return string.toLocaleLowerCase(locales);
9+
}
10+
11+
export function _toLocaleUpperCase(locales, string) {
12+
return string.toLocaleUpperCase(locales);
13+
}

0 commit comments

Comments
 (0)