1- module Data.Array where
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
228
3- import Prelude
429import Data.Maybe
530import Data.Monoid
631
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]
39+
740head :: forall a . [a ] -> Maybe a
841head (x : _) = Just x
942head _ = Nothing
@@ -12,91 +45,90 @@ tail :: forall a. [a] -> Maybe [a]
1245tail (_ : xs) = Just xs
1346tail _ = Nothing
1447
15- map :: forall a b . (a -> b ) -> [a ] -> [b ]
16- map _ [] = []
17- map f (x:xs) = f x : map f xs
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 ]
1859
1960foreign import length
20- " function length(xs) {\
61+ " function length (xs) {\
2162 \ return xs.length;\
2263 \}" :: forall a . [a ] -> Number
2364
2465foreign import indexOf
25- " function indexOf(l) {\
66+ " function indexOf (l) {\
2667 \ return function (e) {\
2768 \ return l.indexOf(e);\
2869 \ };\
2970 \}" :: forall a . [a ] -> a -> Number
3071
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+
3179foreign import lastIndexOf
32- " function lastIndexOf(l) {\
80+ " function lastIndexOf (l) {\
3381 \ return function (e) {\
3482 \ return l.lastIndexOf(e);\
3583 \ };\
3684 \}" :: forall a . [a ] -> a -> Number
3785
3886foreign import concat
39- " function concat(l1) {\
87+ " function concat (l1) {\
4088 \ return function (l2) {\
4189 \ return l1.concat(l2);\
4290 \ };\
4391 \}" :: forall a . [a ] -> [a ] -> [a ]
4492
45- foreign import joinS
46- " function joinS(l) {\
47- \ return l.join();\
48- \}" :: [String ] -> String
49-
5093foreign import joinWith
51- " function joinWith(l) {\
94+ " function joinWith (l) {\
5295 \ return function (s) {\
5396 \ return l.join(s);\
5497 \ };\
5598 \}" :: [String ] -> String -> String
5699
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-
66100foreign import reverse
67- " function reverse(l) {\
68- \ var l1 = l.slice();\
69- \ l1.reverse(); \
70- \ return l1;\
101+ " function reverse (l) {\
102+ \ return l.slice().reverse();\
71103 \}" :: forall a . [a ] -> [a ]
72104
73- foreign import shift
74- " function shift(l) {\
75- \ var l1 = l.slice();\
76- \ l1.shift();\
77- \ return l1;\
78- \}" :: forall a . [a ] -> [a ]
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 ]
79118
80119foreign import slice
81- " function slice(s) {\
82- \ return function(e) {\
120+ " function slice (s) {\
121+ \ return function (e) {\
83122 \ return function (l) {\
84123 \ return l.slice(s, e);\
85124 \ };\
86125 \ };\
87126 \}" :: forall a . Number -> Number -> [a ] -> [a ]
88127
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-
96128foreign import insertAt
97- " function insertAt(index) {\
98- \ return function(a) {\
99- \ return function(l) {\
129+ " function insertAt (index) {\
130+ \ return function (a) {\
131+ \ return function (l) {\
100132 \ var l1 = l.slice();\
101133 \ l1.splice(index, 0, a);\
102134 \ return l1;\
@@ -105,9 +137,9 @@ foreign import insertAt
105137 \}" :: forall a . Number -> a -> [a ] -> [a ]
106138
107139foreign import deleteAt
108- " function deleteAt(index) {\
109- \ return function(n) {\
110- \ return function(l) {\
140+ " function deleteAt (index) {\
141+ \ return function (n) {\
142+ \ return function (l) {\
111143 \ var l1 = l.slice();\
112144 \ l1.splice(index, n);\
113145 \ return l1;\
@@ -116,32 +148,40 @@ foreign import deleteAt
116148 \}" :: forall a . Number -> Number -> [a ] -> [a ]
117149
118150foreign import updateAt
119- " function updateAt(index) {\
120- \ return function(a) {\
121- \ return function(l) {\
151+ " function updateAt (index) {\
152+ \ return function (a) {\
153+ \ return function (l) {\
122154 \ var l1 = l.slice();\
123155 \ l1[index] = a;\
124156 \ return l1;\
125157 \ }; \
126158 \ };\
127159 \}" :: forall a . Number -> a -> [a ] -> [a ]
128160
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
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 ]
145185
146186isEmpty :: forall a . [a ] -> Boolean
147187isEmpty [] = true
@@ -151,19 +191,19 @@ range :: Number -> Number -> [Number]
151191range lo hi | lo > hi = []
152192range lo hi = lo : range (lo + 1 ) hi
153193
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
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 ]
167207
168208nub :: forall a . (Eq a ) => [a ] -> [a ]
169209nub = nubBy (==)
@@ -172,6 +212,23 @@ nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a]
172212nubBy _ [] = []
173213nubBy (==) (x:xs) = x : nubBy (==) (filter (\y -> not (x == y)) xs)
174214
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+
175232instance showArray :: (Show a ) => Show [a ] where
176233 show xs = " [" ++ joinWith (map show xs) " ," ++ " ]"
177234
0 commit comments