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