SNet-0.1.0: SNet.hs
{-# LANGUAGE DataKinds #-}
module SNet
( runSNet
, module SNet.Interfaces
, Variants (..)
, VariantMap (..)
, Pattern (..)
, RecEntry (..)
, CInt (..)
, syncro
, box
, (-->)
, (!!)
, parallel
, (*)
) where
import Prelude hiding ((!!), (*))
import Control.Concurrent
import Control.Exception
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Trans.State
import Data.Default
import Foreign.C.Types
import System.IO.Error
import SNet.Interfaces
import SNet.Combinators
import SNet.Network
import SNet.Pattern
import SNet.Record
import SNet.Stream
import SNet.Task
import SNet.Variants
globOut :: MonadIO m => MVar () -> m Stream
globOut stop = task_ (liftIO . print) (liftIO $ putMVar stop ())
globIn :: MVar () -> Stream -> IO ()
globIn stop output = do
forever $
handle eof $ do
rec <- readLn :: IO (Record Data)
writeStream output rec
where eof e = if isEOFError e
then takeMVar stop
else ioError e
runSNet :: SNet -> IO ()
runSNet net = do
stopMVar <- newEmptyMVar
input <- evalStateT (globOut stopMVar >>= net) def
globIn stopMVar input