packages feed

machines-io 0.0.0.1 → 0.1.0.0

raw patch · 2 files changed

+49/−21 lines, 2 filesdep +bytestringdep ~basedep ~chunked-datadep ~machinesPVP ok

version bump matches the API change (PVP)

Dependencies added: bytestring

Dependency ranges changed: base, chunked-data, machines, transformers

API changes (from Hackage documentation)

- System.IO.Machine: IODataMode :: (Handle -> IO a) -> (Handle -> a -> IO ()) -> IODataMode a
- System.IO.Machine: data IODataMode a
+ System.IO.Machine: byChar :: IODataMode Char
+ System.IO.Machine: byWord8 :: IODataMode Word8
+ System.IO.Machine: filteredIO :: (a -> IO Bool) -> ProcessT IO a a
+ System.IO.Machine: printer :: Show a => SinkIO m a
+ System.IO.Machine: sinkIO :: (a -> IO ()) -> SinkIO m a
+ System.IO.Machine: sourceIOWith :: m r -> (r -> m Bool) -> (r -> m a) -> SourceIO m a
+ System.IO.Machine: type DataModeIO m a = MonadIO m => (Handle -> m a, Handle -> a -> m ())
+ System.IO.Machine: type IODataMode a = (Handle -> IO a, Handle -> a -> IO ())
+ System.IO.Machine: type SourceIO m a = MonadIO m => forall k. MachineT m k a
- System.IO.Machine: byLine :: IOData a => IODataMode a
+ System.IO.Machine: byLine :: IOData a => DataModeIO m a
- System.IO.Machine: sinkHandle :: IOData a => IODataMode a -> Handle -> IOSink a
+ System.IO.Machine: sinkHandle :: IOData a => IODataMode a -> Handle -> SinkIO m a
- System.IO.Machine: sinkHandleWith :: IOData a => (Handle -> a -> IO ()) -> Handle -> IOSink a
+ System.IO.Machine: sinkHandleWith :: IOData a => (Handle -> a -> IO ()) -> Handle -> SinkIO m a
- System.IO.Machine: sourceHandle :: IODataMode a -> Handle -> IOSource a
+ System.IO.Machine: sourceHandle :: DataModeIO m a -> Handle -> SourceIO m a
- System.IO.Machine: sourceHandleWith :: (Handle -> IO a) -> Handle -> IOSource a
+ System.IO.Machine: sourceHandleWith :: (Handle -> m a) -> Handle -> SourceIO m a
- System.IO.Machine: sourceIO :: MonadIO m => m r -> (r -> m Bool) -> (r -> m a) -> forall k. MachineT m k a
+ System.IO.Machine: sourceIO :: IO a -> SourceIO m a

Files

machines-io.cabal view
@@ -1,5 +1,5 @@ name:                machines-io-version:             0.0.0.1+version:             0.1.0.0 synopsis:            IO utilities for the machines library homepage:            http://github.com/aloiscochard/machines-io license:             Apache-2.0@@ -17,7 +17,8 @@   exposed-modules:      System.IO.Machine   build-depends:       -    base >=4.7 && <4.8-    , chunked-data-    , machines-    , transformers+    base >=4.6 && < 5+    , bytestring          >= 0.10     && < 0.11+    , chunked-data        >= 0.1      && < 0.2+    , machines            >= 0.2      && < 0.3+    , transformers        >= 0.3      && < 0.5
src/System/IO/Machine.hs view
@@ -1,40 +1,67 @@-{-# LANGUAGE DoAndIfThenElse #-} {-# LANGUAGE Rank2Types #-}-{-# LANGUAGE KindSignatures #-} module System.IO.Machine where +import Control.Applicative ((<$>)) import Control.Monad (when) import Control.Monad.IO.Class (MonadIO, liftIO) import Data.IOData (IOData, hGetLine, hPutStrLn) import Data.Machine+import Data.Word (Word8) import System.IO (Handle, IOMode(ReadMode), hClose, hIsEOF, openBinaryFile) -data IODataMode a = IODataMode (Handle -> IO a) (Handle -> a -> IO ())+import qualified Data.ByteString as BS+import qualified Data.ByteString.Char8 as BSC8 +type DataModeIO m a = MonadIO m => ((Handle -> m a), (Handle -> a -> m ()))+type SinkIO m k = MonadIO m => forall a. ProcessT m k a+type SourceIO m a = MonadIO m => forall k. MachineT m k a++type IODataMode a = ((Handle -> IO a), (Handle -> a -> IO ())) type IOSink k = forall a. ProcessT IO k a type IOSource a = forall k. MachineT IO k a -byLine :: IOData a => IODataMode a-byLine = IODataMode hGetLine hPutStrLn+byChar :: IODataMode Char+byChar = (\h -> BSC8.head <$> BSC8.hGet h 1, \h w -> BSC8.hPut h $ BSC8.pack [w]) -sourceIO :: MonadIO m => m r -> (r -> m Bool) -> (r -> m a) -> forall k. MachineT m k a-sourceIO acquire release read = MachineT $ do+byWord8 :: IODataMode Word8+byWord8 = (\h -> BS.head <$> BS.hGet h 1, \h w -> BS.hPut h $ BS.pack [w])++byLine :: IOData a => DataModeIO m a+byLine = (hGetLine, hPutStrLn)++sourceIO :: IO a -> SourceIO m a+sourceIO f = repeatedly $ liftIO f >>= yield++sourceHandle :: DataModeIO m a -> Handle -> SourceIO m a+sourceHandle (r, _) = sourceHandleWith r++sourceIOWith :: m r -> (r -> m Bool) -> (r -> m a) -> SourceIO m a+sourceIOWith acquire release read = MachineT $ do   r         <- acquire   released  <- release r   if released then     return Stop   else do     x <- read r-    return . Yield x $ sourceIO acquire release read+    return . Yield x $ sourceIOWith acquire release read -sourceHandle :: IODataMode a -> Handle -> IOSource a-sourceHandle (IODataMode r _) = sourceHandleWith r+sourceHandleWith :: (Handle -> m a) -> Handle -> SourceIO m a+sourceHandleWith f h = sourceIOWith (return h) (liftIO . hIsEOF) f -sinkHandle :: IOData a => IODataMode a -> Handle -> IOSink a-sinkHandle (IODataMode _ w) h = repeatedly $ await >>= \x -> liftIO $ w h x+sinkIO :: (a -> IO ()) -> SinkIO m a+sinkIO f = repeatedly $ await >>= liftIO . f -sourceHandleWith :: (Handle -> IO a) -> Handle -> IOSource a-sourceHandleWith f h = sourceIO (return h) hIsEOF f+sinkHandle :: IOData a => IODataMode a -> Handle -> SinkIO m a+sinkHandle (_, w) h = repeatedly $ await >>= liftIO . w h -sinkHandleWith :: IOData a => (Handle -> a -> IO ()) -> Handle -> IOSink a-sinkHandleWith f h = repeatedly $ await >>= \x -> liftIO $ f h x+sinkHandleWith :: IOData a => (Handle -> a -> IO ()) -> Handle -> SinkIO m a+sinkHandleWith f h = repeatedly $ await >>= liftIO . f h++filteredIO :: (a -> IO Bool) -> ProcessT IO a a+filteredIO p = repeatedly $ do+  i <- await+  x <- liftIO $ p i+  if x then yield i else return ()++printer :: Show a => SinkIO m a+printer = sinkIO $ liftIO . print