module Network.NineP.File
( chanFile
, mVarFile
) where
import Control.Concurrent.Chan
import Control.Concurrent.MVar
import Data.ByteString.Lazy.Char8 (ByteString)
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Word
import Prelude hiding (read)
import Network.NineP.Error
import Network.NineP.Internal.File
simpleRead :: IO ByteString -> Word64 -> Word32 -> ErrorT NineError IO ByteString
simpleRead get offset count = case offset of
0 -> do
d <- lift $ get
return $ B.take (fromIntegral count) $ d
_ -> throwError $ OtherError "can't read at offset"
simpleWrite :: (ByteString -> IO ()) -> Word64 -> ByteString -> ErrorT NineError IO Word32
simpleWrite put offset d = case offset of
0 -> do
lift $ put d
return $ fromIntegral $ B.length d
_ -> throwError $ OtherError "can't write at offset"
chanFile :: String -> Maybe (Chan ByteString) -> Maybe (Chan ByteString) -> NineFile
chanFile name rc wc = (boringFile name) {
read = maybe (read $ boringFile "") (simpleRead . readChan) rc,
write = maybe (write $ boringFile "") (simpleWrite . writeChan) wc
}
mVarFile :: String -> Maybe (MVar ByteString) -> Maybe (MVar ByteString) -> NineFile
mVarFile name rc wc = (boringFile name) {
read = maybe (read $ boringFile "") (simpleRead . takeMVar) rc,
write = maybe (write $ boringFile "") (simpleWrite . putMVar) wc
}