diff --git a/foldl-benchmark/Main.hs b/foldl-benchmark/Main.hs
--- a/foldl-benchmark/Main.hs
+++ b/foldl-benchmark/Main.hs
@@ -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
diff --git a/library/VectorBuilder/Builder.hs b/library/VectorBuilder/Builder.hs
--- a/library/VectorBuilder/Builder.hs
+++ b/library/VectorBuilder/Builder.hs
@@ -7,4 +7,4 @@
 )
 where
 
-import VectorBuilder.Private.Builder
+import VectorBuilder.Core.Builder
diff --git a/library/VectorBuilder/Core/Builder.hs b/library/VectorBuilder/Core/Builder.hs
new file mode 100644
--- /dev/null
+++ b/library/VectorBuilder/Core/Builder.hs
@@ -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 =
+    (<>)
+
+
diff --git a/library/VectorBuilder/Core/Update.hs b/library/VectorBuilder/Core/Update.hs
new file mode 100644
--- /dev/null
+++ b/library/VectorBuilder/Core/Update.hs
@@ -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 ())
diff --git a/library/VectorBuilder/MVector.hs b/library/VectorBuilder/MVector.hs
--- a/library/VectorBuilder/MVector.hs
+++ b/library/VectorBuilder/MVector.hs
@@ -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
 
 
 -- |
diff --git a/library/VectorBuilder/MonadPlus.hs b/library/VectorBuilder/MonadPlus.hs
new file mode 100644
--- /dev/null
+++ b/library/VectorBuilder/MonadPlus.hs
@@ -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)
diff --git a/library/VectorBuilder/Prelude.hs b/library/VectorBuilder/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/library/VectorBuilder/Prelude.hs
@@ -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
diff --git a/library/VectorBuilder/Private/Builder.hs b/library/VectorBuilder/Private/Builder.hs
deleted file mode 100644
--- a/library/VectorBuilder/Private/Builder.hs
+++ /dev/null
@@ -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 =
-    (<>)
-
-
diff --git a/library/VectorBuilder/Private/Prelude.hs b/library/VectorBuilder/Private/Prelude.hs
deleted file mode 100644
--- a/library/VectorBuilder/Private/Prelude.hs
+++ /dev/null
@@ -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
diff --git a/library/VectorBuilder/Private/Update.hs b/library/VectorBuilder/Private/Update.hs
deleted file mode 100644
--- a/library/VectorBuilder/Private/Update.hs
+++ /dev/null
@@ -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 ())
diff --git a/library/VectorBuilder/Vector.hs b/library/VectorBuilder/Vector.hs
--- a/library/VectorBuilder/Vector.hs
+++ b/library/VectorBuilder/Vector.hs
@@ -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
 
 
diff --git a/vector-builder.cabal b/vector-builder.cabal
--- a/vector-builder.cabal
+++ b/vector-builder.cabal
@@ -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
