module Data.Foscam.File.AliasCharacter (
AliasCharacter
, AsAliasCharacter(..)
, aliasCharacter
) where
import Control.Applicative(Applicative(pure), (<$>))
import Control.Category(Category((.), id))
import Control.Lens(Optic', Choice, prism')
import Control.Monad(Monad(fail))
import Data.Char(Char)
import Data.Eq(Eq)
import Data.Foscam.File.Internal(boolj, charP)
import Data.List((++), notElem)
import Data.Ord(Ord)
import Prelude(Show)
import Text.Parser.Char(CharParsing)
import Text.Parser.Combinators((<?>))
newtype AliasCharacter =
AliasCharacter Char
deriving (Eq, Ord, Show)
class AsAliasCharacter p f s where
_AliasCharacter ::
Optic' p f s AliasCharacter
instance AsAliasCharacter p f AliasCharacter where
_AliasCharacter =
id
instance (Choice p, Applicative f) => AsAliasCharacter p f Char where
_AliasCharacter =
prism'
(\(AliasCharacter c) -> c)
((AliasCharacter <$>) . boolj (`notElem` ['/', ':', '*', '?', '"', '<', '>', '(', ')']))
aliasCharacter ::
(Monad f, CharParsing f) =>
f AliasCharacter
aliasCharacter =
charP (fail . ("not an alias character: " ++) . pure) _AliasCharacter <?> "alias character"