@@ -1,263 +1,265 @@
1−id :: forall a. a -> a
2−id = \x -> x
1+module Prelude where
32
4−flip :: forall a b c. (a -> b -> c) -> b -> a -> c
5−flip = \f -> \b -> \a -> f a b
3+ id :: forall a. a -> a
4+ id = \x -> x
65
7−konst :: forall a b. a -> b -> a
8−konst = \a -> \b -> a
6+ flip :: forall a b c. (a -> b -> c) -> b -> a -> c
7+ flip = \f -> \b -> \a -> f a b
98
10−(|>) :: forall a b c. (a -> b) -> (b -> c) -> a -> c
11−(|>) = \f -> \g -> \a -> g (f a)
9+ konst :: forall a b. a -> b -> a
10+ konst = \a -> \b -> a
1211
13−(<|) :: forall a b c. (b -> c) -> (a -> b) -> a -> c
14−(<|) = flip (|>)
12+ (|>) :: forall a b c. (a -> b) -> (b -> c) -> a -> c
13+ (|>) = \f -> \g -> \a -> g (f a)
1514
16−-- Maybe
15+ (<|) :: forall a b c. (b -> c) -> (a -> b) -> a -> c
16+ (<|) = flip (|>)
1717
18−data Maybe a = Nothing | Just a
18+ -- Maybe
1919
20−maybe :: forall a b. b -> (a -> b) -> Maybe a -> b
21−maybe b _ Nothing = b
22−maybe _ f (Just a) = f a
20+ data Maybe a = Nothing | Just a
2321
24−fromMaybe :: forall a. a -> Maybe a -> a
25−fromMaybe a = maybe a id
22+ maybe :: forall a b. b -> (a -> b) -> Maybe a -> b
23+ maybe b _ Nothing = b
24+ maybe _ f (Just a) = f a
2625
27−bindMaybe :: forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
28−bindMaybe m f = maybe Nothing f m
26+ fromMaybe :: forall a. a -> Maybe a -> a
27+ fromMaybe a = maybe a id
2928
30−-- Either
29+ bindMaybe :: forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
30+ bindMaybe m f = maybe Nothing f m
3131
32−data Either a b = Left a | Right b
32+ -- Either
3333
34−either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
35−either f _ (Left a) = f a
36−either _ g (Right b) = g b
34+ data Either a b = Left a | Right b
3735
38−bindEither :: forall e a b. Either e a -> (a -> Either e b) -> Either e b
39−bindEither = either (\e _ -> Left e) (\a f -> f a)
36+ either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
37+ either f _ (Left a) = f a
38+ either _ g (Right b) = g b
4039
41−-- Arrays
40+ bindEither :: forall e a b. Either e a -> (a -> Either e b) -> Either e b
41+ bindEither = either (\e _ -> Left e) (\a f -> f a)
4242
43−head :: forall a. [a] -> a
44−head (x : _) = x
43+ -- Arrays
4544
46−headSafe :: forall a. [a] -> Maybe a
47−headSafe (x : _) = Just x
48−headSafe _ = Nothing
45+ head :: forall a. [a] -> a
46+ head (x : _) = x
4947
50−tail :: forall a. [a] -> [a]
51−tail (_ : xs) = xs
48+ headSafe :: forall a. [a] -> Maybe a
49+ headSafe (x : _) = Just x
50+ headSafe _ = Nothing
5251
53−tailSafe :: forall a. [a] -> Maybe [a]
54−tailSafe (_ : xs) = Just xs
55−tailSafe _ = Nothing
52+ tail :: forall a. [a] -> [a]
53+ tail (_ : xs) = xs
5654
57−foreign import map :: forall a b. (a -> b) -> [a] -> [b]
55+ tailSafe :: forall a. [a] -> Maybe [a]
56+ tailSafe (_ : xs) = Just xs
57+ tailSafe _ = Nothing
5858
59−foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
60−foldr f a (b : bs) = f (foldr f a bs) b
61−foldr _ a [] = a
59+ foreign import map :: forall a b. (a -> b) -> [a] -> [b]
6260
63−foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
64−foldl f b as = {
65− var result = b;
66− foreach (a in as) {
67− result = f a result;
61+ foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
62+ foldr f a (b : bs) = f (foldr f a bs) b
63+ foldr _ a [] = a
64+
65+ foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
66+ foldl f b as = {
67+ var result = b;
68+ foreach (a in as) {
69+ result = f a result;
70+ }
71+ return result;
6872 }
69− return result;
70− }
7173
72−foreign import member "length" length :: forall a. [a] -> Number
74+ foreign import member "length" length :: forall a. [a] -> Number
7375
74−foreign import indexOf :: forall a. [a] -> a -> Number
76+ foreign import indexOf :: forall a. [a] -> a -> Number
7577
76−foreign import lastIndexOf :: forall a. [a] -> a -> Number
78+ foreign import lastIndexOf :: forall a. [a] -> a -> Number
7779
78−foreign import concat :: forall a. [a] -> [a] -> [a]
80+ foreign import concat :: forall a. [a] -> [a] -> [a]
7981
80−foreign import join :: [String] -> String
82+ foreign import join :: [String] -> String
8183
82−foreign import joinWith :: [String] -> String -> String
84+ foreign import joinWith :: [String] -> String -> String
8385
84−foreign import push :: forall a. [a] -> a -> [a]
86+ foreign import push :: forall a. [a] -> a -> [a]
8587
86−foreign import reverse :: forall a. [a] -> [a]
88+ foreign import reverse :: forall a. [a] -> [a]
8789
88−foreign import shift :: forall a. [a] -> [a]
90+ foreign import shift :: forall a. [a] -> [a]
8991
90−foreign import slice :: forall a. Number -> Number -> [a] -> [a]
92+ foreign import slice :: forall a. Number -> Number -> [a] -> [a]
9193
92−foreign import sort :: forall a. [a] -> [a]
94+ foreign import sort :: forall a. [a] -> [a]
9395
94−foreign import splice :: forall a. Number -> Number -> [a] -> [a] -> [a]
96+ foreign import splice :: forall a. Number -> Number -> [a] -> [a] -> [a]
9597
96−cons :: forall a. a -> [a] -> [a]
97−cons = \a -> concat([a])
98+ cons :: forall a. a -> [a] -> [a]
99+ cons = \a -> concat([a])
98100
99−concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
100−concatMap as f = {
101− var result = [];
102− foreach (a in as) {
103− result = result `concat` f a;
101+ concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
102+ concatMap as f = {
103+ var result = [];
104+ foreach (a in as) {
105+ result = result `concat` f a;
106+ }
107+ return result;
104108 }
105− return result;
106− }
107109
108−foreign import filter :: forall a. [a] -> (a -> Boolean) -> [a]
110+ foreign import filter :: forall a. [a] -> (a -> Boolean) -> [a]
109111
110−empty :: forall a. [a] -> Boolean
111−empty [] = true
112−empty _ = false
112+ empty :: forall a. [a] -> Boolean
113+ empty [] = true
114+ empty _ = false
113115
114−range :: Number -> Number -> [Number]
115−range lo hi = {
116− var ns = [];
117− for (n <- lo until hi) {
118− ns = push ns n;
116+ range :: Number -> Number -> [Number]
117+ range lo hi = {
118+ var ns = [];
119+ for (n <- lo until hi) {
120+ ns = push ns n;
121+ }
122+ return ns;
119123 }
120− return ns;
121− }
122−
123−zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
124−zipWith f (a:as) (b:bs) = cons (f a b) (zipWith f as bs)
125−zipWith _ _ _ = []
126−
127−any :: forall a. (a -> Boolean) -> [a] -> Boolean
128−any p as = {
129− for (i <- 0 until length as) {
130− if (p (as !! i)) {
131− return true;
124+
125+ zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
126+ zipWith f (a:as) (b:bs) = cons (f a b) (zipWith f as bs)
127+ zipWith _ _ _ = []
128+
129+ any :: forall a. (a -> Boolean) -> [a] -> Boolean
130+ any p as = {
131+ for (i <- 0 until length as) {
132+ if (p (as !! i)) {
133+ return true;
134+ }
132135 }
136+ return false;
133137 }
134− return false;
135− }
136−
137−all :: forall a. (a -> Boolean) -> [a] -> Boolean
138−all p as = {
139− for (i <- 0 until length as) {
140− if (!(p (as !! i))) {
141− return false;
138+
139+ all :: forall a. (a -> Boolean) -> [a] -> Boolean
140+ all p as = {
141+ for (i <- 0 until length as) {
142+ if (!(p (as !! i))) {
143+ return false;
144+ }
142145 }
146+ return true;
143147 }
144− return true;
145− }
146148
147−-- Pairs
149+ -- Pairs
148150
149−type Tuple a b = { fst :: a, snd :: b }
151+ type Tuple a b = { fst :: a, snd :: b }
150152
151−curry :: forall a b c. (Tuple a b -> c) -> a -> b -> c
152−curry f a b = f { fst: a, snd: b }
153+ curry :: forall a b c. (Tuple a b -> c) -> a -> b -> c
154+ curry f a b = f { fst: a, snd: b }
153155
154−uncurry :: forall a b c. (a -> b -> c) -> Tuple a b -> c
155−uncurry f t = f t.fst t.snd
156+ uncurry :: forall a b c. (a -> b -> c) -> Tuple a b -> c
157+ uncurry f t = f t.fst t.snd
156158
157−tuple :: forall a b. a -> b -> Tuple a b
158−tuple = curry id
159+ tuple :: forall a b. a -> b -> Tuple a b
160+ tuple = curry id
159161
160−zip :: forall a b. [a] -> [b] -> [Tuple a b]
161−zip = zipWith tuple
162+ zip :: forall a b. [a] -> [b] -> [Tuple a b]
163+ zip = zipWith tuple
162164
163−unzip :: forall a b. [Tuple a b] -> Tuple [a] [b]
164−unzip (t:ts) = case unzip ts of
165− { fst = as, snd = bs } -> tuple (cons t.fst as) (cons t.snd bs)
166−unzip [] = tuple [] []
165+ unzip :: forall a b. [Tuple a b] -> Tuple [a] [b]
166+ unzip (t:ts) = case unzip ts of
167+ { fst = as, snd = bs } -> tuple (cons t.fst as) (cons t.snd bs)
168+ unzip [] = tuple [] []
167169
168−-- Strings
170+ -- Strings
169171
170−foreign import member "length" lengthS :: String -> Number
172+ foreign import member "length" lengthS :: String -> Number
171173
172−foreign import charAt :: Number -> String -> String
174+ foreign import charAt :: Number -> String -> String
173175
174−foreign import indexOfS :: String -> String -> Number
176+ foreign import indexOfS :: String -> String -> Number
175177
176−foreign import lastIndexOfS :: String -> String -> Number
178+ foreign import lastIndexOfS :: String -> String -> Number
177179
178−foreign import localeCompare :: String -> String -> Number
180+ foreign import localeCompare :: String -> String -> Number
179181
180−foreign import replace :: String -> String -> String -> String
182+ foreign import replace :: String -> String -> String -> String
181183
182−foreign import sliceS :: Number -> Number -> String -> String
184+ foreign import sliceS :: Number -> Number -> String -> String
183185
184−foreign import split :: String -> String -> [String]
186+ foreign import split :: String -> String -> [String]
185187
186−foreign import substr :: Number -> Number -> String -> String
188+ foreign import substr :: Number -> Number -> String -> String
187189
188−foreign import substring :: Number -> Number -> String -> String
190+ foreign import substring :: Number -> Number -> String -> String
189191
190−foreign import toLower :: String -> String
192+ foreign import toLower :: String -> String
191193
192−foreign import toUpper :: String -> String
194+ foreign import toUpper :: String -> String
193195
194−foreign import trim :: String -> String
196+ foreign import trim :: String -> String
195197
196−-- Regex
198+ -- Regex
197199
198−foreign import data Regex :: *
200+ foreign import data Regex :: *
199201
200−foreign import regex :: String -> String -> Regex
202+ foreign import regex :: String -> String -> Regex
201203
202−foreign import test :: Regex -> String -> Boolean
204+ foreign import test :: Regex -> String -> Boolean
203205
204−foreign import match :: Regex -> String -> [String]
206+ foreign import match :: Regex -> String -> [String]
205207
206−foreign import replaceR :: Regex -> String -> String -> String
208+ foreign import replaceR :: Regex -> String -> String -> String
207209
208−foreign import search :: Regex -> String -> Number
210+ foreign import search :: Regex -> String -> Number
209211
210−-- Globals
212+ -- Globals
211213
212−foreign import nan :: Number
214+ foreign import nan :: Number
213215
214−foreign import infinity :: Number
216+ foreign import infinity :: Number
215217
216−foreign import toExponential :: Number -> String
218+ foreign import toExponential :: Number -> String
217219
218−foreign import toFixed :: Number -> Number -> String
220+ foreign import toFixed :: Number -> Number -> String
219221
220−foreign import toPrecision :: Number -> Number -> String
222+ foreign import toPrecision :: Number -> Number -> String
221223
222−foreign import numberToString :: Number -> String
224+ foreign import numberToString :: Number -> String
223225
224−foreign import isNaN :: Number -> Boolean
226+ foreign import isNaN :: Number -> Boolean
225227
226−foreign import isFinite :: Number -> Boolean
228+ foreign import isFinite :: Number -> Boolean
227229
228−foreign import parseFloat :: String -> Number
230+ foreign import parseFloat :: String -> Number
229231
230−foreign import parseInt :: String -> Number
232+ foreign import parseInt :: String -> Number
231233
232−foreign import encodeURIComponent :: String -> String
234+ foreign import encodeURIComponent :: String -> String
233235
234−foreign import decodeURIComponent :: String -> String
236+ foreign import decodeURIComponent :: String -> String
235237
236−foreign import encodeURI :: String -> String
238+ foreign import encodeURI :: String -> String
237239
238−foreign import decodeURI :: String -> String
240+ foreign import decodeURI :: String -> String
239241
240−-- Math
242+ -- Math
241243
242−type Math =
243− { abs :: Number -> Number
244− , acos :: Number -> Number
245− , asin :: Number -> Number
246− , atan :: Number -> Number
247− , atan2 :: (Number, Number) -> Number
248− , aceil :: Number -> Number
249− , cos :: Number -> Number
250− , exp :: Number -> Number
251− , floor :: Number -> Number
252− , log :: Number -> Number
253− , max :: (Number, Number) -> Number
254− , pow :: (Number, Number) -> Number
255− , random :: () -> Number
256− , round :: Number -> Number
257− , sin :: Number -> Number
258− , sqrt :: Number -> Number
259− , tan :: Number -> Number
260− }
244+ type Math =
245+ { abs :: Number -> Number
246+ , acos :: Number -> Number
247+ , asin :: Number -> Number
248+ , atan :: Number -> Number
249+ , atan2 :: (Number, Number) -> Number
250+ , aceil :: Number -> Number
251+ , cos :: Number -> Number
252+ , exp :: Number -> Number
253+ , floor :: Number -> Number
254+ , log :: Number -> Number
255+ , max :: (Number, Number) -> Number
256+ , pow :: (Number, Number) -> Number
257+ , random :: () -> Number
258+ , round :: Number -> Number
259+ , sin :: Number -> Number
260+ , sqrt :: Number -> Number
261+ , tan :: Number -> Number
262+ }
261263
262−foreign import math :: Math
264+ foreign import math :: Math
263265