vector-builder 0.3.3.1 → 0.3.4
raw patch · 12 files changed
+218/−164 lines, 12 filesdep +QuickCheckdep ~basedep ~tastydep ~tasty-quickcheckPVP ok
version bump matches the API change (PVP)
Dependencies added: QuickCheck
Dependency ranges changed: base, tasty, tasty-quickcheck
API changes (from Hackage documentation)
+ VectorBuilder.MonadPlus: many :: MonadPlus m => m a -> m (Vector a)
+ VectorBuilder.MonadPlus: sepBy :: MonadPlus m => m element -> m separator -> m (Vector element)
+ VectorBuilder.MonadPlus: sepBy1 :: MonadPlus m => m element -> m separator -> m (Vector element)
Files
- foldl-benchmark/Main.hs +27/−11
- library/VectorBuilder/Builder.hs +1/−1
- library/VectorBuilder/Core/Builder.hs +85/−0
- library/VectorBuilder/Core/Update.hs +30/−0
- library/VectorBuilder/MVector.hs +3/−3
- library/VectorBuilder/MonadPlus.hs +41/−0
- library/VectorBuilder/Prelude.hs +14/−0
- library/VectorBuilder/Private/Builder.hs +0/−85
- library/VectorBuilder/Private/Prelude.hs +0/−14
- library/VectorBuilder/Private/Update.hs +0/−30
- library/VectorBuilder/Vector.hs +2/−2
- vector-builder.cabal +15/−18
foldl-benchmark/Main.hs view
@@ -5,23 +5,39 @@ import Criterion.Main import qualified Control.Foldl as A import qualified Data.Vector as F+import qualified Data.Vector.Unboxed as G import qualified VectorBuilder.Builder as N import qualified VectorBuilder.Vector as O main =- defaultMain [group 1000, group 10000, group 100000, group 1000000, group 10000000, group 100000000]+ defaultMain [boxed, unboxed] where- group size =- bgroup (show size)- [- bench "vector-builder" (nf foldWithBuilder input),- bench "default" (nf foldDefault input)- ]+ comparisons name builderSubject growingSubject =+ bgroup name (map comparison sizes) where- input =- [0..size]- foldWithBuilder input =+ sizes =+ [1000, 10000, 100000, 1000000, 10000000]+ comparison size =+ bgroup (show size)+ [+ bench "builder" (nf builderSubject input),+ bench "growing" (nf growingSubject input)+ ]+ where+ input =+ [0..size]+ boxed =+ comparisons "boxed" builderSubject growingSubject+ where+ builderSubject input = A.fold (A.foldMap N.singleton O.build) input :: Vector Int- foldDefault input =+ growingSubject input = runST (A.foldM A.vector input) :: Vector Int+ unboxed =+ comparisons "unboxed" builderSubject growingSubject+ where+ builderSubject input =+ A.fold (A.foldMap N.singleton O.build) input :: G.Vector Int+ growingSubject input =+ runST (A.foldM A.vector input) :: G.Vector Int
library/VectorBuilder/Builder.hs view
@@ -7,4 +7,4 @@ ) where -import VectorBuilder.Private.Builder+import VectorBuilder.Core.Builder
+ library/VectorBuilder/Core/Builder.hs view
@@ -0,0 +1,85 @@+module VectorBuilder.Core.Builder+where++import VectorBuilder.Prelude hiding (empty)+import qualified VectorBuilder.Core.Update as A+import qualified Data.Vector.Generic as B+++-- |+-- An abstraction over the size of a vector for the process of its construction.+-- +-- It postpones the actual construction of a vector until the execution of the builder.+data Builder element =+ Builder !Int !(A.Update element)+++-- * Initialisation++-- |+-- Empty builder.+{-# INLINE empty #-}+empty :: Builder element+empty =+ Builder 0 A.empty++-- |+-- Builder of a single element.+{-# INLINE singleton #-}+singleton :: element -> Builder element+singleton element =+ Builder 1 (A.write element)++-- |+-- 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 (B.length vector) (A.writeMany vector)+++-- * Updates++{-# INLINE snoc #-}+snoc :: element -> Builder element -> Builder element+snoc element (Builder size update) =+ Builder (succ size) (A.prepend size update (A.write element))++{-# INLINE cons #-}+cons :: element -> Builder element -> Builder element+cons element (Builder size update) =+ Builder (succ size) (A.prepend 1 (A.write element) update)++{-# INLINE prepend #-}+prepend :: Builder element -> Builder element -> Builder element+prepend (Builder leftSize leftUpdate) (Builder rightSize rightUpdate) =+ Builder (leftSize + rightSize) (A.prepend leftSize leftUpdate rightUpdate)++{-# INLINE append #-}+append :: Builder element -> Builder element -> Builder element+append =+ flip prepend+++-- * Instances++-- |+-- Provides support for /O(1)/ concatenation.+instance Semigroup (Builder element) where+ {-# INLINE (<>) #-}+ (<>) =+ prepend++-- |+-- Provides support for /O(1)/ concatenation.+instance Monoid (Builder element) where+ {-# INLINE mempty #-}+ mempty =+ empty+ {-# INLINE mappend #-}+ mappend =+ (<>)++
+ library/VectorBuilder/Core/Update.hs view
@@ -0,0 +1,30 @@+module VectorBuilder.Core.Update+where++import VectorBuilder.Prelude+import qualified Data.Vector.Generic.Mutable as A+import qualified Data.Vector.Generic as B+++newtype Update element =+ Update (forall s vector. A.MVector vector element => vector s element -> Int -> ST s ())++{-# INLINE write #-}+write :: element -> Update element+write element =+ Update (\mVector offset -> A.unsafeWrite mVector offset element)++{-# INLINE writeMany #-}+writeMany :: B.Vector vector element => vector element -> Update element+writeMany appendedVector =+ Update (\mVector offset -> B.ifoldM' (\_ index element -> A.unsafeWrite mVector (strict (offset + index)) element) () appendedVector)++{-# INLINE prepend #-}+prepend :: Int -> Update element -> Update element -> Update element+prepend size (Update leftST) (Update rightST) =+ Update (\mVector offset -> leftST mVector offset >> rightST mVector (strict (size + offset)))++{-# INLINE empty #-}+empty :: Update element+empty =+ Update (\_ _ -> pure ())
library/VectorBuilder/MVector.hs view
@@ -3,10 +3,10 @@ module VectorBuilder.MVector where -import VectorBuilder.Private.Prelude+import VectorBuilder.Prelude import Data.Vector.Generic.Mutable-import qualified VectorBuilder.Private.Builder as A-import qualified VectorBuilder.Private.Update as C+import qualified VectorBuilder.Core.Builder as A+import qualified VectorBuilder.Core.Update as C -- |
+ library/VectorBuilder/MonadPlus.hs view
@@ -0,0 +1,41 @@+{-|+MonadPlus utilities.+For instance, they can be applied with parsing libraries.+-}+module VectorBuilder.MonadPlus+where++import VectorBuilder.Prelude+import Data.Vector (Vector)+import qualified VectorBuilder.Builder as A+import qualified VectorBuilder.Vector as B+++{-# INLINABLE many #-}+many :: MonadPlus m => m a -> m (Vector a)+many m =+ fmap B.build loop+ where+ loop =+ mplus+ (do+ !element <- m+ remainders <- loop+ return (A.singleton element <> remainders))+ (return mempty)++{-# INLINABLE sepBy #-}+sepBy :: MonadPlus m => m element -> m separator -> m (Vector element)+sepBy elementM separatorM =+ mplus (sepBy1 elementM separatorM) (return mempty)++{-# INLINABLE sepBy1 #-}+sepBy1 :: MonadPlus m => m element -> m separator -> m (Vector element)+sepBy1 elementM separatorM =+ fmap B.build loop+ where+ loop =+ do+ !element <- elementM+ remainders <- mplus (separatorM >> loop) (return mempty)+ return (A.singleton element <> remainders)
+ library/VectorBuilder/Prelude.hs view
@@ -0,0 +1,14 @@+module VectorBuilder.Prelude+(+ module Exports,+ strict,+)+where++import BasePrelude as Exports hiding ((<>))+import Data.Semigroup as Exports (Semigroup(..))++{-# INLINE strict #-}+strict :: a -> a+strict a =+ seq a a
− library/VectorBuilder/Private/Builder.hs
@@ -1,85 +0,0 @@-module VectorBuilder.Private.Builder-where--import VectorBuilder.Private.Prelude hiding (empty)-import qualified VectorBuilder.Private.Update as A-import qualified Data.Vector.Generic as B----- |--- An abstraction over the size of a vector for the process of its construction.--- --- It postpones the actual construction of a vector until the execution of the builder.-data Builder element =- Builder !Int !(A.Update element)----- * Initialisation---- |--- Empty builder.-{-# INLINE empty #-}-empty :: Builder element-empty =- Builder 0 A.empty---- |--- Builder of a single element.-{-# INLINE singleton #-}-singleton :: element -> Builder element-singleton element =- Builder 1 (A.write element)---- |--- 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 (B.length vector) (A.writeMany vector)----- * Updates--{-# INLINE snoc #-}-snoc :: element -> Builder element -> Builder element-snoc element (Builder size update) =- Builder (succ size) (A.prepend size update (A.write element))--{-# INLINE cons #-}-cons :: element -> Builder element -> Builder element-cons element (Builder size update) =- Builder (succ size) (A.prepend 1 (A.write element) update)--{-# INLINE prepend #-}-prepend :: Builder element -> Builder element -> Builder element-prepend (Builder leftSize leftUpdate) (Builder rightSize rightUpdate) =- Builder (leftSize + rightSize) (A.prepend leftSize leftUpdate rightUpdate)--{-# INLINE append #-}-append :: Builder element -> Builder element -> Builder element-append =- flip prepend----- * Instances---- |--- Provides support for /O(1)/ concatenation.-instance Semigroup (Builder element) where- {-# INLINE (<>) #-}- (<>) =- prepend---- |--- Provides support for /O(1)/ concatenation.-instance Monoid (Builder element) where- {-# INLINE mempty #-}- mempty =- empty- {-# INLINE mappend #-}- mappend =- (<>)--
− library/VectorBuilder/Private/Prelude.hs
@@ -1,14 +0,0 @@-module VectorBuilder.Private.Prelude-(- module Exports,- strict,-)-where--import BasePrelude as Exports hiding ((<>))-import Data.Semigroup as Exports (Semigroup(..))--{-# INLINE strict #-}-strict :: a -> a-strict a =- seq a a
− library/VectorBuilder/Private/Update.hs
@@ -1,30 +0,0 @@-module VectorBuilder.Private.Update-where--import VectorBuilder.Private.Prelude-import qualified Data.Vector.Generic.Mutable as A-import qualified Data.Vector.Generic as B---newtype Update element =- Update (forall s vector. A.MVector vector element => vector s element -> Int -> ST s ())--{-# INLINE write #-}-write :: element -> Update element-write element =- Update (\mVector offset -> A.unsafeWrite mVector offset element)--{-# INLINE writeMany #-}-writeMany :: B.Vector vector element => vector element -> Update element-writeMany appendedVector =- Update (\mVector offset -> B.ifoldM' (\_ index element -> A.unsafeWrite mVector (strict (offset + index)) element) () appendedVector)--{-# INLINE prepend #-}-prepend :: Int -> Update element -> Update element -> Update element-prepend size (Update leftST) (Update rightST) =- Update (\mVector offset -> leftST mVector offset >> rightST mVector (strict (size + offset)))--{-# INLINE empty #-}-empty :: Update element-empty =- Update (\_ _ -> pure ())
library/VectorBuilder/Vector.hs view
@@ -3,9 +3,9 @@ module VectorBuilder.Vector where -import VectorBuilder.Private.Prelude+import VectorBuilder.Prelude import Data.Vector.Generic-import qualified VectorBuilder.Private.Builder as A+import qualified VectorBuilder.Core.Builder as A import qualified VectorBuilder.MVector as B
vector-builder.cabal view
@@ -1,12 +1,12 @@ name: vector-builder version:- 0.3.3.1+ 0.3.4 synopsis: Vector builder description: An API for efficient and convenient construction of vectors.- It provides the composable `Builder` abstraction, which has instances of the `Monoid` and `Semigroup` classes. + It provides the composable `Builder` abstraction, which has instances of the `Monoid` and `Semigroup` classes. . [Usage] .@@ -36,7 +36,7 @@ homepage: https://github.com/nikita-volkov/vector-builder bug-reports:- https://github.com/nikita-volkov/vector-builder/issues + https://github.com/nikita-volkov/vector-builder/issues author: Nikita Volkov <nikita.y.volkov@mail.ru> maintainer:@@ -52,14 +52,12 @@ cabal-version: >=1.10 - source-repository head type: git location: git://github.com/nikita-volkov/vector-builder.git - library hs-source-dirs: library@@ -67,21 +65,21 @@ 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- other-modules:- VectorBuilder.Private.Prelude- VectorBuilder.Private.Update- VectorBuilder.Private.Builder exposed-modules: VectorBuilder.Builder VectorBuilder.MVector VectorBuilder.Vector+ VectorBuilder.MonadPlus+ other-modules:+ VectorBuilder.Prelude+ VectorBuilder.Core.Update+ VectorBuilder.Core.Builder build-depends: vector >= 0.11 && < 0.13, semigroups >= 0.16 && < 0.20, base-prelude < 2, base >= 4.6 && < 5 - test-suite tests type: exitcode-stdio-1.0@@ -97,18 +95,18 @@ Haskell2010 build-depends: -- testing:- tasty == 0.11.*,- tasty-quickcheck == 0.8.*,- tasty-hunit == 0.9.*,- quickcheck-instances >= 0.3.11 && < 0.4,+ tasty >=0.12 && <0.13,+ tasty-quickcheck >=0.9 && <0.10,+ tasty-hunit >=0.9 && <0.10,+ quickcheck-instances >=0.3.11 && <0.4,+ QuickCheck >=2.8.1 && <3, -- vector-builder, -- rebase - benchmark foldl-benchmark- type: + type: exitcode-stdio-1.0 hs-source-dirs: foldl-benchmark@@ -131,9 +129,8 @@ -- general: rerebase < 2 - test-suite foldl-profiling- type: + type: exitcode-stdio-1.0 hs-source-dirs: foldl-profiling