27 lines
748 B
Haskell
27 lines
748 B
Haskell
module Message (
|
|
Connected
|
|
, receive
|
|
, send
|
|
) where
|
|
|
|
import Control.Monad.Reader (ReaderT, ask, lift)
|
|
import Network.WebSockets (Connection, receiveData, sendTextData)
|
|
import Data.Aeson (encode, eitherDecode')
|
|
import qualified Message.Client as Client (Message)
|
|
import qualified Message.Server as Server (Message(..))
|
|
|
|
type Connected a = ReaderT Connection IO a
|
|
|
|
send :: Server.Message -> Connected ()
|
|
send message = do
|
|
connection <- ask
|
|
lift $ sendTextData connection $ encode message
|
|
|
|
receive :: Connected Client.Message
|
|
receive = do
|
|
connection <- ask
|
|
received <- lift $ receiveData connection
|
|
case eitherDecode' received of
|
|
Left message -> send (Server.Error message) >> receive
|
|
Right message -> return message
|