vector-builder 0.3.7.1 → 0.3.7.2
raw patch · 3 files changed
+50/−12 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ VectorBuilder.MonadPlus: many1 :: (MonadPlus m, Vector vector element) => m element -> m (vector element)
+ VectorBuilder.MonadPlus: manyBuilder :: MonadPlus m => m element -> m (Builder element)
Files
- library/VectorBuilder/MonadPlus.hs +28/−11
- tests/Main.hs +21/−0
- vector-builder.cabal +1/−1
library/VectorBuilder/MonadPlus.hs view
@@ -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)
tests/Main.hs view
@@ -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))+ ] ]
vector-builder.cabal view
@@ -1,7 +1,7 @@ name: vector-builder version:- 0.3.7.1+ 0.3.7.2 synopsis: Vector builder description: