Skip to content

Commit d2cd1e9

Browse files
committed
Restore stuff that was merged out accidentally
1 parent 5f9b222 commit d2cd1e9

File tree

1 file changed

+138
-81
lines changed

1 file changed

+138
-81
lines changed

src/Data/Array.purs

Lines changed: 138 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,42 @@
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
429
import Data.Maybe
530
import 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+
740
head :: forall a. [a] -> Maybe a
841
head (x : _) = Just x
942
head _ = Nothing
@@ -12,91 +45,90 @@ tail :: forall a. [a] -> Maybe [a]
1245
tail (_ : xs) = Just xs
1346
tail _ = 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

1960
foreign import length
20-
"function length(xs) {\
61+
"function length (xs) {\
2162
\ return xs.length;\
2263
\}" :: forall a. [a] -> Number
2364

2465
foreign 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+
3179
foreign 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

3886
foreign 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-
5093
foreign 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-
66100
foreign 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

80119
foreign 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-
96128
foreign 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

107139
foreign 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

118150
foreign 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

146186
isEmpty :: forall a. [a] -> Boolean
147187
isEmpty [] = true
@@ -151,19 +191,19 @@ range :: Number -> Number -> [Number]
151191
range lo hi | lo > hi = []
152192
range 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

168208
nub :: forall a. (Eq a) => [a] -> [a]
169209
nub = nubBy (==)
@@ -172,6 +212,23 @@ nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a]
172212
nubBy _ [] = []
173213
nubBy (==) (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+
175232
instance showArray :: (Show a) => Show [a] where
176233
show xs = "[" ++ joinWith (map show xs) "," ++ "]"
177234

0 commit comments

Comments
 (0)