{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE LambdaCase          #-}
{-# LANGUAGE NamedFieldPuns      #-}
{-# LANGUAGE PolyKinds           #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies        #-}
{-# LANGUAGE TypeOperators       #-}

module Ouroboros.Network.Protocol.LocalTxMonitor.Codec
  ( codecLocalTxMonitor
  , codecLocalTxMonitorId
  ) where

import Control.Monad.Class.MonadST

import Network.TypedProtocol.Codec.CBOR
import Network.TypedProtocol.Core

import Data.ByteString.Lazy (ByteString)

import Codec.CBOR.Decoding qualified as CBOR
import Codec.CBOR.Encoding qualified as CBOR
import Codec.CBOR.Read qualified as CBOR
import Text.Printf

import Ouroboros.Network.Protocol.LocalTxMonitor.Type

codecLocalTxMonitor ::
     forall txid tx slot m ptcl.
     ( MonadST m
     , ptcl ~ LocalTxMonitor txid tx slot
     )
  => (txid -> CBOR.Encoding)
  -> (forall s. CBOR.Decoder s txid)
  -> (tx -> CBOR.Encoding)
  -> (forall s. CBOR.Decoder s tx)
  -> (slot -> CBOR.Encoding)
  -> (forall s. CBOR.Decoder s slot)
  -> Codec (LocalTxMonitor txid tx slot) CBOR.DeserialiseFailure m ByteString
codecLocalTxMonitor :: forall txid tx slot (m :: * -> *) ptcl.
(MonadST m, ptcl ~ LocalTxMonitor txid tx slot) =>
(txid -> Encoding)
-> (forall s. Decoder s txid)
-> (tx -> Encoding)
-> (forall s. Decoder s tx)
-> (slot -> Encoding)
-> (forall s. Decoder s slot)
-> Codec
     (LocalTxMonitor txid tx slot) DeserialiseFailure m ByteString
codecLocalTxMonitor txid -> Encoding
encodeTxId forall s. Decoder s txid
decodeTxId
                    tx -> Encoding
encodeTx   forall s. Decoder s tx
decodeTx
                    slot -> Encoding
encodeSlot forall s. Decoder s slot
decodeSlot =
    (forall (st :: LocalTxMonitor txid tx slot)
        (st' :: LocalTxMonitor txid tx slot).
 (StateTokenI st, ActiveState st) =>
 Message (LocalTxMonitor txid tx slot) st st' -> Encoding)
-> (forall (st :: LocalTxMonitor txid tx slot) s.
    ActiveState st =>
    StateToken st -> Decoder s (SomeMessage st))
-> Codec
     (LocalTxMonitor txid tx slot) DeserialiseFailure m ByteString
forall ps (m :: * -> *).
MonadST m =>
(forall (st :: ps) (st' :: ps).
 (StateTokenI st, ActiveState st) =>
 Message ps st st' -> Encoding)
-> (forall (st :: ps) s.
    ActiveState st =>
    StateToken st -> Decoder s (SomeMessage st))
-> Codec ps DeserialiseFailure m ByteString
mkCodecCborLazyBS Message ptcl st st' -> Encoding
Message (LocalTxMonitor txid tx slot) st st' -> Encoding
forall (st :: ptcl) (st' :: ptcl). Message ptcl st st' -> Encoding
forall (st :: LocalTxMonitor txid tx slot)
       (st' :: LocalTxMonitor txid tx slot).
(StateTokenI st, ActiveState st) =>
Message (LocalTxMonitor txid tx slot) st st' -> Encoding
encode StateToken st -> Decoder s (SomeMessage st)
StateToken st -> Decoder s (SomeMessage st)
forall s (st :: ptcl).
ActiveState st =>
StateToken st -> Decoder s (SomeMessage st)
forall (st :: LocalTxMonitor txid tx slot) s.
ActiveState st =>
StateToken st -> Decoder s (SomeMessage st)
decode
  where
    encode ::
         forall (st  :: ptcl) (st' :: ptcl).
         Message ptcl st st'
      -> CBOR.Encoding
    encode :: forall (st :: ptcl) (st' :: ptcl). Message ptcl st st' -> Encoding
encode = \case
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgDone ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
0
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgAcquire ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
1
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgAwaitAcquire ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
1
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgRelease ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
3
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgNextTx ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
5
      MsgHasTx txid1
txid ->
        Word -> Encoding
CBOR.encodeListLen Word
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
7 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> txid -> Encoding
encodeTxId txid
txid1
txid
      Message ptcl st st'
R:MessageLocalTxMonitorfromto (*) (*) (*) txid tx slot st st'
MsgGetSizes ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
9
      MsgAcquired slot1
slot ->
        Word -> Encoding
CBOR.encodeListLen Word
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> slot -> Encoding
encodeSlot slot
slot1
slot
      MsgReplyNextTx Maybe tx1
Nothing ->
        Word -> Encoding
CBOR.encodeListLen Word
1 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
6
      MsgReplyNextTx (Just tx1
tx) ->
        Word -> Encoding
CBOR.encodeListLen Word
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
6 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> tx -> Encoding
encodeTx tx
tx1
tx
      MsgReplyHasTx Bool
has ->
        Word -> Encoding
CBOR.encodeListLen Word
2 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
8 Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Bool -> Encoding
CBOR.encodeBool Bool
has
      MsgReplyGetSizes MempoolSizeAndCapacity
sz ->
           Word -> Encoding
CBOR.encodeListLen Word
2
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeWord Word
10
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word -> Encoding
CBOR.encodeListLen Word
3
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
CBOR.encodeWord32 (MempoolSizeAndCapacity -> Word32
capacityInBytes MempoolSizeAndCapacity
sz)
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
CBOR.encodeWord32 (MempoolSizeAndCapacity -> Word32
sizeInBytes MempoolSizeAndCapacity
sz)
        Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> Word32 -> Encoding
CBOR.encodeWord32 (MempoolSizeAndCapacity -> Word32
numberOfTxs MempoolSizeAndCapacity
sz)

    decode ::
         forall s (st :: ptcl).
         ActiveState st
      => StateToken st
      -> CBOR.Decoder s (SomeMessage st)
    decode :: forall s (st :: ptcl).
ActiveState st =>
StateToken st -> Decoder s (SomeMessage st)
decode StateToken st
stok = do
      len <- Decoder s Int
forall s. Decoder s Int
CBOR.decodeListLen
      key <- CBOR.decodeWord
      case (stok, len, key) of
        (SingLocalTxMonitor st
SingIdle, Int
1, Word
0) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st 'StDone -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st 'StDone
Message (LocalTxMonitor txid tx slot) 'StIdle 'StDone
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message (LocalTxMonitor txid tx slot) 'StIdle 'StDone
MsgDone)
        (SingLocalTxMonitor st
SingIdle, Int
1, Word
1) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st 'StAcquiring -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st 'StAcquiring
Message (LocalTxMonitor txid tx slot) 'StIdle 'StAcquiring
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message (LocalTxMonitor txid tx slot) 'StIdle 'StAcquiring
MsgAcquire)

        (SingLocalTxMonitor st
SingAcquired, Int
1, Word
1) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st 'StAcquiring -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st 'StAcquiring
Message (LocalTxMonitor txid tx slot) 'StAcquired 'StAcquiring
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message (LocalTxMonitor txid tx slot) 'StAcquired 'StAcquiring
MsgAwaitAcquire)
        (SingLocalTxMonitor st
SingAcquired, Int
1, Word
3) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st 'StIdle -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st 'StIdle
Message (LocalTxMonitor txid tx slot) 'StAcquired 'StIdle
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message (LocalTxMonitor txid tx slot) 'StAcquired 'StIdle
MsgRelease)
        (SingLocalTxMonitor st
SingAcquired, Int
1, Word
5) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st ('StBusy 'NextTx) -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st ('StBusy 'NextTx)
Message (LocalTxMonitor txid tx slot) 'StAcquired ('StBusy 'NextTx)
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message (LocalTxMonitor txid tx slot) 'StAcquired ('StBusy 'NextTx)
MsgNextTx)
        (SingLocalTxMonitor st
SingAcquired, Int
2, Word
7) -> do
          txid <- Decoder s txid
forall s. Decoder s txid
decodeTxId
          return (SomeMessage (MsgHasTx txid))
        (SingLocalTxMonitor st
SingAcquired, Int
1, Word
9) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st ('StBusy 'GetSizes) -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st ('StBusy 'GetSizes)
Message
  (LocalTxMonitor txid tx slot) 'StAcquired ('StBusy 'GetSizes)
forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2).
Message
  (LocalTxMonitor txid tx slot) 'StAcquired ('StBusy 'GetSizes)
MsgGetSizes)

        (SingLocalTxMonitor st
SingAcquiring, Int
2, Word
2) -> do
          slot <- Decoder s slot
forall s. Decoder s slot
decodeSlot
          return (SomeMessage (MsgAcquired slot))

        (SingBusy SingBusyKind k3
SingNextTx, Int
1, Word
6) ->
          SomeMessage st -> Decoder s (SomeMessage st)
forall a. a -> Decoder s a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message ptcl st 'StAcquired -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage (Maybe tx
-> Message
     (LocalTxMonitor txid tx slot) ('StBusy 'NextTx) 'StAcquired
forall {k} {k2} tx1 (txid :: k) (slot :: k2).
Maybe tx1
-> Message
     (LocalTxMonitor txid tx1 slot) ('StBusy 'NextTx) 'StAcquired
MsgReplyNextTx Maybe tx
forall a. Maybe a
Nothing))
        (SingBusy SingBusyKind k3
SingNextTx, Int
2, Word
6) -> do
          tx <- Decoder s tx
forall s. Decoder s tx
decodeTx
          return (SomeMessage (MsgReplyNextTx (Just tx)))

        (SingBusy SingBusyKind k3
SingHasTx, Int
2, Word
8) -> do
          has <- Decoder s Bool
forall s. Decoder s Bool
CBOR.decodeBool
          return (SomeMessage (MsgReplyHasTx has))

        (SingBusy SingBusyKind k3
SingGetSizes, Int
2, Word
10) -> do
          _len <- Decoder s Int
forall s. Decoder s Int
CBOR.decodeListLen
          capacityInBytes <- CBOR.decodeWord32
          sizeInBytes <- CBOR.decodeWord32
          numberOfTxs <- CBOR.decodeWord32
          let sizes = MempoolSizeAndCapacity { Word32
capacityInBytes :: Word32
capacityInBytes :: Word32
capacityInBytes, Word32
sizeInBytes :: Word32
sizeInBytes :: Word32
sizeInBytes, Word32
numberOfTxs :: Word32
numberOfTxs :: Word32
numberOfTxs }
          return (SomeMessage (MsgReplyGetSizes sizes))

        (SingLocalTxMonitor st
SingDone, Int
_, Word
_) -> StateToken 'StDone -> forall a. a
forall ps (st :: ps).
(StateAgency st ~ 'NobodyAgency, ActiveState st) =>
StateToken st -> forall a. a
notActiveState StateToken st
StateToken 'StDone
stok

        (SingLocalTxMonitor st
_, Int
_, Word
_) ->
          String -> Decoder s (SomeMessage st)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> String -> String -> Word -> Int -> String
forall r. PrintfType r => String -> r
printf String
"codecLocalTxMonitor (%s, %s) unexpected key (%d, %d)"
                       (ActiveAgency' st (StateAgency st) -> String
forall a. Show a => a -> String
show (ActiveAgency' st (StateAgency st)
ActiveAgency' st (StateAgency st)
forall {ps} (st :: ps) (agency :: Agency).
IsActiveState st agency =>
ActiveAgency' st agency
activeAgency :: ActiveAgency st)) (SingLocalTxMonitor st -> String
forall a. Show a => a -> String
show StateToken st
SingLocalTxMonitor st
stok) Word
key Int
len)

-- | An identity 'Codec' for the 'LocalTxMonitor' protocol. It does not do
-- any serialisation. It keeps the typed messages, wrapped in 'AnyMessage'.
--
codecLocalTxMonitorId ::
     forall txid tx slot m ptcl.
     ( Monad m
     , ptcl ~ LocalTxMonitor txid tx slot
     )
  => Codec ptcl CodecFailure m (AnyMessage ptcl)
codecLocalTxMonitorId :: forall {k} {k1} {k2} (txid :: k) (tx :: k1) (slot :: k2)
       (m :: * -> *) ptcl.
(Monad m, ptcl ~ LocalTxMonitor txid tx slot) =>
Codec ptcl CodecFailure m (AnyMessage ptcl)
codecLocalTxMonitorId =
    (forall (st :: ptcl) (st' :: ptcl).
 (StateTokenI st, ActiveState st) =>
 Message ptcl st st' -> AnyMessage ptcl)
-> (forall (st :: ptcl).
    ActiveState st =>
    StateToken st
    -> m (DecodeStep
            (AnyMessage ptcl) CodecFailure m (SomeMessage st)))
-> Codec ptcl CodecFailure m (AnyMessage ptcl)
forall ps failure (m :: * -> *) bytes.
(forall (st :: ps) (st' :: ps).
 (StateTokenI st, ActiveState st) =>
 Message ps st st' -> bytes)
-> (forall (st :: ps).
    ActiveState st =>
    StateToken st -> m (DecodeStep bytes failure m (SomeMessage st)))
-> Codec ps failure m bytes
Codec Message ptcl st st' -> AnyMessage ptcl
forall (st :: ptcl) (st' :: ptcl).
(StateTokenI st, ActiveState st) =>
Message ptcl st st' -> AnyMessage ptcl
encode StateToken st
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st :: ptcl).
ActiveState st =>
StateToken st
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
decode
  where
    encode ::
         forall st st'.
         StateTokenI st
      => ActiveState st
      => Message ptcl st st'
      -> AnyMessage ptcl
    encode :: forall (st :: ptcl) (st' :: ptcl).
(StateTokenI st, ActiveState st) =>
Message ptcl st st' -> AnyMessage ptcl
encode = Message ptcl st st' -> AnyMessage ptcl
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, ActiveState st) =>
Message ps st st' -> AnyMessage ps
AnyMessage

    decode ::
         forall (st :: ptcl).
         ActiveState st
      => StateToken st
      -> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
    decode :: forall (st :: ptcl).
ActiveState st =>
StateToken st
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
decode StateToken st
stok =
      let res :: (StateTokenI st, StateTokenI st')
              => Message ptcl st st' -> m (DecodeStep bytes failure m (SomeMessage st))
          res :: forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
msg = DecodeStep bytes failure m (SomeMessage st)
-> m (DecodeStep bytes failure m (SomeMessage st))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeMessage st
-> Maybe bytes -> DecodeStep bytes failure m (SomeMessage st)
forall bytes failure (m :: * -> *) a.
a -> Maybe bytes -> DecodeStep bytes failure m a
DecodeDone (Message ptcl st st' -> SomeMessage st
forall ps (st :: ps) (st' :: ps).
(StateTokenI st, StateTokenI st', ActiveState st) =>
Message ps st st' -> SomeMessage st
SomeMessage Message ptcl st st'
msg) Maybe bytes
forall a. Maybe a
Nothing)
      in DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
 -> m (DecodeStep
         (AnyMessage ptcl) CodecFailure m (SomeMessage st)))
-> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall a b. (a -> b) -> a -> b
$ (Maybe (AnyMessage ptcl)
 -> m (DecodeStep
         (AnyMessage ptcl) CodecFailure m (SomeMessage st)))
-> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
forall bytes failure (m :: * -> *) a.
(Maybe bytes -> m (DecodeStep bytes failure m a))
-> DecodeStep bytes failure m a
DecodePartial ((Maybe (AnyMessage ptcl)
  -> m (DecodeStep
          (AnyMessage ptcl) CodecFailure m (SomeMessage st)))
 -> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
-> (Maybe (AnyMessage ptcl)
    -> m (DecodeStep
            (AnyMessage ptcl) CodecFailure m (SomeMessage st)))
-> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
forall a b. (a -> b) -> a -> b
$ \Maybe (AnyMessage ptcl)
bytes -> case (StateToken st
SingLocalTxMonitor st
stok, Maybe (AnyMessage ptcl)
bytes) of
        (SingLocalTxMonitor st
SingIdle,     Just (AnyMessage msg :: Message ptcl st st'
msg@MsgAcquire{}))      -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingIdle,     Just (AnyMessage msg :: Message ptcl st st'
msg@MsgDone{}))         -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingAcquired, Just (AnyMessage msg :: Message ptcl st st'
msg@MsgAwaitAcquire{})) -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingAcquired, Just (AnyMessage msg :: Message ptcl st st'
msg@MsgNextTx{}))       -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingAcquired, Just (AnyMessage msg :: Message ptcl st st'
msg@MsgHasTx{}))        -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingAcquired, Just (AnyMessage msg :: Message ptcl st st'
msg@MsgRelease{}))      -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingLocalTxMonitor st
SingAcquiring,       Just (AnyMessage msg :: Message ptcl st st'
msg@MsgAcquired{}))    -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingBusy SingBusyKind k3
SingNextTx, Just (AnyMessage msg :: Message ptcl st st'
msg@MsgReplyNextTx{})) -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg
        (SingBusy SingBusyKind k3
SingHasTx,  Just (AnyMessage msg :: Message ptcl st st'
msg@MsgReplyHasTx{}))  -> Message ptcl st st'
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall (st' :: ptcl) bytes failure.
(StateTokenI st, StateTokenI st') =>
Message ptcl st st'
-> m (DecodeStep bytes failure m (SomeMessage st))
res Message ptcl st st'
Message ptcl st st'
msg

        (SingLocalTxMonitor st
SingDone, Maybe (AnyMessage ptcl)
_) -> StateToken 'StDone -> forall a. a
forall ps (st :: ps).
(StateAgency st ~ 'NobodyAgency, ActiveState st) =>
StateToken st -> forall a. a
notActiveState StateToken st
StateToken 'StDone
stok

        (SingLocalTxMonitor st
_, Maybe (AnyMessage ptcl)
Nothing) ->
          DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CodecFailure
-> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
forall bytes failure (m :: * -> *) a.
failure -> DecodeStep bytes failure m a
DecodeFail CodecFailure
CodecFailureOutOfInput)
        (SingLocalTxMonitor st
_, Maybe (AnyMessage ptcl)
_) ->
          DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
-> m (DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CodecFailure
-> DecodeStep (AnyMessage ptcl) CodecFailure m (SomeMessage st)
forall bytes failure (m :: * -> *) a.
failure -> DecodeStep bytes failure m a
DecodeFail (String -> CodecFailure
CodecFailure String
"codecLocalTxMonitorId: no matching message"))