ADPfusion-0.5.2.2: ADP/Fusion/SynVar/Array.hs
module ADP.Fusion.SynVar.Array
( module ADP.Fusion.SynVar.Array.Type
, module ADP.Fusion.SynVar.Array
) where
import Data.Proxy
import Data.Strict.Tuple hiding (snd)
import Data.Vector.Fusion.Stream.Monadic
import Prelude hiding (map,mapM)
import Data.PrimitiveArray hiding (map)
import ADP.Fusion.Core.Classes
import ADP.Fusion.Core.Multi
import ADP.Fusion.SynVar.Array.Type
import ADP.Fusion.SynVar.Backtrack
import ADP.Fusion.SynVar.Indices.Classes
import ADP.Fusion.SynVar.TableWrap
-- | Constraints needed to use @iTblStream@.
type ITblCx m ls arr x u c i =
( TableStaticVar u c i
, MkStream m ls i
, Element ls i
, AddIndexDense (Elm (SynVar1 (Elm ls i)) (Z:.i)) (Z:.u) (Z:.c) (Z:.i)
, PrimArrayOps arr u x
)
-- | General function for @ITbl@s with skalar indices.
iTblStream
:: forall m ls arr x u c i . ITblCx m ls arr x u c i
=> Pair ls (TwITbl m arr c u x)
-> Context i
-> i
-> i
-> Stream m (Elm (ls :!: TwITbl m arr c u x) i)
iTblStream (ls :!: TW (ITbl _ _ c t) _) vs us is
= map (\(s,tt,ii') -> ElmITbl (t!tt) ii' s)
. addIndexDense1 c vs lb ub us is
$ mkStream ls (tableStaticVar (Proxy :: Proxy u) c vs is) us (tableStreamIndex (Proxy :: Proxy u) c vs is)
where (lb,ub) = bounds t
{-# Inline iTblStream #-}
-- | General function for @Backtrack ITbl@s with skalar indices.
btITblStream
:: forall mB mF ls arr x r u c i . ITblCx mB ls arr x u c i
=> Pair ls (TwITblBt arr c u x mF mB r)
-> Context i
-> i
-> i
-> Stream mB (Elm (ls :!: TwITblBt arr c u x mF mB r) i)
btITblStream (ls :!: TW (BtITbl c t) bt) vs us is
= mapM (\(s,tt,ii') -> bt ub tt >>= \ ~bb -> return $ ElmBtITbl (t!tt) bb ii' s)
. addIndexDense1 c vs lb ub us is
$ mkStream ls (tableStaticVar (Proxy :: Proxy u) c vs is) us (tableStreamIndex (Proxy :: Proxy u) c vs is)
where (lb,ub) = bounds t
{-# Inline btITblStream #-}
-- ** Instances
instance
( Monad m
, ITblCx m ls arr x u c (i I)
) => MkStream m (ls :!: TwITbl m arr c u x) (i I) where
mkStream = iTblStream
{-# Inline mkStream #-}
instance
( Monad m
, ITblCx m ls arr x u c (i O)
) => MkStream m (ls :!: TwITbl m arr c u x) (i O) where
mkStream = iTblStream
{-# Inline mkStream #-}
instance
( Monad m
, ITblCx m ls arr x u c (i C)
) => MkStream m (ls :!: TwITbl m arr c u x) (i C) where
mkStream = iTblStream
{-# Inline mkStream #-}
instance
( Monad mB
, ITblCx mB ls arr x u c (i I)
) => MkStream mB (ls :!: TwITblBt arr c u x mF mB r) (i I) where
mkStream = btITblStream
{-# Inline mkStream #-}
instance
( Monad mB
, ITblCx mB ls arr x u c (i O)
) => MkStream mB (ls :!: TwITblBt arr c u x mF mB r) (i O) where
mkStream = btITblStream
{-# Inline mkStream #-}
instance
( Monad mB
, ITblCx mB ls arr x u c (i C)
) => MkStream mB (ls :!: TwITblBt arr c u x mF mB r) (i C) where
mkStream = btITblStream
{-# Inline mkStream #-}
instance ModifyConstraint (TwITbl m arr EmptyOk i x) where
type TNE (TwITbl m arr EmptyOk i x) = TwITbl m arr NonEmpty i x
type TE (TwITbl m arr EmptyOk i x) = TwITbl m arr EmptyOk i x
toNonEmpty (TW (ITbl b l _ arr) f) = TW (ITbl b l NonEmpty arr) f
{-# Inline toNonEmpty #-}
instance ModifyConstraint (TwITblBt arr EmptyOk i x mF mB r) where
type TNE (TwITblBt arr EmptyOk i x mF mB r) = TwITblBt arr NonEmpty i x mF mB r
type TE (TwITblBt arr EmptyOk i x mF mB r) = TwITblBt arr EmptyOk i x mF mB r
toNonEmpty (TW (BtITbl _ arr) bt) = TW (BtITbl NonEmpty arr) bt
{-# Inline toNonEmpty #-}