module BioInf.RNAfold.Combinators
( (~~#)
, (#~~)
) where
import Data.Array.Repa.Index
import qualified Data.Vector.Fusion.Stream as S
import Data.List
import qualified ADP.Fusion as F
import qualified ADP.Fusion.Monadic as M
import qualified ADP.Fusion.Monadic.Internal as F
import ADP.Fusion.Monadic (makeLeft_MinRight)
import ADP.Fusion.Monadic.Internal (Box(..))
infixl 9 #~~, ~~#
(#~~) = makeLeft_MinRight (3,30) 1
(~~#) xs ys = Box mk step xs ys where
minT = 8
minC = 3
maxC = 32
mk (z:.k:.j,a,b) = let (_:.i) = z
cnsmd = ki
l = max k (jmaxC+cnsmd)
in return (z:.k:.l:.j,a,b)
step (z:.k:.l:.j,a,b)
| l<=j(max 0 $ minT cnsmd) && l+minC<=j
= return $ S.Yield (z:.k:.l:.j,a,b) (z:.k:.l+1:.j,a,b)
| otherwise = return $ S.Done
where cnsmd = ki
(_:.i) = z