module ForSyDe.Shallow.Core.AbsentExt (
AbstExt (Abst, Prst), fromAbstExt, abstExt, psi,
isAbsent, isPresent, abstExtFunc
) where
data AbstExt a = Abst
| Prst a deriving (AbstExt a -> AbstExt a -> Bool
(AbstExt a -> AbstExt a -> Bool)
-> (AbstExt a -> AbstExt a -> Bool) -> Eq (AbstExt a)
forall a. Eq a => AbstExt a -> AbstExt a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AbstExt a -> AbstExt a -> Bool
$c/= :: forall a. Eq a => AbstExt a -> AbstExt a -> Bool
== :: AbstExt a -> AbstExt a -> Bool
$c== :: forall a. Eq a => AbstExt a -> AbstExt a -> Bool
Eq)
fromAbstExt :: a -> AbstExt a -> a
isPresent :: AbstExt a -> Bool
isAbsent :: AbstExt a -> Bool
abstExtFunc :: (a -> b) -> AbstExt a -> AbstExt b
psi :: (a -> b) -> AbstExt a -> AbstExt b
abstExt :: a -> AbstExt a
instance Show a => Show (AbstExt a) where
showsPrec :: Int -> AbstExt a -> ShowS
showsPrec Int
_ = AbstExt a -> ShowS
forall a. Show a => AbstExt a -> ShowS
showsAbstExt
showsAbstExt :: Show a => AbstExt a -> String -> String
showsAbstExt :: AbstExt a -> ShowS
showsAbstExt AbstExt a
Abst = String -> ShowS
forall a. [a] -> [a] -> [a]
(++) String
"_"
showsAbstExt (Prst a
x) = String -> ShowS
forall a. [a] -> [a] -> [a]
(++) (a -> String
forall a. Show a => a -> String
show a
x)
instance Read a => Read (AbstExt a) where
readsPrec :: Int -> ReadS (AbstExt a)
readsPrec Int
_ = ReadS (AbstExt a)
forall a. Read a => ReadS (AbstExt a)
readsAbstExt
readsAbstExt :: (Read a) => ReadS (AbstExt a)
readsAbstExt :: ReadS (AbstExt a)
readsAbstExt String
s = [(AbstExt a
forall a. AbstExt a
Abst, String
r1) | (String
"_", String
r1) <- ReadS String
lex String
s]
[(AbstExt a, String)]
-> [(AbstExt a, String)] -> [(AbstExt a, String)]
forall a. [a] -> [a] -> [a]
++ [(a -> AbstExt a
forall a. a -> AbstExt a
Prst a
x, String
r2) | (a
x, String
r2) <- ReadS a
forall a. Read a => ReadS a
reads String
s]
abstExt :: a -> AbstExt a
abstExt = a -> AbstExt a
forall a. a -> AbstExt a
Prst
fromAbstExt :: a -> AbstExt a -> a
fromAbstExt a
x AbstExt a
Abst = a
x
fromAbstExt a
_ (Prst a
y) = a
y
isPresent :: AbstExt a -> Bool
isPresent AbstExt a
Abst = Bool
False
isPresent (Prst a
_) = Bool
True
isAbsent :: AbstExt a -> Bool
isAbsent = Bool -> Bool
not (Bool -> Bool) -> (AbstExt a -> Bool) -> AbstExt a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AbstExt a -> Bool
forall a. AbstExt a -> Bool
isPresent
abstExtFunc :: (a -> b) -> AbstExt a -> AbstExt b
abstExtFunc a -> b
f = AbstExt a -> AbstExt b
f'
where f' :: AbstExt a -> AbstExt b
f' AbstExt a
Abst = AbstExt b
forall a. AbstExt a
Abst
f' (Prst a
x) = b -> AbstExt b
forall a. a -> AbstExt a
Prst (a -> b
f a
x)
psi :: (a -> b) -> AbstExt a -> AbstExt b
psi = (a -> b) -> AbstExt a -> AbstExt b
forall a b. (a -> b) -> AbstExt a -> AbstExt b
abstExtFunc
instance Functor AbstExt where
fmap :: (a -> b) -> AbstExt a -> AbstExt b
fmap = (a -> b) -> AbstExt a -> AbstExt b
forall a b. (a -> b) -> AbstExt a -> AbstExt b
abstExtFunc