--- | A version of encode that encodes FromServerMessages as if they
--- weren't wrapped.
-encodeMsg :: FromServerMessage -> B.ByteString
-encodeMsg = encode . genericToJSON (defaultOptions { sumEncoding = UntaggedValue })
+-- | Matches if the message is a notification.
+anyNotification :: Session FromServerMessage
+anyNotification = named "Any notification" $ satisfy $ \case
+ FromServerMess m _ -> case splitServerMethod m of
+ IsServerNot -> True
+ _ -> False
+ FromServerRsp _ _ -> False
+
+-- | Matches if the message is a request.
+anyRequest :: Session FromServerMessage
+anyRequest = named "Any request" $ satisfy $ \case
+ FromServerMess m _ -> case splitServerMethod m of
+ IsServerReq -> True
+ _ -> False
+ FromServerRsp _ _ -> False
+
+-- | Matches if the message is a response.
+anyResponse :: Session FromServerMessage
+anyResponse = named "Any response" $ satisfy $ \case
+ FromServerMess _ _ -> False
+ FromServerRsp _ _ -> True
+
+-- | Matches a response for a specific id.
+responseForId :: LspId (m :: Method FromClient Request) -> Session (ResponseMessage m)
+responseForId lid = named (T.pack $ "Response for id: " ++ show lid) $ do
+ satisfyMaybe $ \msg -> do
+ case msg of
+ FromServerMess _ _ -> Nothing
+ FromServerRsp m rsp -> undefined -- TODO