+-- | Matches a message of type 'a'.
+message :: forall a m. (Typeable a, FromJSON a, MonadIO m) => SessionT m a
+message =
+ let parser = decode . encodeMsg :: FromServerMessage -> Maybe a
+ in named (T.pack $ show $ head $ snd $ splitTyConApp $ last $ typeRepArgs $ typeOf parser) $
+ castMsg <$> satisfy (isJust . parser)
+