Skip to content

Commit 09aef4d

Browse files
committed
Add isEmpty
1 parent d20bae2 commit 09aef4d

File tree

3 files changed

+127
-119
lines changed

3 files changed

+127
-119
lines changed

src/Data/Array.purs

Lines changed: 107 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -28,106 +28,99 @@
2828
-- | allowing you to STAI.iterate over an array and accumulate effects.
2929
-- |
3030
module Data.Array
31-
( fromFoldable
32-
, toUnfoldable
33-
, singleton
34-
, (..), range
35-
, replicate
36-
, some
37-
, many
38-
39-
, null
40-
, length
41-
42-
, (:), cons
43-
, snoc
44-
, insert
45-
, insertBy
46-
47-
, head
48-
, last
49-
, tail
50-
, init
51-
, uncons
52-
, unsnoc
53-
54-
, (!!), index
31+
( (!!)
32+
, (..)
33+
, (:)
34+
, (\\)
35+
, all
36+
, alterAt
37+
, any
38+
, catMaybes
39+
, concat
40+
, concatMap
41+
, cons
42+
, delete
43+
, deleteAt
44+
, deleteBy
45+
, difference
46+
, drop
47+
, dropEnd
48+
, dropWhile
5549
, elem
56-
, notElem
5750
, elemIndex
5851
, elemLastIndex
52+
, filter
53+
, filterA
5954
, find
60-
, findMap
6155
, findIndex
6256
, findLastIndex
57+
, findMap
58+
, fold
59+
, foldM
60+
, foldMap
61+
, foldRecM
62+
, foldl
63+
, foldr
64+
, fromFoldable
65+
, group
66+
, groupAll
67+
, groupAllBy
68+
, groupBy
69+
, head
70+
, index
71+
, init
72+
, insert
6373
, insertAt
64-
, deleteAt
65-
, updateAt
66-
, updateAtIndices
67-
, modifyAt
68-
, modifyAtIndices
69-
, alterAt
70-
74+
, insertBy
75+
, intercalate
76+
, intersect
77+
, intersectBy
7178
, intersperse
72-
, reverse
73-
, concat
74-
, concatMap
75-
, filter
76-
, partition
77-
, splitAt
78-
, filterA
79+
, isEmpty
80+
, last
81+
, length
82+
, many
7983
, mapMaybe
80-
, catMaybes
8184
, mapWithIndex
82-
, foldl
83-
, foldr
84-
, foldMap
85-
, fold
86-
, intercalate
85+
, modifyAt
86+
, modifyAtIndices
87+
, notElem
88+
, nub
89+
, nubBy
90+
, nubByEq
91+
, nubEq
92+
, null
93+
, partition
94+
, range
95+
, replicate
96+
, reverse
8797
, scanl
8898
, scanr
89-
99+
, singleton
100+
, slice
101+
, snoc
102+
, some
90103
, sort
91104
, sortBy
92105
, sortWith
93-
, slice
106+
, span
107+
, splitAt
108+
, tail
94109
, take
95110
, takeEnd
96111
, takeWhile
97-
, drop
98-
, dropEnd
99-
, dropWhile
100-
, span
101-
, group
102-
, groupAll
103-
, groupBy
104-
, groupAllBy
105-
106-
, nub
107-
, nubEq
108-
, nubBy
109-
, nubByEq
112+
, toUnfoldable
113+
, uncons
110114
, union
111115
, unionBy
112-
, delete
113-
, deleteBy
114-
115-
, (\\), difference
116-
, intersect
117-
, intersectBy
118-
116+
, unsafeIndex
117+
, unsnoc
118+
, unzip
119+
, updateAt
120+
, updateAtIndices
121+
, zip
119122
, zipWith
120123
, zipWithA
121-
, zip
122-
, unzip
123-
124-
, any
125-
, all
126-
127-
, foldM
128-
, foldRecM
129-
130-
, unsafeIndex
131124
) where
132125

133126
import Prelude
@@ -154,7 +147,7 @@ toUnfoldable xs = unfoldr f 0
154147
where
155148
len = length xs
156149
f i
157-
| i < len = Just (Tuple (unsafePartial (unsafeIndex xs i)) (i+1))
150+
| i < len = Just (Tuple (unsafePartial (unsafeIndex xs i)) (i + 1))
158151
| otherwise = Nothing
159152

160153
-- | Convert a `Foldable` structure into an `Array`.
@@ -178,7 +171,7 @@ foreign import fromFoldableImpl
178171
-- | singleton 2 = [2]
179172
-- | ```
180173
singleton :: forall a. a -> Array a
181-
singleton a = [a]
174+
singleton a = [ a ]
182175

183176
-- | Create an array containing a range of integers, including both endpoints.
184177
-- | ```purescript
@@ -217,13 +210,21 @@ many v = some v <|> pure []
217210
-- Array size ------------------------------------------------------------------
218211
--------------------------------------------------------------------------------
219212

220-
-- | Test whether an array is empty.
213+
-- | Test whether an array is empty. Alias for `isEmpty`.
221214
-- | ```purescript
222215
-- | null [] = true
223216
-- | null [1, 2] = false
224217
-- | ```
225218
null :: forall a. Array a -> Boolean
226-
null xs = length xs == 0
219+
null = isEmpty
220+
221+
-- | Test whether an array is empty.
222+
-- | ```purescript
223+
-- | isEmpty [] = true
224+
-- | isEmpty [1, 2] = false
225+
-- | ```
226+
isEmpty :: forall a. Array a -> Boolean
227+
isEmpty xs = length xs == 0
227228

228229
-- | Get the number of elements in an array.
229230
-- | ```purescript
@@ -243,7 +244,7 @@ foreign import length :: forall a. Array a -> Int
243244
-- |
244245
-- | Note, the running time of this function is `O(n)`.
245246
cons :: forall a. a -> Array a -> Array a
246-
cons x xs = [x] <> xs
247+
cons x xs = [ x ] <> xs
247248

248249
-- | An infix alias for `cons`.
249250
-- |
@@ -283,8 +284,10 @@ insert = insertBy compare
283284
-- |
284285
insertBy :: forall a. (a -> a -> Ordering) -> a -> Array a -> Array a
285286
insertBy cmp x ys =
286-
let i = maybe 0 (_ + 1) (findLastIndex (\y -> cmp x y == GT) ys)
287-
in unsafePartial (fromJust (insertAt i x ys))
287+
let
288+
i = maybe 0 (_ + 1) (findLastIndex (\y -> cmp x y == GT) ys)
289+
in
290+
unsafePartial (fromJust (insertAt i x ys))
288291

289292
--------------------------------------------------------------------------------
290293
-- Non-indexed reads -----------------------------------------------------------
@@ -609,15 +612,16 @@ alterAt i f xs = maybe Nothing go (xs !! i)
609612
-- | ```
610613
intersperse :: forall a. a -> Array a -> Array a
611614
intersperse a arr = case length arr of
612-
len | len < 2 -> arr
613-
| otherwise -> STA.run do
614-
let unsafeGetElem idx = unsafePartial (unsafeIndex arr idx)
615-
out <- STA.new
616-
_ <- STA.push (unsafeGetElem 0) out
617-
ST.for 1 len \idx -> do
618-
_ <- STA.push a out
619-
void (STA.push (unsafeGetElem idx) out)
620-
pure out
615+
len
616+
| len < 2 -> arr
617+
| otherwise -> STA.run do
618+
let unsafeGetElem idx = unsafePartial (unsafeIndex arr idx)
619+
out <- STA.new
620+
_ <- STA.push (unsafeGetElem 0) out
621+
ST.for 1 len \idx -> do
622+
_ <- STA.push a out
623+
void (STA.push (unsafeGetElem idx) out)
624+
pure out
621625

622626
-- | Reverse an array, creating a new array.
623627
-- |
@@ -700,7 +704,7 @@ splitAt i xs = { before: slice 0 i xs, after: slice i (length xs) xs }
700704
filterA :: forall a f. Applicative f => (a -> f Boolean) -> Array a -> f (Array a)
701705
filterA p =
702706
traverse (\x -> Tuple x <$> p x)
703-
>>> map (mapMaybe (\(Tuple x b) -> if b then Just x else Nothing))
707+
>>> map (mapMaybe (\(Tuple x b) -> if b then Just x else Nothing))
704708

705709
-- | Apply a function to each element in an array, keeping only the results
706710
-- | which contain a value, creating a new array.
@@ -1044,16 +1048,16 @@ nubBy :: forall a. (a -> a -> Ordering) -> Array a -> Array a
10441048
nubBy comp xs = case head indexedAndSorted of
10451049
Nothing -> []
10461050
Just x -> map snd $ sortWith fst $ ST.run do
1047-
-- TODO: use NonEmptyArrays here to avoid partial functions
1048-
result <- STA.unsafeThaw $ singleton x
1049-
ST.foreach indexedAndSorted \pair@(Tuple _ x') -> do
1050-
lst <- snd <<< unsafePartial (fromJust <<< last) <$> STA.unsafeFreeze result
1051-
when (comp lst x' /= EQ) $ void $ STA.push pair result
1052-
STA.unsafeFreeze result
1051+
-- TODO: use NonEmptyArrays here to avoid partial functions
1052+
result <- STA.unsafeThaw $ singleton x
1053+
ST.foreach indexedAndSorted \pair@(Tuple _ x') -> do
1054+
lst <- snd <<< unsafePartial (fromJust <<< last) <$> STA.unsafeFreeze result
1055+
when (comp lst x' /= EQ) $ void $ STA.push pair result
1056+
STA.unsafeFreeze result
10531057
where
10541058
indexedAndSorted :: Array (Tuple Int a)
10551059
indexedAndSorted = sortBy (\x y -> comp (snd x) (snd y))
1056-
(mapWithIndex Tuple xs)
1060+
(mapWithIndex Tuple xs)
10571061

10581062
-- | Remove the duplicates from an array, where element equality is determined
10591063
-- | by the specified equivalence relation, creating a new array.
@@ -1120,7 +1124,7 @@ delete = deleteBy eq
11201124
-- | ```
11211125
-- |
11221126
deleteBy :: forall a. (a -> a -> Boolean) -> a -> Array a -> Array a
1123-
deleteBy _ _ [] = []
1127+
deleteBy _ _ [] = []
11241128
deleteBy eq x ys = maybe ys (\i -> unsafePartial $ fromJust (deleteAt i ys)) (findIndex (eq x) ys)
11251129

11261130
-- | Delete the first occurrence of each element in the second array from the

0 commit comments

Comments
 (0)