packages feed

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 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