git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
More work on the Prelude
commit4c74822bfd9f030479864147064f4490f9fbf2ce authorPhil Freeman <paf31@cantab.net> dateThu 31 Oct 2013, 20:59 (13 years ago) parent1bb682b
2 files changed+107−16
libraries/prelude/prelude.js+13 libraries/prelude/prelude.ps+94−16
libraries/prelude/prelude.js+13
@@ -52,3 +52,16 @@ function map(f) {
5252 };
5353}
5454
55+function filter(xs) {
56+ return function (p) {
57+ var ys = [];
58+ var j = 0;
59+ for (var i = 0; i < xs.length; i++) {
60+ var x = xs[i];
61+ if (p(x)) {
62+ ys[j++] = x;
63+ }
64+ }
65+ return ys;
66+ };
67+}
libraries/prelude/prelude.ps+94−16
@@ -25,6 +25,21 @@ maybe = \b -> \f -> \m -> case m of
2525fromMaybe :: forall a. a -> Maybe a -> a
2626fromMaybe = \a -> maybe a id
2727
28+bindMaybe :: forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
29+bindMaybe = \m -> \f -> maybe Nothing f m
30+
31+-- Either
32+
33+data Either a b = Left a | Right b
34+
35+either :: forall a b c. (a -> c) -> (b -> c) -> Either a b -> c
36+either = \f -> \g -> \e -> case e of
37+ Left a -> f a
38+ Right b -> g b
39+
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)
42+
2843-- Arrays
2944
3045head :: forall a. [a] -> a
@@ -45,6 +60,20 @@ tailSafe = \xs -> case xs of
4560 [_:xs] -> Just xs
4661 _ -> Nothing
4762
63+extern map :: forall a b. (a -> b) -> [a] -> [b]
64+
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
68+ [] -> a
69+
70+foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
71+foldl = \f -> \b -> \as -> do
72+ var result = b
73+ foreach a in as:
74+ result = f a result
75+ return result
76+
4877extern length :: forall a. [a] -> Number
4978
5079extern indexOf :: forall a. [a] -> a -> Number
@@ -69,6 +98,71 @@ extern sort :: forall a. [a] -> [a]
6998
7099extern splice :: forall a. Number -> Number -> [a] -> [a] -> [a]
71100
101+cons :: forall a. a -> [a] -> [a]
102+cons = \a -> concat([a])
103+
104+concatMap :: forall a b. [a] -> (a -> [b]) -> [b]
105+concatMap = \as -> \f -> do
106+ var result = []
107+ foreach a in as:
108+ result = result `concat` f a
109+ return result
110+
111+extern filter :: forall a. [a] -> (a -> Boolean) -> [a]
112+
113+null :: forall a. [a] -> Boolean
114+null = \as -> case as of
115+ [] -> true
116+ _ -> false
117+
118+range :: Number -> Number -> [Number]
119+range = \lo -> \hi -> do
120+ var ns = []
121+ for n <- lo until hi:
122+ ns = push ns n
123+ return ns
124+
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)
128+ _ -> []
129+
130+any :: forall a. (a -> Boolean) -> [a] -> Boolean
131+any = \p -> \as -> do
132+ for i <- 0 until length as:
133+ if p as[i]:
134+ return true
135+ return false
136+
137+all :: forall a. (a -> Boolean) -> [a] -> Boolean
138+all = \p -> \as -> do
139+ for i <- 0 until length as:
140+ if !(p as[i]):
141+ return false
142+ return true
143+
144+-- Pairs
145+
146+type Tuple a b = { fst :: a ; snd :: b }
147+
148+curry :: forall a b c. (Tuple a b -> c) -> a -> b -> c
149+curry = \f -> \a -> \b -> f { fst: a, snd: b }
150+
151+uncurry :: forall a b c. (a -> b -> c) -> Tuple a b -> c
152+uncurry = \f -> \t -> f t.fst t.snd
153+
154+tuple :: forall a b. a -> b -> Tuple a b
155+tuple = curry id
156+
157+zip :: forall a b. [a] -> [b] -> [Tuple a b]
158+zip = zipWith tuple
159+
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)
164+ [] -> tuple [] []
165+
72166-- Strings
73167
74168extern lengthS :: String -> Number
@@ -165,19 +259,3 @@ type Math =
165259
166260extern math :: Math
167261
168−--
169−
170−extern map :: forall a b. (a -> b) -> [a] -> [b]
171−
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
175− [] -> a
176−
177−foldl :: forall a b. (a -> b -> b) -> b -> [a] -> b
178−foldl = \f -> \b -> \as -> do
179− var result = b
180− foreach a in as:
181− result = f a result
182− return result
183−