File: Alternative.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 (27 lines) | stat: -rw-r--r-- 894 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
-- |
-- Alternative utilities.
-- For instance, they can be applied with parsing libraries.
module VectorBuilder.Alternative where

import qualified Data.Vector.Generic as C
import qualified VectorBuilder.Builder as A
import VectorBuilder.Prelude hiding (many, some)
import qualified VectorBuilder.Vector as B

{-# INLINEABLE many #-}
many :: (Alternative m, C.Vector vector a) => m a -> m (vector a)
many = fmap B.build . manyBuilder

{-# INLINEABLE manyBuilder #-}
manyBuilder :: (Alternative m) => m a -> m (A.Builder a)
manyBuilder m =
  let loop = ((<>) <$> A.singleton <$> m <*> loop) <|> pure mempty
   in loop

{-# INLINEABLE some #-}
some :: (Alternative m, C.Vector vector a) => m a -> m (vector a)
some m = B.build <$> someBuilder m

{-# INLINEABLE someBuilder #-}
someBuilder :: (Alternative m) => m a -> m (A.Builder a)
someBuilder m = (<>) <$> A.singleton <$> m <*> manyBuilder m