foldl 1.4.8 → 1.4.9
raw patch · 5 files changed
+55/−13 lines, 5 filesdep −vector-builderdep ~profunctorsPVP ok
version bump matches the API change (PVP)
Dependencies removed: vector-builder
Dependency ranges changed: profunctors
API changes (from Hackage documentation)
Files
- CHANGELOG.md +4/−0
- foldl.cabal +5/−4
- src/Control/Foldl.hs +2/−9
- src/Control/Foldl/Util/MVector.hs +17/−0
- src/Control/Foldl/Util/Vector.hs +27/−0
CHANGELOG.md view
@@ -1,3 +1,7 @@+1.4.9++* Implement `vector` utility more efficiently+ 1.4.8 * Only depend on `semigroups` for older GHC versions
foldl.cabal view
@@ -1,5 +1,5 @@ Name: foldl-Version: 1.4.8+Version: 1.4.9 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3@@ -26,7 +26,7 @@ Build-Depends: base >= 4.8 && < 5 , bytestring >= 0.9.2.1 && < 0.11,- mwc-random >= 0.13.1.0 && < 0.15,+ mwc-random >= 0.13.1.0 && < 0.16, primitive < 0.8 , text >= 0.11.2.0 && < 1.3 , transformers >= 0.2.0.0 && < 0.6 ,@@ -37,8 +37,7 @@ contravariant < 1.6 , profunctors < 5.6 , semigroupoids >= 1.0 && < 5.4 ,- comonad >= 4.0 && < 6 ,- vector-builder < 0.4+ comonad >= 4.0 && < 6 if impl(ghc < 8.0) Build-Depends: semigroups >= 0.17 && < 1.20@@ -50,6 +49,8 @@ Other-Modules: Control.Foldl.Optics Control.Foldl.Internal+ Control.Foldl.Util.Vector+ Control.Foldl.Util.MVector GHC-Options: -O2 -Wall Default-Language: Haskell2010
src/Control/Foldl.hs view
@@ -197,9 +197,8 @@ import qualified Data.HashMap.Strict as HashMap import qualified Data.HashSet as HashSet import qualified Data.Vector.Generic as V+import qualified Control.Foldl.Util.Vector as V import qualified Data.Vector.Generic.Mutable as M-import qualified VectorBuilder.Builder-import qualified VectorBuilder.Vector import qualified Data.Semigroupoid {- $setup@@ -1000,13 +999,7 @@ -- | Fold all values into a vector vector :: Vector v a => Fold a (v a)-vector = Fold step begin done- where- begin = VectorBuilder.Builder.empty-- step x a = x <> VectorBuilder.Builder.singleton a-- done = VectorBuilder.Vector.build+vector = V.fromReverseListN <$> length <*> revList {-# INLINABLE vector #-} maxChunkSize :: Int
+ src/Control/Foldl/Util/MVector.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE BangPatterns #-}+module Control.Foldl.Util.MVector+where++import Data.Vector.Generic.Mutable+import Control.Monad.ST+++{-# INLINE writeListInReverseOrderStartingFrom #-}+writeListInReverseOrderStartingFrom :: MVector v a => v s a -> Int -> [a] -> ST s ()+writeListInReverseOrderStartingFrom v = let+ loop !index list = case list of+ h : t -> do+ unsafeWrite v index h+ loop (pred index) t+ _ -> return ()+ in loop
+ src/Control/Foldl/Util/Vector.hs view
@@ -0,0 +1,27 @@+{-|+General utilities for immutable vectors.+-}+{-# LANGUAGE RankNTypes #-}+module Control.Foldl.Util.Vector where++import Data.Vector.Generic+import Control.Monad.ST+import qualified Data.Vector.Generic.Mutable as M+import qualified Control.Foldl.Util.MVector as M+++{-|+>>> fromReverseListN 3 [1,2,3] :: Data.Vector.Vector Int+[3,2,1]+-}+{-# INLINE fromReverseListN #-}+fromReverseListN :: Vector v a => Int -> [a] -> v a+fromReverseListN size list =+ initialized size $ \ mv -> M.writeListInReverseOrderStartingFrom mv (pred size) list++{-# INLINE initialized #-}+initialized :: Vector v a => Int -> (forall s. Mutable v s a -> ST s ()) -> v a+initialized size initialize = runST $ do+ mv <- M.unsafeNew size+ initialize mv+ unsafeFreeze mv