{-# Language MagicHash #-}
module ADP.Fusion.Core.SynVar.Array
( module ADP.Fusion.Core.SynVar.Array.Type
, module ADP.Fusion.Core.SynVar.Array
) where
import Data.Proxy
import Data.Strict.Tuple hiding (snd)
import Data.Vector.Fusion.Stream.Monadic
import GHC.Exts
import Prelude hiding (map,mapM)
import Data.PrimitiveArray hiding (map)
import ADP.Fusion.Core.Classes
import ADP.Fusion.Core.Multi
import ADP.Fusion.Core.SynVar.Array.Type
import ADP.Fusion.Core.SynVar.Backtrack
import ADP.Fusion.Core.SynVar.Indices
import ADP.Fusion.Core.SynVar.TableWrap
type ITblCx m pos ls arr x u c i =
( TableStaticVar pos c u i
, Element ls i
, AddIndexDense (Z:.pos) (Elm (SynVar1 (Elm ls i)) (Z:.i)) (Z:.c) (Z:.u) (Z:.i)
, PrimArrayOps arr u x
)
iTblStream
∷ forall b s m pos posLeft ls arr x u c i
. ( ITblCx m pos ls arr x u c i
, posLeft ~ LeftPosTy pos (TwITbl b s m arr c u x) i
, MkStream m posLeft ls i
)
⇒ Proxy pos
→ Pair ls (TwITbl b s m arr c u x)
→ Int#
→ LimitType i
→ i
→ Stream m (Elm (ls :!: TwITbl b s m arr c u x) i)
iTblStream pos (ls :!: TW (ITbl c t) _) grd us is
= map (\(s,tt,ii') -> ElmITbl (t!tt) ii' s)
. addIndexDense1 pos c ub us is
$ mkStream (Proxy ∷ Proxy posLeft) ls grd us (tableStreamIndex (Proxy :: Proxy pos) c ub is)
where ub = upperBound t
{-# Inline iTblStream #-}
btITblStream
∷ forall b s mB mF pos posLeft ls arr x r u c i
. ( ITblCx mB pos ls arr x u c i
, posLeft ~ LeftPosTy pos (TwITblBt b s arr c u x mF mB r) i
, MkStream mB posLeft ls i
)
⇒ Proxy pos
→ Pair ls (TwITblBt b s arr c u x mF mB r)
→ Int#
→ LimitType i
→ i
→ Stream mB (Elm (ls :!: TwITblBt b s arr c u x mF mB r) i)
btITblStream pos (ls :!: TW (BtITbl c t) bt) grd us is
= mapM (\(s,tt,ii') -> bt ub tt >>= \ ~bb -> return $ ElmBtITbl (t!tt) bb ii' s)
. addIndexDense1 pos c ub us is
$ mkStream (Proxy ∷ Proxy posLeft) ls grd us (tableStreamIndex (Proxy :: Proxy pos) c ub is)
where ub = upperBound t
{-# Inline btITblStream #-}
instance
( Monad m
, ITblCx m pos ls arr x u c (i I)
, MkStream m (LeftPosTy pos (TwITbl b s m arr c u x) (i I)) ls (i I)
) => MkStream m pos (ls :!: TwITbl b s m arr c u x) (i I) where
mkStream = iTblStream
{-# Inline mkStream #-}
instance
( Monad mB
, ITblCx mB pos ls arr x u c (i I)
, MkStream mB (LeftPosTy pos (TwITblBt b s arr c u x mF mB r) (i I)) ls (i I)
)
⇒ MkStream mB pos (ls :!: TwITblBt b s arr c u x mF mB r) (i I) where
mkStream = btITblStream
{-# Inline mkStream #-}
instance
( Monad m
, ITblCx m pos ls arr x u c (i O)
, MkStream m (LeftPosTy pos (TwITbl b s m arr c u x) (i O)) ls (i O)
) => MkStream m pos (ls :!: TwITbl b s m arr c u x) (i O) where
mkStream = iTblStream
{-# Inline mkStream #-}
instance
( Monad mB
, ITblCx mB pos ls arr x u c (i O)
, MkStream mB (LeftPosTy pos (TwITblBt b s arr c u x mF mB r) (i O)) ls (i O)
)
⇒ MkStream mB pos (ls :!: TwITblBt b s arr c u x mF mB r) (i O) where
mkStream = btITblStream
{-# Inline mkStream #-}