File: MonadPlus.hs

package info (click to toggle)
haskell-vector-builder 0.3.8.6-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 84 kB
  • sloc: haskell: 364; makefile: 3
file content (57 lines) | stat: -rw-r--r-- 1,625 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- |
-- MonadPlus utilities.
-- For instance, they can be applied with parsing libraries.
module VectorBuilder.MonadPlus where

import qualified Data.Vector.Generic as C
import qualified VectorBuilder.Builder as A
import VectorBuilder.Prelude
import qualified VectorBuilder.Vector as B

{-# INLINEABLE many #-}
many :: (MonadPlus m, C.Vector vector element) => m element -> m (vector element)
many m =
  liftM B.build (manyBuilder m)

{-# INLINEABLE manyBuilder #-}
manyBuilder :: (MonadPlus m) => m element -> m (A.Builder element)
manyBuilder m =
  loop mempty
  where
    loop !builder =
      mplus
        ( do
            !element <- m
            loop (builder <> A.singleton element)
        )
        (return builder)

{-# INLINEABLE 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))

{-# INLINEABLE sepBy #-}
sepBy :: (MonadPlus m, C.Vector vector element) => m element -> m separator -> m (vector element)
sepBy elementM separatorM =
  mplus (sepBy1 elementM separatorM) (return C.empty)

{-# INLINEABLE sepBy1 #-}
sepBy1 :: (MonadPlus m, C.Vector vector element) => m element -> m separator -> m (vector element)
sepBy1 elementM separatorM =
  do
    firstElement <- elementM
    builder <- loop (A.singleton firstElement)
    return (B.build builder)
  where
    loop builder =
      mplus
        ( do
            separatorM
            !element <- elementM
            loop (builder <> A.singleton element)
        )
        (return builder)