diff --git a/library/VectorBuilder/MonadPlus.hs b/library/VectorBuilder/MonadPlus.hs
--- a/library/VectorBuilder/MonadPlus.hs
+++ b/library/VectorBuilder/MonadPlus.hs
@@ -15,16 +15,28 @@
 {-# INLINABLE many #-}
 many :: (MonadPlus m, C.Vector vector element) => m element -> m (vector element)
 many m =
-  liftM B.build loop
+  liftM B.build (manyBuilder m)
+
+{-# INLINABLE manyBuilder #-}
+manyBuilder :: (MonadPlus m) => m element -> m (A.Builder element)
+manyBuilder m =
+  loop mempty
   where
-    loop =
+    loop !builder =
       mplus
         (do
           !element <- m
-          remainders <- loop
-          return (A.singleton element <> remainders))
-        (return mempty)
+          loop (builder <> A.singleton element))
+        (return builder)
 
+{-# INLINABLE many1 #-}
+many1 :: (MonadPlus m, C.Vector vector element) => m element -> m (vector element)
+many1 m =
+  do
+    firstElement <- m
+    builder <- manyBuilder m
+    return (B.build (A.singleton firstElement <> builder))
+
 {-# INLINABLE sepBy #-}
 sepBy :: (MonadPlus m, C.Vector vector element) => m element -> m separator -> m (vector element)
 sepBy elementM separatorM =
@@ -33,10 +45,15 @@
 {-# INLINABLE sepBy1 #-}
 sepBy1 :: (MonadPlus m, C.Vector vector element) => m element -> m separator -> m (vector element)
 sepBy1 elementM separatorM =
-  liftM B.build loop
+  do
+    firstElement <- elementM
+    builder <- loop (A.singleton firstElement)
+    return (B.build builder)
   where
-    loop =
-      do
-        !element <- elementM
-        remainders <- mplus (separatorM >> loop) (return mempty)
-        return (A.singleton element <> remainders)
+    loop builder =
+      mplus
+        (do
+          separatorM
+          !element <- elementM
+          loop (builder <> A.singleton element))
+        (return builder)
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -8,9 +8,11 @@
 import qualified VectorBuilder.Builder as A
 import qualified VectorBuilder.Vector as B
 import qualified VectorBuilder.Alternative as F
+import qualified VectorBuilder.MonadPlus as H
 import qualified Main.Sample as C
 import qualified Data.Attoparsec.Text as D
 import qualified Data.Vector as E
+import qualified Data.Text as G
 
 
 main =
@@ -36,5 +38,24 @@
     testProperty "foldable" $ \(elements :: [Int]) ->
       E.fromList elements ===
       B.build (A.foldable elements)
+    ,
+    testGroup "MonadPlus"
+    [
+      testProperty "many" $ \(elements :: [Char]) ->
+        Right (E.fromList elements) ===
+        D.parseOnly (H.many D.anyChar) (fromString elements)
+      ,
+      testProperty "many1" $ \(elements :: [Char]) ->
+        (if null elements
+          then Left "not enough input"
+          else Right (E.fromList elements)) ===
+        D.parseOnly (H.many1 D.anyChar) (fromString elements)
+      ,
+      testProperty "sepBy1" $ \(elements :: [Char]) ->
+        (if null elements
+          then Left "not enough input"
+          else Right (E.fromList elements)) ===
+        D.parseOnly (H.sepBy1 D.anyChar (D.char ',')) (G.intersperse ',' (fromString elements))
+    ]
   ]
 
diff --git a/vector-builder.cabal b/vector-builder.cabal
--- a/vector-builder.cabal
+++ b/vector-builder.cabal
@@ -1,7 +1,7 @@
 name:
   vector-builder
 version:
-  0.3.7.1
+  0.3.7.2
 synopsis:
   Vector builder
 description:
