@@ -16,8 +16,8 @@ import Codec.CBOR.Decoding qualified as CBOR
1616import Codec.CBOR.Encoding qualified as CBOR
1717import Codec.CBOR.Read qualified as CBOR
1818import Control.Monad.Class.MonadST
19+ import Data.Bool (bool )
1920import Data.ByteString.Lazy (ByteString )
20- import Data.Functor ((<&>) )
2121import Data.List.NonEmpty qualified as NonEmpty
2222import Text.Printf
2323
@@ -78,13 +78,24 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
7878 SingBlocking -> True
7979 SingNonBlocking -> False )
8080
81- encode (MsgReply msgs hasMore) =
81+ encode (MsgReply msgs@ NonBlockingReply {} hasMore) =
8282 CBOR. encodeListLen 3
8383 <> CBOR. encodeWord 1
8484 <> CBOR. encodeListLenIndef
85- <> foldr (\ msg r -> encodeMsg msg <> r)
86- CBOR. encodeBreak
87- msgs
85+ <> foldMap encodeMsg msgs
86+ <> CBOR. encodeBreak
87+ <> CBOR. encodeBool hasMore'
88+ where
89+ hasMore' = case hasMore of
90+ HasMore -> True
91+ DoesNotHaveMore -> False
92+
93+ encode (MsgReply msgs@ BlockingReply {} hasMore) =
94+ CBOR. encodeListLen 3
95+ <> CBOR. encodeWord 2
96+ <> CBOR. encodeListLenIndef
97+ <> foldMap encodeMsg msgs
98+ <> CBOR. encodeBreak
8899 <> CBOR. encodeBool hasMore'
89100 where
90101 hasMore' = case hasMore of
@@ -93,7 +104,7 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
93104
94105 encode MsgClientDone =
95106 CBOR. encodeListLen 1
96- <> CBOR. encodeWord 2
107+ <> CBOR. encodeWord 3
97108
98109
99110 decode :: forall (st :: LocalMsgNotification msg ).
@@ -104,31 +115,31 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
104115 len <- CBOR. decodeListLen
105116 key <- CBOR. decodeWord
106117 case (stok, len, key) of
107- (SingIdle , 1 , 2 ) -> return (Annotator \ _ -> SomeMessage MsgClientDone )
108118
109119 (SingIdle , 2 , 0 ) -> do
110120 blocking <- CBOR. decodeBool
111121 return $! if blocking
112122 then Annotator \ _ -> SomeMessage (MsgRequest SingBlocking )
113123 else Annotator \ _ -> SomeMessage (MsgRequest SingNonBlocking )
114124
115- (SingBusy blocking, 3 , 1 ) -> do
125+ (SingBusy SingNonBlocking , 3 , 1 ) -> do
126+ CBOR. decodeListLenIndef
127+ msgs <- CBOR. decodeSequenceLenIndef
128+ (flip (:) ) [] reverse
129+ (Utils. decodeWithByteSpan decodeMsgWithBytes)
130+ more <- bool DoesNotHaveMore HasMore <$> CBOR. decodeBool
131+ return (Annotator \ bytes -> SomeMessage $ MsgReply (NonBlockingReply $ mkWithBytes bytes <$> msgs) more)
132+
133+ (SingBusy SingBlocking , 3 , 2 ) -> do
116134 CBOR. decodeListLenIndef
117135 msgs <- CBOR. decodeSequenceLenIndef
118136 (flip (:) ) [] reverse
119137 (Utils. decodeWithByteSpan decodeMsgWithBytes)
120- more <- CBOR. decodeBool <&> \ case
121- True -> HasMore
122- False -> DoesNotHaveMore
123- case (blocking, msgs) of
124- (SingBlocking , _: _) ->
125- return (Annotator \ bytes ->
126- SomeMessage $ MsgReply (BlockingReply (mkWithBytes bytes <$> NonEmpty. fromList msgs))
127- more)
128- (SingNonBlocking , _) ->
129- return (Annotator \ bytes -> SomeMessage $ MsgReply (NonBlockingReply $ mkWithBytes bytes <$> msgs) more)
130-
131- (SingBlocking , [] ) -> fail " codecLocalMsgNotification: MsgReply: empty list not permitted"
138+ more <- bool DoesNotHaveMore HasMore <$> CBOR. decodeBool
139+ return (Annotator \ bytes ->
140+ SomeMessage $ MsgReply (BlockingReply (mkWithBytes bytes <$> NonEmpty. fromList msgs)) more)
141+
142+ (SingIdle , 1 , 3 ) -> return (Annotator \ _ -> SomeMessage MsgClientDone )
132143
133144 (SingDone , _, _) -> notActiveState stok
134145
0 commit comments