packages feed

foldl 1.2.5 → 1.3.0

raw patch · 4 files changed

+17/−21 lines, 4 filesdep +vector-builderPVP ok

version bump matches the API change (PVP)

Dependencies added: vector-builder

API changes (from Hackage documentation)

- Control.Foldl: vector :: (PrimMonad m, Vector v a) => FoldM m a (v a)
+ Control.Foldl: vector :: Vector v a => Fold a (v a)

Files

CHANGELOG.md view
@@ -1,3 +1,7 @@+1.3.0++* BREAKING CHANGE: Change `vector` to be a pure `Fold` (which is faster, too!)+ 1.2.5  * Add support for folding new containers: `hashSet`, `map`, and `hashMap`
README.md view
@@ -1,4 +1,4 @@-# `foldl` v1.2.5+# `foldl` v1.3.0  Use this `foldl` library when you want to compute multiple folds over a collection in one pass over the data without space leaks.
foldl.cabal view
@@ -1,5 +1,5 @@ Name: foldl-Version: 1.2.5+Version: 1.3.0 Cabal-Version: >=1.8.0.2 Build-Type: Simple License: BSD3@@ -37,7 +37,8 @@         hashable                    < 1.3 ,         contravariant               < 1.5 ,         profunctors                 < 5.3 ,-        comonad      >= 4.0      && < 6+        comonad      >= 4.0      && < 6   ,+        vector-builder              < 0.4     Exposed-Modules:         Control.Foldl,         Control.Foldl.ByteString,
src/Control/Foldl.hs view
@@ -178,6 +178,8 @@ import qualified Data.HashSet                as HashSet import qualified Data.Vector.Generic         as V import qualified Data.Vector.Generic.Mutable as M+import qualified VectorBuilder.Builder+import qualified VectorBuilder.Vector  {-| Efficient representation of a left fold that preserves the fold's step     function, initial accumulator, and extraction function@@ -896,26 +898,15 @@     done = id {-# INLINABLE hashMap #-} -maxChunkSize :: Int-maxChunkSize = 8 * 1024 * 1024- -- | Fold all values into a vector-vector :: (PrimMonad m, Vector v a) => FoldM m a (v a)-vector = FoldM step begin done+vector :: Vector v a => Fold a (v a)+vector = Fold step begin done   where-    begin = do-        mv <- M.unsafeNew 10-        return (Pair mv 0)-    step (Pair mv idx) a = do-        let len = M.length mv-        mv' <- if idx >= len-            then M.unsafeGrow mv (min len maxChunkSize)-            else return mv-        M.unsafeWrite mv' idx a-        return (Pair mv' (idx + 1))-    done (Pair mv idx) = do-        v <- V.freeze mv-        return (V.unsafeTake idx v)+    begin = VectorBuilder.Builder.empty++    step x a = x <> VectorBuilder.Builder.singleton a++    done = VectorBuilder.Vector.build {-# INLINABLE vector #-}  {- $utilities