-
Notifications
You must be signed in to change notification settings - Fork 0
/
Collator.purs
199 lines (168 loc) · 5.21 KB
/
Collator.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
module JS.Intl.Collator
-- * Types
( Collator
, CollatorOptions
, ToCollatorOptions
-- * Constructor
, new
, new_
-- * Methods
, supportedLocalesOf
, supportedLocalesOf_
, compare
, resolvedOptions
) where
import Prelude hiding (compare)
import ConvertableOptions (class ConvertOption, class ConvertOptionsWithDefaults)
import ConvertableOptions as ConvertableOptions
import Data.Function.Uncurried (Fn2, Fn3)
import Data.Function.Uncurried as Function.Uncurried
import Effect (Effect)
import Effect.Uncurried (EffectFn1, EffectFn2)
import Effect.Uncurried as Effect.Uncurried
import JS.Intl.Locale (Locale)
import JS.Intl.Options.CaseFirst (CaseFirst)
import JS.Intl.Options.CaseFirst as CaseFirst
import JS.Intl.Options.Collation (Collation)
import JS.Intl.Options.Collation as Collation
import JS.Intl.Options.LocaleMatcher (LocaleMatcher)
import JS.Intl.Options.LocaleMatcher as LocaleMatcher
import JS.Intl.Options.Sensitivity (Sensitivity)
import JS.Intl.Options.Sensitivity as Sensitivity
import JS.Intl.Options.Usage (Usage)
import JS.Intl.Options.Usage as Usage
import Prelude (compare) as Prelude
-- | Language-sensitive string comparison
foreign import data Collator :: Type
type CollatorOptions =
( localeMatcher :: String
, usage :: String
, sensitivity :: String
, ignorePunctuation :: Boolean
, numeric :: Boolean
, caseFirst :: String
, collation :: String
)
defaultOptions :: { | CollatorOptions }
defaultOptions =
{ localeMatcher: LocaleMatcher.toString LocaleMatcher.BestFit
, usage: Usage.toString Usage.Sort
, sensitivity: Sensitivity.toString Sensitivity.Variant
, ignorePunctuation: false
, numeric: false
, caseFirst: CaseFirst.toString CaseFirst.False
, collation: Collation.toString Collation.Default
}
foreign import _new
:: EffectFn2
(Array Locale)
{ | CollatorOptions }
Collator
new_
:: Array Locale
-> Effect Collator
new_ locales =
new locales defaultOptions
data ToCollatorOptions = ToCollatorOptions
new
:: forall provided
. ConvertOptionsWithDefaults
ToCollatorOptions
{ | CollatorOptions }
{ | provided }
{ | CollatorOptions }
=> Array Locale
-> { | provided }
-> Effect Collator
new locales providedOptions =
Effect.Uncurried.runEffectFn2
_new
locales
options
where
options :: { | CollatorOptions }
options = ConvertableOptions.convertOptionsWithDefaults ToCollatorOptions defaultOptions providedOptions
instance ConvertOption ToCollatorOptions "localeMatcher" LocaleMatcher String where
convertOption _ _ = LocaleMatcher.toString
instance ConvertOption ToCollatorOptions "localeMatcher" String String where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "usage" Usage String where
convertOption _ _ = Usage.toString
instance ConvertOption ToCollatorOptions "usage" String String where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "sensitivity" Sensitivity String where
convertOption _ _ = Sensitivity.toString
instance ConvertOption ToCollatorOptions "sensitivity" String String where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "caseFirst" CaseFirst String where
convertOption _ _ = CaseFirst.toString
instance ConvertOption ToCollatorOptions "caseFirst" String String where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "collation" Collation String where
convertOption _ _ = Collation.toString
instance ConvertOption ToCollatorOptions "collation" String String where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "numeric" Boolean Boolean where
convertOption _ _ = identity
instance ConvertOption ToCollatorOptions "ignorePunctuation" Boolean Boolean where
convertOption _ _ = identity
foreign import _supportedLocalesOf
:: Fn2
(Array Locale)
{ | CollatorOptions }
(Array String)
supportedLocalesOf
:: forall provided
. ConvertOptionsWithDefaults
ToCollatorOptions
{ | CollatorOptions }
{ | provided }
{ | CollatorOptions }
=> Array Locale
-> { | provided }
-> Array String
supportedLocalesOf locales providedOptions =
Function.Uncurried.runFn2
_supportedLocalesOf
locales
options
where
options :: { | CollatorOptions }
options = ConvertableOptions.convertOptionsWithDefaults ToCollatorOptions defaultOptions providedOptions
supportedLocalesOf_
:: Array Locale
-> Array String
supportedLocalesOf_ locales =
supportedLocalesOf locales {}
foreign import _compare
:: Fn3
Collator
String
String
Number
-- | Compare two strings according to the sort order of the `Collator`
compare
:: Collator
-> String
-> String
-> Ordering
compare collator x y = do
Prelude.compare (Function.Uncurried.runFn3 _compare collator x y) 0.0
type ResolvedOptions =
{ locale :: String
, usage :: String
, sensitivity :: String
, ignorePunctuation :: Boolean
, numeric :: Boolean
, caseFirst :: String
, collation :: String
}
foreign import _resolvedOptions
:: EffectFn1
Collator
ResolvedOptions
resolvedOptions
:: Collator
-> Effect ResolvedOptions
resolvedOptions collator =
Effect.Uncurried.runEffectFn1 _resolvedOptions collator