ADPfusion-0.4.0.0: ADP/Fusion/SynVar/Recursive.hs
module ADP.Fusion.SynVar.Recursive
( module ADP.Fusion.SynVar.Recursive.Type
, module ADP.Fusion.SynVar.Recursive.Point
, module ADP.Fusion.SynVar.Recursive.Subword
) where
import ADP.Fusion.SynVar.Recursive.Point
import ADP.Fusion.SynVar.Recursive.Subword
import ADP.Fusion.SynVar.Recursive.Type
{-
-- * Instances
{-
instance ModifyConstraint (IRec m Subword x) where
toNonEmpty (IRec _ iF iT f) = IRec NonEmpty iF iT f
toEmpty (IRec _ iF iT f) = IRec EmptyOk iF iT f
{-# INLINE toNonEmpty #-}
{-# INLINE toEmpty #-}
instance
( Monad m
, Element ls Subword
, MkStream m ls Subword
) => MkStream m (ls :!: IRec m Subword x) Subword where
mkStream (ls :!: IRec c _ _ f) Static lu (Subword (i:.j))
= let ms = minSize c in ms `seq`
S.mapM (\s -> let Subword (_:.l) = getIdx s
in f lu (subword l j) >>= \z -> return $ ElmIRec z (subword l j) s)
$ mkStream ls (Variable Check Nothing) lu (subword i $ j - ms)
mkStream (ls :!: IRec c _ _ f) (Variable _ Nothing) lu (Subword (i:.j))
= let ms = minSize c
mk s = let (Subword (_:.l)) = getIdx s in return (s:.j-l-ms)
step (s:.z)
| z>=0 = do let (Subword (_:.k)) = getIdx s
y <- f lu (subword k (j-z))
return $ S.Yield (ElmIRec y (subword k $ j-z) s) (s:.z-1)
| otherwise = return $ S.Done
{-# INLINE [1] mk #-}
{-# INLINE [1] step #-}
in ms `seq` S.flatten mk step Unknown $ mkStream ls (Variable NoCheck Nothing) lu (subword i j)
{-# INLINE mkStream #-}
instance
( Monad mB
, Element ls Subword
, MkStream mB ls Subword
) => MkStream mB (ls :!: BT (IRec mF Subword x) mF mB r) Subword where
mkStream (ls :!: BtIRec c _ _ f bt) Static lu (Subword (i:.j))
= let ms = minSize c in ms `seq`
S.mapM (\s -> let (Subword (_:.l)) = getIdx s
ix = subword l j
in f lu ix >>= \fx -> return $ ElmBtIRec fx (bt lu ix) ix s)
$ mkStream ls (Variable Check Nothing) lu (subword i $ j-ms)
mkStream (ls :!: BtIRec c _ _ f bt) (Variable _ Nothing) lu (Subword (i:.j))
= let ms = minSize c
mk s = let Subword (_:.l) = getIdx s in return (s:.j-l-ms)
step (s:.z)
| z>=0 = do let Subword (_:.k) = getIdx s
ix = subword k (j-z)
f lu ix >>= \fx -> return $ S.Yield (ElmBtIRec fx (bt lu ix) ix s) (s:.z-1)
| otherwise = return $ S.Done
{-# INLINE [1] mk #-}
{-# INLINE [1] step #-}
in ms `seq` S.flatten mk step Unknown $ mkStream ls (Variable NoCheck Nothing) lu (subword i j)
{-# INLINE mkStream #-}
-}
-}