1- module Data.Array
2- ( (:)
3- , singleton
4- , head
5- , tail
6- , map
7- , length
8- , indexOf
9- , lastIndexOf
10- , concat
11- , joinWith
12- , reverse
13- , drop
14- , take
15- , slice
16- , insertAt
17- , deleteAt
18- , updateAt
19- , concatMap
20- , filter
21- , isEmpty
22- , range
23- , zipWith
24- , nub
25- , nubBy
26- , sort
27- ) where
1+ module Data.Array where
282
293import Prelude
304import Data.Maybe
31-
32- infixr 6 :
33-
34- (:) :: forall a . a -> [a ] -> [a ]
35- (:) a = concat [a]
36-
37- singleton :: forall a . a -> [a ]
38- singleton a = [a]
5+ import Data.Monoid
396
407head :: forall a . [a ] -> Maybe a
418head (x : _) = Just x
@@ -45,90 +12,91 @@ tail :: forall a. [a] -> Maybe [a]
4512tail (_ : xs) = Just xs
4613tail _ = Nothing
4714
48- foreign import map
49- " function map (f) {\
50- \ return function (arr) {\
51- \ var l = arr.length;\
52- \ var result = new Array(l);\
53- \ for (var i = 0; i < l; i++) {\
54- \ result[i] = f(arr[i]);\
55- \ }\
56- \ return result;\
57- \ };\
58- \}" :: forall a b . (a -> b ) -> [a ] -> [b ]
15+ map :: forall a b . (a -> b ) -> [a ] -> [b ]
16+ map _ [] = []
17+ map f (x:xs) = f x : map f xs
5918
6019foreign import length
61- " function length (xs) {\
20+ " function length(xs) {\
6221 \ return xs.length;\
6322 \}" :: forall a . [a ] -> Number
6423
6524foreign import indexOf
66- " function indexOf (l) {\
25+ " function indexOf(l) {\
6726 \ return function (e) {\
6827 \ return l.indexOf(e);\
6928 \ };\
7029 \}" :: forall a . [a ] -> a -> Number
7130
72- foreign import elem
73- " function elem(l) {\
74- \ return function (e) {\
75- \ return l.indexOf(e) !== -1;\
76- \ };\
77- \}" :: forall a . [a ] -> a -> Boolean
78-
7931foreign import lastIndexOf
80- " function lastIndexOf (l) {\
32+ " function lastIndexOf(l) {\
8133 \ return function (e) {\
8234 \ return l.lastIndexOf(e);\
8335 \ };\
8436 \}" :: forall a . [a ] -> a -> Number
8537
8638foreign import concat
87- " function concat (l1) {\
39+ " function concat(l1) {\
8840 \ return function (l2) {\
8941 \ return l1.concat(l2);\
9042 \ };\
9143 \}" :: forall a . [a ] -> [a ] -> [a ]
9244
45+ foreign import joinS
46+ " function joinS(l) {\
47+ \ return l.join();\
48+ \}" :: [String ] -> String
49+
9350foreign import joinWith
94- " function joinWith (l) {\
51+ " function joinWith(l) {\
9552 \ return function (s) {\
9653 \ return l.join(s);\
9754 \ };\
9855 \}" :: [String ] -> String -> String
9956
57+ foreign import push
58+ " function push(l) {\
59+ \ return function (e) {\
60+ \ var l1 = l.slice();\
61+ \ l1.push(e); \
62+ \ return l1;\
63+ \ };\
64+ \}" :: forall a . [a ] -> a -> [a ]
65+
10066foreign import reverse
101- " function reverse (l) {\
102- \ return l.slice().reverse();\
67+ " function reverse(l) {\
68+ \ var l1 = l.slice();\
69+ \ l1.reverse(); \
70+ \ return l1;\
10371 \}" :: forall a . [a ] -> [a ]
10472
105- foreign import drop
106- " function drop (n) {\
107- \ return function (l) {\
108- \ return l.slice(n);\
109- \ };\
110- \}" :: forall a . Number -> [a ] -> [a ]
111-
112- foreign import take
113- " function take (n) {\
114- \ return function (l) {\
115- \ return l.slice(0, n);\
116- \ };\
117- \}" :: forall a . Number -> [a ] -> [a ]
73+ foreign import shift
74+ " function shift(l) {\
75+ \ var l1 = l.slice();\
76+ \ l1.shift();\
77+ \ return l1;\
78+ \}" :: forall a . [a ] -> [a ]
11879
11980foreign import slice
120- " function slice (s) {\
121- \ return function (e) {\
81+ " function slice(s) {\
82+ \ return function(e) {\
12283 \ return function (l) {\
12384 \ return l.slice(s, e);\
12485 \ };\
12586 \ };\
12687 \}" :: forall a . Number -> Number -> [a ] -> [a ]
12788
89+ foreign import sort
90+ " function sort(l) {\
91+ \ var l1 = l.slice();\
92+ \ l1.sort();\
93+ \ return l1;\
94+ \}" :: forall a . [a ] -> [a ]
95+
12896foreign import insertAt
129- " function insertAt (index) {\
130- \ return function (a) {\
131- \ return function (l) {\
97+ " function insertAt(index) {\
98+ \ return function(a) {\
99+ \ return function(l) {\
132100 \ var l1 = l.slice();\
133101 \ l1.splice(index, 0, a);\
134102 \ return l1;\
@@ -137,9 +105,9 @@ foreign import insertAt
137105 \}" :: forall a . Number -> a -> [a ] -> [a ]
138106
139107foreign import deleteAt
140- " function deleteAt (index) {\
141- \ return function (n) {\
142- \ return function (l) {\
108+ " function deleteAt(index) {\
109+ \ return function(n) {\
110+ \ return function(l) {\
143111 \ var l1 = l.slice();\
144112 \ l1.splice(index, n);\
145113 \ return l1;\
@@ -148,40 +116,32 @@ foreign import deleteAt
148116 \}" :: forall a . Number -> Number -> [a ] -> [a ]
149117
150118foreign import updateAt
151- " function updateAt (index) {\
152- \ return function (a) {\
153- \ return function (l) {\
119+ " function updateAt(index) {\
120+ \ return function(a) {\
121+ \ return function(l) {\
154122 \ var l1 = l.slice();\
155123 \ l1[index] = a;\
156124 \ return l1;\
157125 \ }; \
158126 \ };\
159127 \}" :: forall a . Number -> a -> [a ] -> [a ]
160128
161- foreign import concatMap
162- " function concatMap (f) {\
163- \ return function (arr) {\
164- \ var result = [];\
165- \ for (var i = 0, l = arr.length; i < l; i++) {\
166- \ Array.prototype.push.apply(result, f(arr[i]));\
167- \ }\
168- \ return result;\
169- \ };\
170- \}" :: forall a b . (a -> [b ]) -> [a ] -> [b ]
171-
172- foreign import filter
173- " function filter (f) {\
174- \ return function (arr) {\
175- \ var n = 0;\
176- \ var result = [];\
177- \ for (var i = 0, l = arr.length; i < l; i++) {\
178- \ if (f(arr[i])) {\
179- \ result[n++] = arr[i];\
180- \ }\
181- \ }\
182- \ return result;\
183- \ };\
184- \}" :: forall a . (a -> Boolean ) -> [a ] -> [a ]
129+ infixr 6 :
130+
131+ (:) :: forall a . a -> [a ] -> [a ]
132+ (:) a = concat [a]
133+
134+ singleton :: forall a . a -> [a ]
135+ singleton a = [a]
136+
137+ concatMap :: forall a b . (a -> [b ]) -> [a ] -> [b ]
138+ concatMap _ [] = []
139+ concatMap f (a:as) = f a `concat` concatMap f as
140+
141+ filter :: forall a . (a -> Boolean ) -> [a ] -> [a ]
142+ filter _ [] = []
143+ filter p (x:xs) | p x = x : filter p xs
144+ filter p (_:xs) = filter p xs
185145
186146isEmpty :: forall a . [a ] -> Boolean
187147isEmpty [] = true
@@ -191,19 +151,19 @@ range :: Number -> Number -> [Number]
191151range lo hi | lo > hi = []
192152range lo hi = lo : range (lo + 1 ) hi
193153
194- foreign import zipWith
195- " function zipWith (f) {\
196- \ return function (xs) {\
197- \ return function (ys) {\
198- \ var l = xs.length < ys.length ? xs.length : ys.length;\
199- \ var result = new Array(l);\
200- \ for (var i = 0; i < l; i++) {\
201- \ result[i] = f(xs[i])(ys[i]);\
202- \ }\
203- \ return result;\
204- \ };\
205- \ };\
206- \} " :: forall a b c . ( a -> b -> c ) -> [ a ] -> [ b ] -> [ c ]
154+ zipWith :: forall a b c . ( a -> b -> c ) -> [ a ] -> [ b ] -> [ c ]
155+ zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
156+ zipWith _ _ _ = []
157+
158+ drop :: forall a . Number -> [ a ] -> [ a ]
159+ drop 0 xs = xs
160+ drop _ [] = []
161+ drop n (x:xs) = drop (n - 1 ) xs
162+
163+ take :: forall a . Number -> [ a ] -> [ a ]
164+ take 0 _ = []
165+ take _ [] = []
166+ take n (x:xs) = x : take (n - 1 ) xs
207167
208168nub :: forall a . (Eq a ) => [a ] -> [a ]
209169nub = nubBy (==)
@@ -212,37 +172,29 @@ nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a]
212172nubBy _ [] = []
213173nubBy (==) (x:xs) = x : nubBy (==) (filter (\y -> not (x == y)) xs)
214174
215- sort :: forall a . (Ord a ) => [a ] -> [a ]
216- sort xs = sortJS comp xs
217- where
218- comp x y = case compare x y of
219- GT -> 1
220- EQ -> 0
221- LT -> -1
222-
223- foreign import sortJS
224- " function sortJS (f) {\
225- \ return function (l) {\
226- \ return l.slice().sort(function (x, y) {\
227- \ return f(x)(y);\
228- \ });\
229- \ };\
230- \}" :: forall a . (a -> a -> Number ) -> [a ] -> [a ]
231-
232175instance showArray :: (Show a ) => Show [a ] where
233176 show xs = " [" ++ joinWith (map show xs) " ," ++ " ]"
234177
235- instance monadArray :: Monad [] where
236- return = singleton
237- (>>=) = flip concatMap
238-
239- instance applicativeArray :: Applicative [] where
240- pure = return
241- (<*>) = ap
242-
243178instance functorArray :: Functor [] where
244179 (<$>) = map
245180
181+ instance applyArray :: Apply [] where
182+ (<*>) = ap
183+
184+ instance applicativeArray :: Applicative [] where
185+ pure = singleton
186+
187+ instance bindArray :: Bind [] where
188+ (>>=) = flip concatMap
189+
190+ instance monadArray :: Monad []
191+
192+ instance semigroupArray :: Semigroup [a ] where
193+ (<>) = concat
194+
195+ instance monoidArray :: Monoid [a ] where
196+ mempty = []
197+
246198instance alternativeArray :: Alternative [] where
247199 empty = []
248200 (<|>) = concat
0 commit comments