module VectorBuilder.Alternative where
import Data.Vector (Vector)
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 :: forall (m :: * -> *) (vector :: * -> *) a.
(Alternative m, Vector vector a) =>
m a -> m (vector a)
many = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (vector :: * -> *) element.
Vector vector element =>
Builder element -> vector element
B.build forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall (m :: * -> *) a. Alternative m => m a -> m (Builder a)
manyBuilder
{-# INLINEABLE manyBuilder #-}
manyBuilder :: Alternative m => m a -> m (A.Builder a)
manyBuilder :: forall (m :: * -> *) a. Alternative m => m a -> m (Builder a)
manyBuilder m a
m =
let loop :: m (Builder a)
loop = (forall a. Semigroup a => a -> a -> a
(<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall element. element -> Builder element
A.singleton forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
m forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m (Builder a)
loop) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
in m (Builder a)
loop
{-# INLINEABLE some #-}
some :: (Alternative m, C.Vector vector a) => m a -> m (vector a)
some :: forall (m :: * -> *) (vector :: * -> *) a.
(Alternative m, Vector vector a) =>
m a -> m (vector a)
some m a
m = forall (vector :: * -> *) element.
Vector vector element =>
Builder element -> vector element
B.build forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. Alternative m => m a -> m (Builder a)
someBuilder m a
m
{-# INLINEABLE someBuilder #-}
someBuilder :: Alternative m => m a -> m (A.Builder a)
someBuilder :: forall (m :: * -> *) a. Alternative m => m a -> m (Builder a)
someBuilder m a
m = forall a. Semigroup a => a -> a -> a
(<>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall element. element -> Builder element
A.singleton forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
m forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. Alternative m => m a -> m (Builder a)
manyBuilder m a
m