haskell - Using a monad inside the IO monad -
is there opposite of liftio? i'm using websockets, , want able listen messages server in separate thread. here's i'm doing:
import network.websockets import qualified data.text t import control.monad.io.class import control.monad import control.concurrent import control.applicative printmessages :: websockets hybi00 () printmessages = forever $ resp <- receivedatamessage liftio $ print resp run :: websockets hybi00 () run = liftio . forkio $ printmessages forever $ line <- liftio getline sendtextdata . t.pack $ line main = connect "0.0.0.0" 8080 "/" run so printmessages listens messages server , keeps printing them out. problem is, forkio expects function returns io (). there way me run printmessages in io monad?
if i'm understanding right, reason want receive messages in thread because main thread waiting user input send.
from @ the documentation, seems you'll have easier time if reverse roles of threads: receive in main thread, , send asynchronously other.
then can use getsink :: protocol p => websockets p (sink p) grab sink before forking, can use sendsink :: sink p -> message p -> io () lives in io, avoiding whole problem of mixing monads.
in other words, restructure code this:
sendmessages :: sink hybi00 -> io () sendmessages sink = forever $ line <- getline let msg = textdata . t.pack $ line sendsink sink msg run :: websockets hybi00 () run = sink <- getsink liftio . forkio $ sendmessages sink forever $ resp <- receivedatamessage liftio $ print resp main = connect "0.0.0.0" 8080 "/" run
Comments
Post a Comment