Skip to content

Commit 131a232

Browse files
Add intersperse with tests (#188)
1 parent b59f5ec commit 131a232

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/Data/Array.purs

+26
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ module Data.Array
6464
, modifyAtIndices
6565
, alterAt
6666

67+
, intersperse
6768
, reverse
6869
, concat
6970
, concatMap
@@ -551,6 +552,31 @@ alterAt i f xs = maybe Nothing go (xs !! i)
551552
-- Transformations -------------------------------------------------------------
552553
--------------------------------------------------------------------------------
553554

555+
-- | Inserts the given element in between each element in the array. The array
556+
-- | must have two or more elements for this operation to take effect.
557+
-- |
558+
-- | ```purescript
559+
-- | intersperse " " [ "a", "b" ] == [ "a", " ", "b" ]
560+
-- | intersperse 0 [ 1, 2, 3, 4, 5 ] == [ 1, 0, 2, 0, 3, 0, 4, 0, 5 ]
561+
-- | ```
562+
-- |
563+
-- | If the array has less than two elements, the input array is returned.
564+
-- | ```purescript
565+
-- | intersperse " " [] == []
566+
-- | intersperse " " ["a"] == ["a"]
567+
-- | ```
568+
intersperse :: forall a. a -> Array a -> Array a
569+
intersperse a arr = case length arr of
570+
len | len < 2 -> arr
571+
| otherwise -> STA.run do
572+
let unsafeGetElem idx = unsafePartial (unsafeIndex arr idx)
573+
out <- STA.empty
574+
_ <- STA.push (unsafeGetElem 0) out
575+
ST.for 1 len \idx -> do
576+
_ <- STA.push a out
577+
void (STA.push (unsafeGetElem idx) out)
578+
pure out
579+
554580
-- | Reverse an array, creating a new array.
555581
-- |
556582
-- | ```purescript

test/Test/Data/Array.purs

+8
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,14 @@ testArray = do
187187
log "alterAt should return Nothing if the index is out of A.range"
188188
assert $ (A.alterAt 1 (Just <<< (_ + 1)) nil) == Nothing
189189

190+
log "intersperse should return the original array when given an array with zero or one elements"
191+
assert $ (A.intersperse " " []) == []
192+
assert $ (A.intersperse " " ["a"]) == ["a"]
193+
194+
log "intersperse should insert the given element in-between each element in an array with two or more elements"
195+
assert $ (A.intersperse " " ["a", "b"]) == ["a", " ", "b"]
196+
assert $ (A.intersperse 0 [ 1, 2, 3, 4, 5 ]) == [ 1, 0, 2, 0, 3, 0, 4, 0, 5 ]
197+
190198
log "reverse should reverse the order of items in an array"
191199
assert $ (A.reverse [1, 2, 3]) == [3, 2, 1]
192200
assert $ (A.reverse nil) == nil

0 commit comments

Comments
 (0)