@@ -25,6 +25,21 @@ maybe = \b -> \f -> \m -> case m of
25fromMaybe :: forall a. a -> Maybe a -> a
25fromMaybe :: forall a. a -> Maybe a -> a
26fromMaybe = \a -> maybe a id
26fromMaybe = \a -> maybe a id
28+bindMaybe :: forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
29+bindMaybe = \m -> \f -> maybe Nothing f m
33+data Either a b = Left a | Right b
35+either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
36+either = \f -> \g -> \e -> case e of
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)
30head :: forall a. [a] -> a
45head :: forall a. [a] -> a
@@ -45,6 +60,20 @@ tailSafe = \xs -> case xs of
45 [_:xs] -> Just xs
60 [_:xs] -> Just xs
46 _ -> Nothing
61 _ -> Nothing
63+extern map :: forall a b. (a -> b) -> [a] -> [b]
65+foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
66+foldr = \f -> \a -> \bs -> case bs of
67+ [b:bs] -> f (foldr f a bs) b
70+foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
71+foldl = \f -> \b -> \as -> do
48extern length :: forall a. [a] -> Number
77extern length :: forall a. [a] -> Number
50extern indexOf :: forall a. [a] -> a -> Number
79extern indexOf :: forall a. [a] -> a -> Number
@@ -69,6 +98,71 @@ extern sort :: forall a. [a] -> [a]
70extern splice :: forall a. Number -> Number -> [a] -> [a] -> [a]
99extern splice :: forall a. Number -> Number -> [a] -> [a] -> [a]
101+cons :: forall a. a -> [a] -> [a]
102+cons = \a -> concat([a])
104+concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
105+concatMap = \as -> \f -> do
108+ result = result `concat` f a
111+extern filter :: forall a. [a] -> (a -> Boolean) -> [a]
113+null :: forall a. [a] -> Boolean
114+null = \as -> case as of
118+range :: Number -> Number -> [Number]
119+range = \lo -> \hi -> do
121+ for n <- lo until hi:
125+zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
126+zipWith = \f -> \as -> \bs -> case { as: as, bs: bs } of
127+ { as = [a:as1], bs = [b:bs1] } -> cons (f a b) (zipWith f as1 bs1)
130+any :: forall a. (a -> Boolean) -> [a] -> Boolean
131+any = \p -> \as -> do
132+ for i <- 0 until length as:
137+all :: forall a. (a -> Boolean) -> [a] -> Boolean
138+all = \p -> \as -> do
139+ for i <- 0 until length as:
146+type Tuple a b = { fst :: a ; snd :: b }
148+curry :: forall a b c. (Tuple a b -> c) -> a -> b -> c
149+curry = \f -> \a -> \b -> f { fst: a, snd: b }
151+uncurry :: forall a b c. (a -> b -> c) -> Tuple a b -> c
152+uncurry = \f -> \t -> f t.fst t.snd
154+tuple :: forall a b. a -> b -> Tuple a b
157+zip :: forall a b. [a] -> [b] -> [Tuple a b]
160+unzip :: forall a b. [Tuple a b] -> Tuple [a] [b]
161+unzip = \ts -> case ts of
162+ [t:ts1] -> case unzip ts1 of
163+ { fst = as, snd = bs } -> tuple (cons t.fst as) (cons t.snd bs)
72-- Strings
166-- Strings
74extern lengthS :: String -> Number
168extern lengthS :: String -> Number
@@ -165,19 +259,3 @@ type Math =
166extern math :: Math
260extern math :: Math
170−extern map :: forall a b. (a -> b) -> [a] -> [b]
172−foldr :: forall a b. (a -> b -> a) -> a -> [b] -> a
173−foldr = \f -> \a -> \bs -> case bs of
174− [b:bs] -> f (foldr f a bs) b
177−foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
178−foldl = \f -> \b -> \as -> do