module PeerChannelEncryptorMonad =
type PeerChannelEncryptorComputation<'T> =
| PeerChannelEncryptorComputation of
(PeerChannelEncryptor -> Result<'T * PeerChannelEncryptor, PeerError>)
let runP pcec initialState =
let (PeerChannelEncryptorComputation innerFn) = pcec
innerFn initialState
let returnP x =
let innerFn state =
Ok(x, state)
PeerChannelEncryptorComputation innerFn
let bindP
(f: 'a -> PeerChannelEncryptorComputation<'b>)
(xT: PeerChannelEncryptorComputation<'a>)
: PeerChannelEncryptorComputation<'b> =
let innerFn state =
runP xT state
>>= fun (res, state2) ->
let h = runP (f res) state2
h
PeerChannelEncryptorComputation innerFn