module Indigo.Internal.SIS
( SomeIndigoState (..)
, SomeGenCode (..)
, toSIS
, runSIS
, thenSIS
, overSIS
) where
import Indigo.Prelude
import Indigo.Internal.State
data SomeGenCode inp where
SomeGenCode :: GenCode inp out -> SomeGenCode inp
newtype SomeIndigoState inp = SomeIndigoState
{ SomeIndigoState inp -> MetaData inp -> SomeGenCode inp
unSIS :: MetaData inp -> SomeGenCode inp
}
runSIS :: SomeIndigoState inp -> MetaData inp -> (forall out . GenCode inp out -> r) -> r
runSIS :: SomeIndigoState inp
-> MetaData inp -> (forall (out :: [*]). GenCode inp out -> r) -> r
runSIS (SomeIndigoState act :: MetaData inp -> SomeGenCode inp
act) md :: MetaData inp
md f :: forall (out :: [*]). GenCode inp out -> r
f = case MetaData inp -> SomeGenCode inp
act MetaData inp
md of
SomeGenCode gc :: GenCode inp out
gc -> GenCode inp out -> r
forall (out :: [*]). GenCode inp out -> r
f GenCode inp out
gc
toSIS :: IndigoState inp out -> SomeIndigoState inp
toSIS :: IndigoState inp out -> SomeIndigoState inp
toSIS is :: IndigoState inp out
is = (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall (inp :: [*]).
(MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
SomeIndigoState ((MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp)
-> (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall a b. (a -> b) -> a -> b
$ \md :: MetaData inp
md -> GenCode inp out -> SomeGenCode inp
forall (inp :: [*]) (out :: [*]).
GenCode inp out -> SomeGenCode inp
SomeGenCode (GenCode inp out -> SomeGenCode inp)
-> GenCode inp out -> SomeGenCode inp
forall a b. (a -> b) -> a -> b
$ IndigoState inp out -> MetaData inp -> GenCode inp out
forall (inp :: [*]) (out :: [*]).
IndigoState inp out -> MetaData inp -> GenCode inp out
runIndigoState IndigoState inp out
is MetaData inp
md
thenSIS :: SomeIndigoState inp -> (forall out . SomeIndigoState out) -> SomeIndigoState inp
thenSIS :: SomeIndigoState inp
-> (forall (out :: [*]). SomeIndigoState out)
-> SomeIndigoState inp
thenSIS m :: SomeIndigoState inp
m f :: forall (out :: [*]). SomeIndigoState out
f = (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall (inp :: [*]).
(MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
SomeIndigoState ((MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp)
-> (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall a b. (a -> b) -> a -> b
$ \md :: MetaData inp
md ->
case SomeIndigoState inp -> MetaData inp -> SomeGenCode inp
forall (inp :: [*]).
SomeIndigoState inp -> MetaData inp -> SomeGenCode inp
unSIS SomeIndigoState inp
m MetaData inp
md of
(SomeGenCode (GenCode st1 :: StackVars out
st1 cd1 :: inp :-> out
cd1 cl1 :: out :-> inp
cl1 :: GenCode inp out)) ->
case SomeIndigoState out -> MetaData out -> SomeGenCode out
forall (inp :: [*]).
SomeIndigoState inp -> MetaData inp -> SomeGenCode inp
unSIS (SomeIndigoState out
forall (out :: [*]). SomeIndigoState out
f @out) (MetaData inp -> StackVars out -> MetaData out
forall (inp :: [*]) (inp1 :: [*]).
MetaData inp -> StackVars inp1 -> MetaData inp1
replStkMd MetaData inp
md StackVars out
st1) of
SomeGenCode (GenCode st2 :: StackVars out
st2 cd2 :: out :-> out
cd2 cl2 :: out :-> out
cl2) ->
GenCode inp out -> SomeGenCode inp
forall (inp :: [*]) (out :: [*]).
GenCode inp out -> SomeGenCode inp
SomeGenCode (StackVars out -> (inp :-> out) -> (out :-> inp) -> GenCode inp out
forall (inp :: [*]) (out :: [*]).
StackVars out -> (inp :-> out) -> (out :-> inp) -> GenCode inp out
GenCode StackVars out
st2 (inp :-> out
cd1 (inp :-> out) -> (out :-> out) -> inp :-> out
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
## out :-> out
cd2) (out :-> out
cl2 (out :-> out) -> (out :-> inp) -> out :-> inp
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
## out :-> inp
cl1))
overSIS
:: (forall out. GenCode inp out -> SomeGenCode inp)
-> SomeIndigoState inp
-> SomeIndigoState inp
overSIS :: (forall (out :: [*]). GenCode inp out -> SomeGenCode inp)
-> SomeIndigoState inp -> SomeIndigoState inp
overSIS f :: forall (out :: [*]). GenCode inp out -> SomeGenCode inp
f si :: SomeIndigoState inp
si = (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall (inp :: [*]).
(MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
SomeIndigoState ((MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp)
-> (MetaData inp -> SomeGenCode inp) -> SomeIndigoState inp
forall a b. (a -> b) -> a -> b
$ \md :: MetaData inp
md -> SomeIndigoState inp
-> MetaData inp
-> (forall (out :: [*]). GenCode inp out -> SomeGenCode inp)
-> SomeGenCode inp
forall (inp :: [*]) r.
SomeIndigoState inp
-> MetaData inp -> (forall (out :: [*]). GenCode inp out -> r) -> r
runSIS SomeIndigoState inp
si MetaData inp
md forall (out :: [*]). GenCode inp out -> SomeGenCode inp
f