>
>
>
>
>
>
>
>
>
> module Control.Quiver.Cell (
> toRows, fromRows,
> ) where
> import Data.Cell
> import Control.Quiver.SP
>
>
> toRows :: Monoid a => SP (Cell a) [a] f e
> toRows = loop0
> where
> loop0 = consume () (loop2 [] []) (deliver SPComplete)
> loop1 row cell = consume () (loop2 row cell) (spemit (assemble row cell))
> loop2 row cell (Cell part d) =
> case d of
> EOP -> loop1 row cell'
> EOC -> loop1 (mconcat (reverse cell') : row) []
> _ -> assemble row cell' >:> loop0
> where
> cell' = part:cell
> assemble row cell = reverse (mconcat (reverse cell) : row)
>
>
>
> fromRows :: SP [a] (Cell a) f e
> fromRows = loop0
> where
> loop0 = consume () loop1 (deliver SPComplete)
> loop1 (x:xs) = Cell x (if null xs then EOR else EOC) >:> loop1 xs
> loop1 [] = loop0