{-# LANGUAGE NoImplicitPrelude #-} module Data.Foscam.File.Internal( charP , digitCharacter , boolj ) where import Control.Applicative(pure) import Control.Category((.)) import Control.Monad(Monad((>>=), fail)) import Data.Bool(bool, Bool) import Data.Char(Char) import Data.Digit(Digit, digitC) import Data.Maybe(Maybe(Nothing, Just), maybe) import Data.Monoid(First, (<>)) import Control.Lens(Getting, (^?)) import Text.Parser.Char(CharParsing, anyChar) import Text.Parser.Combinators(()) charP :: (Monad f, CharParsing f) => (Char -> f a) -> Getting (First a) Char a -> f a charP fl p = anyChar >>= \c -> maybe (fl c) pure (c ^? p) digitCharacter :: (Monad f, CharParsing f) => f Digit digitCharacter = charP (fail . ("not a digit: " <>) . pure) digitC "digit" boolj :: (a -> Bool) -> a -> Maybe a boolj p x = bool Nothing (Just x) (p x)