@@ -33,6 +33,8 @@ module Data.Array
33
33
, singleton
34
34
, (..), range
35
35
, replicate
36
+ , accumulate
37
+ , accumulate'
36
38
, some
37
39
, many
38
40
@@ -114,16 +116,19 @@ module Data.Array
114
116
) where
115
117
116
118
import Prelude
119
+
117
120
import Control.Alt ((<|>))
118
121
import Control.Alternative (class Alternative )
119
122
import Control.Lazy (class Lazy , defer )
123
+ import Control.Monad.Eff (foreachE )
120
124
import Control.Monad.Rec.Class (class MonadRec , Step (..), tailRecM2 )
121
125
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 )
123
127
import Data.Array.ST.Iterator (iterator , iterate , pushWhile )
124
128
import Data.Foldable (class Foldable , foldl , foldr , traverse_ )
125
129
import Data.Foldable (foldl , foldr , foldMap , fold , intercalate , elem , notElem , find , findMap , any , all ) as Exports
126
130
import Data.Maybe (Maybe (..), maybe , isJust , fromJust )
131
+ import Data.Monoid (class Monoid , mempty )
127
132
import Data.NonEmpty (NonEmpty , (:|))
128
133
import Data.Traversable (scanl , scanr ) as Exports
129
134
import Data.Traversable (sequence , traverse )
@@ -175,6 +180,27 @@ foreign import range :: Int -> Int -> Array Int
175
180
-- | ```
176
181
foreign import replicate :: forall a . Int -> a -> Array a
177
182
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
+
178
204
-- | An infix synonym for `range`.
179
205
-- | ```purescript
180
206
-- | 2 .. 5 = [2, 3, 4, 5]
0 commit comments