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