module Feldspar.Data.Validated where
import Prelude ()
import Language.Syntactic
import Feldspar hiding (desugar, sugar)
import Feldspar.Representation
data Validated a = Validated (Data Bool) a
instance Functor Validated
where
fmap f (Validated valid a) = Validated valid (f a)
instance Applicative Validated
where
pure = return
(<*>) = ap
instance Monad Validated
where
return = Validated true
Validated valid a >>= k = Validated (valid && valid') b
where
Validated valid' b = k a
instance Syntax a => Syntactic (Validated a)
where
type Domain (Validated a) = FeldDomain
type Internal (Validated a) = (Bool, Internal a)
desugar (Validated valid a) = desugar (valid,a)
sugar = uncurry Validated . sugar
validWhen :: Data Bool -> a -> Validated a
validWhen = Validated
invalid :: Syntax a => Validated a
invalid = Validated false example
validated :: Syntax b
=> b
-> (a -> b)
-> Validated a
-> b
validated no yes (Validated valid a) = valid ? yes a $ no
caseValidated :: Syntax b
=> Validated a
-> b
-> (a -> b)
-> b
caseValidated v no yes = validated no yes v
fromValidated :: Syntax a
=> Validated a
-> a
-> a
fromValidated v def = caseValidated v def id
validatedM :: MonadComp m
=> m ()
-> (a -> m ())
-> Validated a
-> m ()
validatedM no yes (Validated valid a) = iff valid (yes a) no
caseValidatedM :: MonadComp m
=> Validated a
-> m ()
-> (a -> m ())
-> m ()
caseValidatedM v no yes = validatedM no yes v