module Morley.Michelson.TypeCheck.TypeCheckedSeq
( TypeCheckedInstr
, TypeCheckedOp(..)
, IllTypedInstr(..)
, TypeCheckedSeq(..)
, tcsEither
, seqToOps
, someInstrToOp
, someViewToOp
) where
import Morley.Michelson.TypeCheck.Error (TcError')
import Morley.Michelson.TypeCheck.TypeCheckedOp
(IllTypedInstr(..), TypeCheckedInstr, TypeCheckedOp(..), someInstrToOp, someViewToOp)
import Morley.Michelson.TypeCheck.Types (SomeTcInstr(..))
data TypeCheckedSeq op inp
= WellTypedSeq (SomeTcInstr inp)
| MixedSeq (SomeTcInstr inp) (TcError' op) [IllTypedInstr op]
| IllTypedSeq (TcError' op) [IllTypedInstr op]
seqToOps :: TypeCheckedSeq op inp -> [TypeCheckedOp op]
seqToOps :: forall op (inp :: [T]). TypeCheckedSeq op inp -> [TypeCheckedOp op]
seqToOps = \case
WellTypedSeq SomeTcInstr inp
instr -> [SomeTcInstr inp -> TypeCheckedOp op
forall (inp :: [T]) op. SomeTcInstr inp -> TypeCheckedOp op
someInstrToOp SomeTcInstr inp
instr]
MixedSeq SomeTcInstr inp
instr TcError' op
_ [IllTypedInstr op]
tail' -> SomeTcInstr inp -> TypeCheckedOp op
forall (inp :: [T]) op. SomeTcInstr inp -> TypeCheckedOp op
someInstrToOp SomeTcInstr inp
instr TypeCheckedOp op -> [TypeCheckedOp op] -> [TypeCheckedOp op]
forall a. a -> [a] -> [a]
: (IllTypedInstr op -> TypeCheckedOp op)
-> [IllTypedInstr op] -> [TypeCheckedOp op]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map IllTypedInstr op -> TypeCheckedOp op
forall op. IllTypedInstr op -> TypeCheckedOp op
IllTypedOp [IllTypedInstr op]
tail'
IllTypedSeq TcError' op
_ [IllTypedInstr op]
tail' -> (IllTypedInstr op -> TypeCheckedOp op)
-> [IllTypedInstr op] -> [TypeCheckedOp op]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map IllTypedInstr op -> TypeCheckedOp op
forall op. IllTypedInstr op -> TypeCheckedOp op
IllTypedOp [IllTypedInstr op]
tail'
tcsEither
:: ([TypeCheckedOp op] -> TcError' op -> a)
-> (SomeTcInstr inp -> a)
-> TypeCheckedSeq op inp
-> a
tcsEither :: forall op a (inp :: [T]).
([TypeCheckedOp op] -> TcError' op -> a)
-> (SomeTcInstr inp -> a) -> TypeCheckedSeq op inp -> a
tcsEither [TypeCheckedOp op] -> TcError' op -> a
onErr SomeTcInstr inp -> a
onInstr TypeCheckedSeq op inp
v = case TypeCheckedSeq op inp
v of
WellTypedSeq SomeTcInstr inp
instr -> SomeTcInstr inp -> a
onInstr SomeTcInstr inp
instr
MixedSeq SomeTcInstr inp
_ TcError' op
err [IllTypedInstr op]
_ -> [TypeCheckedOp op] -> TcError' op -> a
onErr (TypeCheckedSeq op inp -> [TypeCheckedOp op]
forall op (inp :: [T]). TypeCheckedSeq op inp -> [TypeCheckedOp op]
seqToOps TypeCheckedSeq op inp
v) TcError' op
err
IllTypedSeq TcError' op
err [IllTypedInstr op]
_ -> [TypeCheckedOp op] -> TcError' op -> a
onErr (TypeCheckedSeq op inp -> [TypeCheckedOp op]
forall op (inp :: [T]). TypeCheckedSeq op inp -> [TypeCheckedOp op]
seqToOps TypeCheckedSeq op inp
v) TcError' op
err