4 | import Data.Vect as V
8 | import Control.Monad.State.Interface
9 | import Control.Monad.State.State
10 | import Control.Monad.Trans
14 | Overflow = List Bits8
17 | record BufConSt queuedElem where
18 | constructor MkBufConSt
20 | queuedToSend : queuedElem
23 | DBufferedConn : Type -> Type -> Type -> Type -> Type -> Type
24 | DBufferedConn r queuedElem a altOut altIn =
26 | (BufConSt queuedElem)
27 | (Cont (DIterator (List Bits8) (List Bits8) altOut altIn r))
31 | send : List Bits8 -> DBufferedConn r a Unit altOut altIn
33 | moreData <- lift (yieldGet bytes)
34 | modify {overflow $= (++ moreData)}
38 | result : r -> DBufferedConn r a b altOut altIn
41 | ite : DIterator (List Bits8) (List Bits8) altOut altIn r
43 | cont : Cont (DIterator (List Bits8) (List Bits8) altOut altIn r) b
44 | cont = ContOf $
\_ => ite
49 | sendAlt : b -> DBufferedConn r a rows rows b
51 | lift $
yieldGet2 str
54 | read : (n: Nat) -> DBufferedConn r a (V.Vect n Bits8) altOut altIn
58 | let oldOverflow = st.overflow
61 | modify {overflow := more}
62 | V.(::) fst <$> read next
64 | moreData <- lift (yieldGet [])
65 | modify {overflow := moreData}
69 | iteratorFromBufConn: BufConSt a -> DBufferedConn r a r altOut altIn -> DIterator (List Bits8) (List Bits8) altOut altIn r
70 | iteratorFromBufConn st bufCon =
71 | toIterator (evalStateT st bufCon)