-- |-- Module : Control.Monad.Combinators.NonEmpty-- Copyright : © 2017–present Mark Karpov-- License : BSD 3 clause---- Maintainer : Mark Karpov <markkarpov92@gmail.com>-- Stability : experimental-- Portability : portable---- The module provides 'NonEmpty' list variants of some of the functions-- from "Control.Monad.Combinators".---- @since 0.4.0moduleControl.Monad.Combinators.NonEmpty(some ,endBy1 ,someTill ,sepBy1 ,sepEndBy1 ,)whereimportControl.MonadimportqualifiedControl.Monad.Combinators asCimportData.List.NonEmpty(NonEmpty(..))importqualifiedData.List.NonEmptyasNE-- | @'some' p@ applies the parser @p@ /one/ or more times and returns a-- list of the values returned by @p@.---- > word = some lettersome ::MonadPlusm =>m a ->m (NonEmptya )some :: m a -> m (NonEmpty a) some m a p =[a] -> NonEmpty a forall a. [a] -> NonEmpty a NE.fromList([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>m a -> m [a] forall (m :: * -> *) a. MonadPlus m => m a -> m [a] C.some m a p {-# INLINEsome #-}-- | @'endBy1' p sep@ parses /one/ or more occurrences of @p@, separated and-- ended by @sep@. Returns a non-empty list of values returned by @p@.endBy1 ::MonadPlusm =>m a ->m sep ->m (NonEmptya )endBy1 :: m a -> m sep -> m (NonEmpty a) endBy1 m a p m sep sep =[a] -> NonEmpty a forall a. [a] -> NonEmpty a NE.fromList([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>m a -> m sep -> m [a] forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a] C.endBy1 m a p m sep sep {-# INLINEendBy1 #-}-- | @'someTill' p end@ works similarly to @'C.manyTill' p end@, but @p@-- should succeed at least once.---- See also: 'C.skipSome', 'C.skipSomeTill'.someTill ::MonadPlusm =>m a ->m end ->m (NonEmptya )someTill :: m a -> m end -> m (NonEmpty a) someTill m a p m end end =[a] -> NonEmpty a forall a. [a] -> NonEmpty a NE.fromList([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>m a -> m end -> m [a] forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a] C.someTill m a p m end end {-# INLINEsomeTill #-}-- | @'sepBy1' p sep@ parses /one/ or more occurrences of @p@, separated by-- @sep@. Returns a non-empty list of values returned by @p@.sepBy1 ::MonadPlusm =>m a ->m sep ->m (NonEmptya )sepBy1 :: m a -> m sep -> m (NonEmpty a) sepBy1 m a p m sep sep =[a] -> NonEmpty a forall a. [a] -> NonEmpty a NE.fromList([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>m a -> m sep -> m [a] forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a] C.sepBy1 m a p m sep sep {-# INLINEsepBy1 #-}-- | @'sepEndBy1' p sep@ parses /one/ or more occurrences of @p@, separated-- and optionally ended by @sep@. Returns a non-empty list of values returned by-- @p@.sepEndBy1 ::MonadPlusm =>m a ->m sep ->m (NonEmptya )sepEndBy1 :: m a -> m sep -> m (NonEmpty a) sepEndBy1 m a p m sep sep =[a] -> NonEmpty a forall a. [a] -> NonEmpty a NE.fromList([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>m a -> m sep -> m [a] forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a] C.sepEndBy1 m a p m sep sep {-# INLINEsepEndBy1 #-}