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)