module ADP.Fusion.Term.PeekIndex.Set1 where
import Data.Strict.Tuple
import Data.Vector.Fusion.Stream.Monadic hiding (flatten)
import Debug.Trace
import Prelude hiding (map)
import Data.PrimitiveArray hiding (map)
import ADP.Fusion.Core hiding (PeekIndex, ElmPeekIndex)
import ADP.Fusion.Core.Set1
data PeekIndex i = PeekIndex
instance Build (PeekIndex i)
instance
( Element ls i
) => Element (ls :!: PeekIndex i) i where
data Elm (ls :!: PeekIndex i) i = ElmPeekIndex !i !(RunningIndex i) !(Elm ls i)
type Arg (ls :!: PeekIndex i) = Arg ls :. i
getArg (ElmPeekIndex x _ ls) = getArg ls :. x
getIdx (ElmPeekIndex _ i _ ) = i
deriving instance (Show i, Show (RunningIndex i), Show (Elm ls i)) => Show (Elm (ls :!: PeekIndex i) i)
type instance TermArg (PeekIndex i) = i
instance
( TmkCtx1 m ls (PeekIndex (BS1 k t)) (BS1 k t)
) => MkStream m (ls :!: PeekIndex (BS1 k t)) (BS1 k t) where
mkStream (ls :!: PeekIndex) sv us is
= map (\(ss,ee,ii) -> ElmPeekIndex ee ii ss)
. addTermStream1 PeekIndex sv us is
$ mkStream ls (termStaticVar (PeekIndex :: PeekIndex (BS1 k t)) sv is) us (termStreamIndex (PeekIndex :: PeekIndex (BS1 k t)) sv is)
instance
( TstCtx m ts s x0 i0 is (BS1 k I)
) => TermStream m (TermSymbol ts (PeekIndex (BS1 k I))) s (is:.BS1 k I) where
termStream (ts:|PeekIndex) (cs:.IStatic r) (us:.u) (is:.BS1 i b)
= map (\(TState s ii ee) ->
let RiBs1I bs1 = getIndex (getIdx s) (Proxy :: PRI is (BS1 k I))
in TState s (ii:.:RiBs1I bs1) (ee:.bs1) )
. termStream ts cs us is
instance TermStaticVar (PeekIndex (BS1 k i)) (BS1 k i) where
termStaticVar _ isv _ = isv
termStreamIndex _ _ ix = ix