module ADP.Fusion.PointL.Term.Epsilon where
import Data.Proxy
import Data.Strict.Tuple
import qualified Data.Vector.Fusion.Stream.Monadic as S
import GHC.Exts
import Data.PrimitiveArray
import ADP.Fusion.Core
import ADP.Fusion.Core.Term.Epsilon
import ADP.Fusion.PointL.Core
type instance LeftPosTy (IStatic d) (Epsilon Global) (PointL I) = IStatic d
type instance LeftPosTy (IStatic d) (Epsilon Local) (PointL I) = IVariable d
type instance LeftPosTy (OStatic d) (Epsilon Global) (PointL O) = OStatic d
instance
forall pos posLeft m ls i lg
. ( TermStream m (Z:.pos) (TermSymbol M (Epsilon lg)) (Elm (Term1 (Elm ls (PointL i))) (Z :. PointL i)) (Z:.PointL i)
, posLeft ~ LeftPosTy pos (Epsilon lg) (PointL i)
, TermStaticVar pos (Epsilon lg) (PointL i)
, MkStream m posLeft ls (PointL i)
)
⇒ MkStream m pos (ls :!: (Epsilon lg)) (PointL i) where
mkStream Proxy (ls :!: Epsilon) grd us is
= S.map (\(ss,ee,ii) -> ElmEpsilon ii ss)
. addTermStream1 (Proxy ∷ Proxy pos) (Epsilon @lg) us is
$ mkStream (Proxy ∷ Proxy posLeft)
ls
(termStaticCheck (Proxy ∷ Proxy pos) (Epsilon @lg) us is grd)
us
(termStreamIndex (Proxy ∷ Proxy pos) (Epsilon @lg) is)
{-# Inline mkStream #-}
instance
( TermStreamContext m ps ts s x0 i0 is (PointL I)
)
⇒ TermStream m (ps:.IStatic d) (TermSymbol ts (Epsilon lg)) s (is:.PointL I) where
termStream Proxy (ts:|Epsilon) (us:..LtPointL u) (is:.PointL i)
= S.map (\(TState s ii ee) ->
let RiPlI k = getIndex (getIdx s) (Proxy :: PRI is (PointL I))
in TState s (ii:.:RiPlI k) (ee:.()))
. termStream (Proxy ∷ Proxy ps) ts us is
{-# Inline termStream #-}
instance
( TermStreamContext m ps ts s x0 i0 is (PointL O)
) => TermStream m (ps:.OStatic d) (TermSymbol ts (Epsilon lg)) s (is:.PointL O) where
termStream Proxy (ts:|Epsilon) (us:..LtPointL u) (is:.PointL i)
= S.map (\(TState s ii ee) ->
let io = getIndex (getIdx s) (Proxy :: PRI is (PointL O))
in TState s (ii:.:io) (ee:.()))
. termStream (Proxy ∷ Proxy ps) ts us is
{-# Inline termStream #-}
instance TermStaticVar (IStatic 0) (Epsilon Global) (PointL I) where
termStreamIndex Proxy Epsilon (PointL i ) = PointL i
termStaticCheck Proxy Epsilon _ (PointL (I# i)) grd = (i ==# 0#) `andI#` grd
{-# Inline [0] termStreamIndex #-}
{-# Inline [0] termStaticCheck #-}
instance TermStaticVar (IStatic 0) (Epsilon Local) (PointL I) where
termStreamIndex Proxy Epsilon (PointL i ) = PointL i
termStaticCheck Proxy Epsilon _ (PointL (I# i)) grd = grd
{-# Inline termStreamIndex #-}
{-# Inline termStaticCheck #-}
instance TermStaticVar (OStatic 0) (Epsilon Global) (PointL O) where
termStreamIndex Proxy Epsilon (PointL i ) = PointL i
termStaticCheck Proxy Epsilon (LtPointL (I# u)) (PointL (I# i)) grd = (u ==# i) `andI#` grd
{-# Inline [0] termStreamIndex #-}
{-# Inline [0] termStaticCheck #-}
instance TermStaticVar (OStatic 0) (Epsilon Local) (PointL O) where
termStreamIndex Proxy Epsilon (PointL i ) = PointL i
termStaticCheck Proxy Epsilon (LtPointL (I# u)) (PointL (I# i)) grd = grd
{-# Inline [0] termStreamIndex #-}
{-# Inline [0] termStaticCheck #-}