I've been playing with the Control.Proxy.TCP library and would like to to create a Producer from a network source.
producer :: Proxy p => HostName -> ServiceName -> () -> Producer p BS.ByteString IO ()
producer h p () = runIdentityP $
lift $ connect h p $ \(s, r) ->
runProxy $ nsocketReadS s >-> pxy >-> socketWriteD s
where
pxy () = runIdentityP $ do
respond "resource-id" -- ask for "resource-id"
bs <- request 1024 -- fetch up to 1024 bytes
lift $ respond bs -- and produce them from the outer proxy
return ()
The code above does not type check:
Couldn't match type `p0 a'0 a1 a0 BS.ByteString m0' with `IO'
Expected type: ()
-> ProxyFast Int BS.ByteString () BS.ByteString IO ()
Actual type: ()
-> ProxyFast
Int
BS.ByteString
()
BS.ByteString
(p0 a'0 a1 a0 BS.ByteString m0)
()
In the second argument of `(>->)', namely `pxy'
In the first argument of `(>->)', namely `nsocketReadS s >-> pxy'
In the second argument of `($)', namely
`nsocketReadS s >-> pxy >-> socketWriteD s'
I see that the base monad for nsocketReadS and socketWriteD is IO while I need a different type. How can I correct this problem?