------------------------------------------------------------------------------- |-- Module : Network.Stream-- Copyright : See LICENSE file-- License : BSD---- Maintainer : Ganesh Sittampalam <ganesh@earth.li>-- Stability : experimental-- Portability : non-portable (not tested)---- An library for creating abstract streams. Originally part of Gray's\/Bringert's-- HTTP module.---- * Changes by Robin Bate Boerop <robin@bateboerop.name>:-- - Removed unnecessary import statements.-- - Moved Debug code to StreamDebugger.hs-- - Moved Socket-related code to StreamSocket.hs.---- * Changes by Simon Foster:-- - Split Network.HTTPmodule up into to separate-- Network.[Stream,TCP,HTTP] modules-----------------------------------------------------------------------------moduleNetwork.Stream(Stream (..),ConnError (..),Result ,bindE ,fmapE ,failParse -- :: String -> Result a,failWith -- :: ConnError -> Result a,failMisc -- :: String -> Result a)whereimportControl.Monad.ErrordataConnError =ErrorReset |ErrorClosed |ErrorParse String|ErrorMisc Stringderiving(Show,Eq)instanceErrorConnError wherenoMsg =strMsg"unknown error"strMsg x =ErrorMisc x -- in GHC 7.0 the Monad instance for Error no longer-- uses fail x = Left (strMsg x). failMisc is therefore-- used instead.failMisc::String->Result a failMisc x =failWith (strMsgx )failParse::String->Result a failParse x =failWith (ErrorParse x )failWith::ConnError ->Result a failWith x =Leftx bindE::Result a ->(a ->Result b )->Result b bindE (Lefte )_=Lefte bindE(Rightv )f =f v fmapE::(a ->Result b )->IO(Result a )->IO(Result b )fmapE f a =dox <-a casex ofLefte ->return(Lefte )Rightr ->return(f r )-- | This is the type returned by many exported network functions.typeResult a =EitherConnError {- error -}a {- result -}-- | Streams should make layering of TLS protocol easier in future,-- they allow reading/writing to files etc for debugging,-- they allow use of protocols other than TCP/IP-- and they allow customisation.---- Instances of this class should not trim-- the input in any way, e.g. leave LF on line-- endings etc. Unless that is exactly the behaviour-- you want from your twisted instances ;)classStream x wherereadLine ::x ->IO(Result String)readBlock ::x ->Int->IO(Result String)writeBlock ::x ->String->IO(Result ())close ::x ->IO()closeOnEnd ::x ->Bool->IO()-- ^ True => shutdown the connection when response has been read / end-of-stream-- has been reached.