2828--  |   allowing you to STAI.iterate over an array and accumulate effects.
2929--  |
3030module  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
133126import  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--  | ```
180173singleton  ::  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--  | ```
225218null  ::  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)`.
245246cons  ::  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--  |
284285insertBy  ::  forall  a . (a  ->  a  ->  Ordering ) ->  a  ->  Array  a  ->  Array  a 
285286insertBy 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--  | ```
610613intersperse  ::  forall  a . a  ->  Array  a  ->  Array  a 
611614intersperse 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 }
700704filterA  ::  forall  a  f . Applicative  f  =>  (a  ->  f  Boolean ) ->  Array  a  ->  f  (Array  a )
701705filterA 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
10441048nubBy 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--  |
11221126deleteBy  ::  forall  a . (a  ->  a  ->  Boolean ) ->  a  ->  Array  a  ->  Array  a 
1123- deleteBy _   _ []  = [] 
1127+ deleteBy _ _ []  = [] 
11241128deleteBy 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