applicative-parsec-0.1.0.0: src/Text/Parsec/Applicative.hs
module Text.Parsec.Applicative
( module Control.Applicative
, module Data.Traversable
, module Text.Parsec.Applicative.Types
, Parser()
, ParseError(..)
, eof
, token
, try
, label
, parse
, parse'
, accept
, accept'
, between
, choice
, option
, sepBy
, updatePosString
, getPosition
) where
import Control.Applicative
import Control.Lens
import Data.Traversable (Traversable(traverse, sequenceA), for, mapAccumL, mapAccumR)
import Text.Parsec.Applicative.Internal
import Text.Parsec.Applicative.Types
between :: (Applicative f) => f a -> f b -> f c -> f c
between l r m = l *> m <* r
choice :: (Alternative f) => [f a] -> f a
choice = foldr (<|>) empty
option :: (Alternative f) => a -> f a -> f a
option = flip (<|>) . pure
sepBy :: (Alternative f) => f a -> f b -> f [a]
sepBy p delim = ((:) <$> p <*> many (delim *> p)) <|> empty
updatePosString :: SourcePos -> String -> SourcePos
updatePosString = foldr f
where
f '\n' = (set spColumn 0) . (over spLine (+ 1))
f _ = over spColumn (+ 1)
getPosition :: (HasSourcePos td) => Parser s tt td SourcePos
getPosition = PGetPos