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 +4/−0
- README.md +1/−1
- foldl.cabal +3/−2
- src/Control/Foldl.hs +9/−18
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