module DP.Alignment.Global.Tapes2 where
import Data.Sequence (Seq,empty,(|>))
import Data.Vector.Fusion.Stream.Monadic (Stream,toList)
import qualified Data.FMList as F
import Data.FMList (FMList)
import ADP.Fusion
import Data.PrimitiveArray hiding (toList)
import FormalLanguage
[formalLanguage|
Grammar: Global
N: X
T: l
T: u
S: [X,X]
[X,X] -> done <<< [e,e]
[X,X] -> align <<< [X,X] [l,u]
[X,X] -> indel <<< [X,X] [,u]
[X,X] -> delin <<< [X,X] [l,]
//
Emit: Global
|]
makeAlgebraProduct ''SigGlobal
backtrack :: Monad m => u -> l -> SigGlobal m (FMList (l,u)) [FMList (l,u)] l u
backtrack ud ld = SigGlobal
{ done = \ _ -> F.empty
, align = \ x (Z:.l:.u) -> x `F.snoc` (l ,u )
, indel = \ x (Z:._:.u) -> x `F.snoc` (ld,u )
, delin = \ x (Z:.l:._) -> x `F.snoc` (l ,ud)
, h = toList
}
runBacktrack :: FMList (u,l) -> [(u,l)]
runBacktrack = F.toList