Skip to content

Commit ee9cef9

Browse files
committed
accumulate: build an array by accumulation
addresses purescript#136
1 parent 32a1a20 commit ee9cef9

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

src/Data/Array.purs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ module Data.Array
3333
, singleton
3434
, (..), range
3535
, replicate
36+
, accumulate
37+
, accumulate'
3638
, some
3739
, many
3840

@@ -114,16 +116,19 @@ module Data.Array
114116
) where
115117

116118
import Prelude
119+
117120
import Control.Alt ((<|>))
118121
import Control.Alternative (class Alternative)
119122
import Control.Lazy (class Lazy, defer)
123+
import Control.Monad.Eff (foreachE)
120124
import Control.Monad.Rec.Class (class MonadRec, Step(..), tailRecM2)
121125
import Control.Monad.ST (pureST)
122-
import Data.Array.ST (unsafeFreeze, emptySTArray, pokeSTArray, pushSTArray, modifySTArray, withArray)
126+
import Data.Array.ST (emptySTArray, modifySTArray, pokeSTArray, pushSTArray, unsafeFreeze, unsafeThaw, withArray)
123127
import Data.Array.ST.Iterator (iterator, iterate, pushWhile)
124128
import Data.Foldable (class Foldable, foldl, foldr, traverse_)
125129
import Data.Foldable (foldl, foldr, foldMap, fold, intercalate, elem, notElem, find, findMap, any, all) as Exports
126130
import Data.Maybe (Maybe(..), maybe, isJust, fromJust)
131+
import Data.Monoid (class Monoid, mempty)
127132
import Data.NonEmpty (NonEmpty, (:|))
128133
import Data.Traversable (scanl, scanr) as Exports
129134
import Data.Traversable (sequence, traverse)
@@ -175,6 +180,27 @@ foreign import range :: Int -> Int -> Array Int
175180
-- | ```
176181
foreign import replicate :: forall a. Int -> a -> Array a
177182

183+
accumulate
184+
:: forall a
185+
. Monoid a
186+
=> Int
187+
-> Array (Tuple Int a)
188+
-> Array a
189+
accumulate = accumulate' append mempty
190+
191+
accumulate'
192+
:: forall a e
193+
. (e -> a -> e)
194+
-> e
195+
-> Int
196+
-> Array (Tuple Int a)
197+
-> Array e
198+
accumulate' f initVal size xs = pureST do
199+
ys <- unsafeThaw $ replicate size initVal
200+
foreachE xs \(Tuple i x) ->
201+
void $ modifySTArray ys i $ flip f x
202+
unsafeFreeze ys
203+
178204
-- | An infix synonym for `range`.
179205
-- | ```purescript
180206
-- | 2 .. 5 = [2, 3, 4, 5]

0 commit comments

Comments
 (0)