vector-builder 0.3.1 → 0.3.2
raw patch · 6 files changed
+113/−3 lines, 6 filesdep +bugdep +criteriondep +foldlPVP ok
version bump matches the API change (PVP)
Dependencies added: bug, criterion, foldl, rerebase
API changes (from Hackage documentation)
Files
- foldl-benchmark/Main.hs +25/−0
- foldl-profiling/Main.hs +15/−0
- library/VectorBuilder/Private/Action.hs +4/−0
- library/VectorBuilder/Private/Builder.hs +10/−0
- library/VectorBuilder/Private/SizeTrackingAction.hs +6/−2
- vector-builder.cabal +53/−1
+ foldl-benchmark/Main.hs view
@@ -0,0 +1,25 @@+module Main where++import Prelude+import Bug+import Criterion+import Criterion.Main+import qualified Control.Foldl as A+import qualified Data.Vector as F+import qualified VectorBuilder.Builder as N+import qualified VectorBuilder.Vector as O+++main =+ defaultMain+ [+ bench "vector-builder" (nf foldWithBuilder input),+ bench "default" (nf foldDefault input)+ ]+ where+ input =+ [0..1000]+ foldWithBuilder input =+ A.fold (A.foldMap N.singleton O.build) input :: Vector Int+ foldDefault input =+ runST (A.foldM A.vector input) :: Vector Int
+ foldl-profiling/Main.hs view
@@ -0,0 +1,15 @@+module Main where++import Prelude+import qualified Data.Vector.Unboxed as V+import qualified Control.Foldl as L+import qualified VectorBuilder.Builder as N+import qualified VectorBuilder.Vector as O++main :: IO ()+main = (print . V.maximum) (L.fold fold input) where+ input = [1..1000000] :: [Int]+ fold = L.Fold step begin done where+ begin = N.empty+ step x a = x <> N.singleton a+ done = O.build
library/VectorBuilder/Private/Action.hs view
@@ -11,15 +11,19 @@ deriving (Functor) instance Applicative (Action element) where+ {-# INLINABLE pure #-} pure result = Action (const (pure result))+ {-# INLINABLE (<*>) #-} (<*>) (Action actionFn1) (Action actionFn2) = Action ((<*>) <$> actionFn1 <*> actionFn2) +{-# INLINABLE unsafeWrite #-} unsafeWrite :: Int -> element -> Action element () unsafeWrite index element = Action (\mVector -> A.unsafeWrite mVector index element) +{-# INLINABLE unsafeWriteMany #-} unsafeWriteMany :: B.Vector vector element => Int -> vector element -> Action element () unsafeWriteMany startingIndex appendedVector = Action (\mVector -> B.ifoldM' (\_ index element -> A.unsafeWrite mVector (startingIndex + index) element) () appendedVector)
library/VectorBuilder/Private/Builder.hs view
@@ -16,14 +16,17 @@ -- | -- Provides support for /O(1)/ concatenation. instance Monoid (Builder element) where+ {-# INLINE mempty #-} mempty = VectorBuilder.Private.Builder.empty+ {-# INLINE mappend #-} mappend = prepend -- | -- Provides support for /O(1)/ concatenation. instance Semigroup (Builder element) where+ {-# INLINE (<>) #-} (<>) = prepend @@ -32,12 +35,14 @@ -- | -- Empty builder.+{-# INLINE empty #-} empty :: Builder element empty = Builder (pure ()) -- | -- Builder of a single element.+{-# INLINE singleton #-} singleton :: element -> Builder element singleton element = Builder (A.snoc element)@@ -46,6 +51,7 @@ -- Builder from an immutable vector of elements. -- -- Supports all kinds of vectors: boxed, unboxed, primitive, storable.+{-# INLINE vector #-} vector :: B.Vector vector element => vector element -> Builder element vector vector = Builder (A.append vector)@@ -53,18 +59,22 @@ -- * Updates +{-# INLINE snoc #-} snoc :: element -> Builder element -> Builder element snoc element (Builder action) = Builder (action *> A.snoc element) +{-# INLINE cons #-} cons :: element -> Builder element -> Builder element cons element (Builder action) = Builder (A.snoc element *> action) +{-# INLINE prepend #-} prepend :: Builder element -> Builder element -> Builder element prepend (Builder action1) (Builder action2) = Builder (action1 *> action2) +{-# INLINE append #-} append :: Builder element -> Builder element -> Builder element append (Builder action1) (Builder action2) = Builder (action1 <* action2)
library/VectorBuilder/Private/SizeTrackingAction.hs view
@@ -11,22 +11,26 @@ deriving (Functor) instance Applicative (SizeTrackingAction element) where+ {-# INLINE pure #-} pure result = SizeTrackingAction (\size -> (pure result, size))+ {-# INLINE (<*>) #-} (<*>) (SizeTrackingAction sizeTrackingActionFn1) (SizeTrackingAction sizeTrackingActionFn2) = SizeTrackingAction sizeTrackingActionFn where sizeTrackingActionFn size = case sizeTrackingActionFn1 size of- (action1, size1) ->+ (action1, !size1) -> case sizeTrackingActionFn2 size1 of- (action2, size2) ->+ (action2, !size2) -> (action1 <*> action2, size2) +{-# INLINE snoc #-} snoc :: element -> SizeTrackingAction element () snoc element = SizeTrackingAction (\size -> (C.unsafeWrite size element, succ size)) +{-# INLINE append #-} append :: B.Vector vector element => vector element -> SizeTrackingAction element () append appendedVector = SizeTrackingAction (\size -> (C.unsafeWriteMany size appendedVector, size + B.length appendedVector))
vector-builder.cabal view
@@ -1,7 +1,7 @@ name: vector-builder version:- 0.3.1+ 0.3.2 synopsis: Vector builder description:@@ -106,3 +106,55 @@ vector-builder, -- rebase+++benchmark foldl-benchmark+ type: + exitcode-stdio-1.0+ hs-source-dirs:+ foldl-benchmark+ main-is:+ Main.hs+ ghc-options:+ -O2+ -threaded+ "-with-rtsopts=-N"+ -rtsopts+ default-extensions:+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples+ default-language:+ Haskell2010+ build-depends:+ vector-builder,+ foldl == 1.2.*,+ -- benchmarking:+ criterion >= 1.1 && < 2,+ -- general:+ bug == 1.*,+ rerebase < 2+++test-suite foldl-profiling+ type: + exitcode-stdio-1.0+ hs-source-dirs:+ foldl-profiling+ main-is:+ Main.hs+ ghc-options:+ -O2+ -threaded+ "-with-rtsopts=-N"+ -rtsopts+ default-extensions:+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples+ default-language:+ Haskell2010+ build-depends:+ vector-builder,+ foldl == 1.2.*,+ -- benchmarking:+ criterion >= 1.1 && < 2,+ -- general:+ bug == 1.*,+ rerebase < 2