descriptive-0.1.0: src/Descriptive/Char.hs
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
-- | Consuming form a list of characters.
module Descriptive.Char where
import Descriptive
import Data.Text (Text)
import qualified Data.Text as T
-- | Consume any character.
anyChar :: Consumer [Char] Text Char
anyChar =
consumer (d,)
(\s ->
case s of
(c':cs') -> (Succeeded c',cs')
[] -> (Failed d,s))
where d = Unit "a character"
-- | A character consumer.
char :: Char -> Consumer [Char] Text Char
char c =
wrap (const .
(d,))
(\s _ p ->
case p s of
(Failed e,s') -> (Failed e,s')
(Continued e,s') -> (Continued e,s')
(Succeeded c',s')
| c' == c -> (Succeeded c,s')
| otherwise -> (Failed d,s'))
anyChar
where d = Unit (T.singleton c)
-- | A string consumer.
string :: [Char] -> Consumer [Char] Text [Char]
string = sequencing . map char