Skip to content

Commit 5f9b222

Browse files
committed
Updates for 0.5
1 parent 9f2d888 commit 5f9b222

File tree

2 files changed

+100
-147
lines changed

2 files changed

+100
-147
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"js"
1717
],
1818
"dependencies": {
19-
"purescript-maybe": "*"
19+
"purescript-maybe": "*",
20+
"purescript-monoid": "*"
2021
},
2122
"devDependencies": {
2223
"purescript-exceptions": "*",

src/Data/Array.purs

Lines changed: 98 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,8 @@
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

293
import Prelude
304
import 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

407
head :: forall a. [a] -> Maybe a
418
head (x : _) = Just x
@@ -45,90 +12,91 @@ tail :: forall a. [a] -> Maybe [a]
4512
tail (_ : xs) = Just xs
4613
tail _ = 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

6019
foreign import length
61-
"function length (xs) {\
20+
"function length(xs) {\
6221
\ return xs.length;\
6322
\}" :: forall a. [a] -> Number
6423

6524
foreign 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-
7931
foreign 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

8638
foreign 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+
9350
foreign 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+
10066
foreign 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

11980
foreign 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+
12896
foreign 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

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

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

186146
isEmpty :: forall a. [a] -> Boolean
187147
isEmpty [] = true
@@ -191,19 +151,19 @@ range :: Number -> Number -> [Number]
191151
range lo hi | lo > hi = []
192152
range 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

208168
nub :: forall a. (Eq a) => [a] -> [a]
209169
nub = nubBy (==)
@@ -212,37 +172,29 @@ nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a]
212172
nubBy _ [] = []
213173
nubBy (==) (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-
232175
instance 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-
243178
instance 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+
246198
instance alternativeArray :: Alternative [] where
247199
empty = []
248200
(<|>) = concat

0 commit comments

Comments
 (0)