module Socketio where
import Fudget
import FudgetIO
import FRequest
import Srequest
--import Message(Message(..))
import NullF
import Sockets
import Utils(loop)
--import Xtypes
import DialogueIO hiding (IOError)

transmitterF' :: Socket -> F [Char] ()
transmitterF' Socket
s =
  (F [Char] () -> F [Char] ()) -> F [Char] ()
forall t. (t -> t) -> t
loop ((F [Char] () -> F [Char] ()) -> F [Char] ())
-> (F [Char] () -> F [Char] ()) -> F [Char] ()
forall a b. (a -> b) -> a -> b
$ \F [Char] ()
l -> Cont (F [Char] ()) [Char]
forall a ho. Cont (F a ho) a
getF Cont (F [Char] ()) [Char] -> Cont (F [Char] ()) [Char]
forall a b. (a -> b) -> a -> b
$ \[Char]
str ->
  if [Char] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Char]
str
  then () -> F [Char] () -> F [Char] ()
forall (f :: * -> * -> *) ho hi.
FudgetIO f =>
ho -> f hi ho -> f hi ho
putHigh () F [Char] ()
forall hi ho. F hi ho
nullF
  else SocketRequest -> F [Char] () -> F [Char] ()
forall (f :: * -> * -> *) b ho.
FudgetIO f =>
SocketRequest -> f b ho -> f b ho
sIOsucc (Socket -> [Char] -> SocketRequest
WriteSocket Socket
s [Char]
str) F [Char] ()
l

receiverF' :: Socket -> F hi [Char]
receiverF' Socket
s =
    [Descriptor] -> F hi [Char] -> F hi [Char]
forall (f :: * -> * -> *) hi ho.
FudgetIO f =>
[Descriptor] -> f hi ho -> f hi ho
select [Socket -> Descriptor
SocketDe Socket
s] (F hi [Char] -> F hi [Char]) -> F hi [Char] -> F hi [Char]
forall a b. (a -> b) -> a -> b
$
    (F hi [Char] -> F hi [Char]) -> F hi [Char]
forall t. (t -> t) -> t
loop ((F hi [Char] -> F hi [Char]) -> F hi [Char])
-> (F hi [Char] -> F hi [Char]) -> F hi [Char]
forall a b. (a -> b) -> a -> b
$ \F hi [Char]
l ->
          Cont (F hi [Char]) (KEvent hi)
forall a b. Cont (F a b) (KEvent a)
getMessageFu Cont (F hi [Char]) (KEvent hi) -> Cont (F hi [Char]) (KEvent hi)
forall a b. (a -> b) -> a -> b
$ \KEvent hi
e ->
           case KEvent hi
e of
             Low (DResp (AsyncInput (Descriptor
_, SocketRead [Char]
str))) ->
	       if [Char] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Char]
str
	       then F hi [Char]
forall hi. F hi [Char]
closeDown
	       else [Char] -> F hi [Char] -> F hi [Char]
forall ho hi. ho -> F hi ho -> F hi ho
putF [Char]
str F hi [Char]
l
             High hi
_ -> F hi [Char]
forall hi. F hi [Char]
closeDown
  where
    closeDown :: F hi [Char]
closeDown =
      [Descriptor] -> F hi [Char] -> F hi [Char]
forall (f :: * -> * -> *) hi ho.
FudgetIO f =>
[Descriptor] -> f hi ho -> f hi ho
select [] (F hi [Char] -> F hi [Char]) -> F hi [Char] -> F hi [Char]
forall a b. (a -> b) -> a -> b
$
      [Char] -> F hi [Char] -> F hi [Char]
forall (f :: * -> * -> *) ho hi.
FudgetIO f =>
ho -> f hi ho -> f hi ho
putHigh [Char]
"" (F hi [Char] -> F hi [Char]) -> F hi [Char] -> F hi [Char]
forall a b. (a -> b) -> a -> b
$
      SocketRequest -> F hi [Char] -> F hi [Char]
forall (f :: * -> * -> *) b ho.
FudgetIO f =>
SocketRequest -> f b ho -> f b ho
sIOsucc (Socket -> SocketRequest
CloseSocket Socket
s) (F hi [Char] -> F hi [Char]) -> F hi [Char] -> F hi [Char]
forall a b. (a -> b) -> a -> b
$
      F hi [Char]
forall hi ho. F hi ho
nullF