-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | iteratees based upon mutable buffers -- -- Provides iteratees backed by mutable buffers. This enables iteratees -- to run without any extra memory allocations. @package mutable-iter @version 0.2 module Data.MutableIter.IOBuffer -- | A mutable buffer to hold storable elements. This data type supports -- memory recycling. data IOBuffer r el -- | Create a buffer from a length and data array. createIOBuffer :: (Storable el) => Int -> ForeignPtr Int -> ForeignPtr el -> IOBuffer r el -- | Check if the buffer is empty. null :: IOBuffer r el -> IO Bool -- | Empty buffer. empty :: (Storable el) => IOBuffer r el -- | Copy data from one buffer to another. copyBuffer :: (Storable el) => IOBuffer r el -> IO (IOBuffer r el) -- | Append two buffers. Copies data from both into a new buffer. append :: (Storable el) => IOBuffer r el -> IOBuffer r el -> IO (IOBuffer r el) -- | IOBuffer length. length :: IOBuffer r el -> IO Int -- | Retrieve the front element from the buffer and advance the internal -- pointer. It is an error to call this on an empty buffer. pop :: (Storable el) => IOBuffer r el -> IO el -- | Retrieve the first element, if it exists. This function does not -- advance the buffer pointer. lookAtHead :: (Storable el) => IOBuffer r el -> IO (Maybe el) -- | Drop n elements from the front of the buffer. if the buffer has fewer -- elements, all are dropped. drop :: Int -> IOBuffer r el -> IO () dropWhile :: (Storable el) => (el -> Bool) -> IOBuffer r el -> IO () -- | Create a new buffer from the first n elements, sharing data. This -- function advances the pointer of the original buffer. take :: (Storable el) => IOBuffer r el -> Int -> IO (IOBuffer r el) -- | Split one buffer to two, sharing storage. splitAt :: (Storable el) => IOBuffer r el -> Int -> IO (IOBuffer r el, IOBuffer r el) -- | copy data from one buffer to another with the specified map function. -- this operation drains the original buffer. mapBuffer :: (Storable el, Storable el') => (el -> el') -> ForeignPtr Int -> ForeignPtr el' -> IOBuffer r el -> IO (IOBuffer r el') mapAccumBuffer :: (Storable el, Storable el') => (acc -> el -> (acc, el')) -> ForeignPtr Int -> ForeignPtr el' -> acc -> IOBuffer r el -> IO (acc, IOBuffer r el') foldl' :: (Storable b) => (a -> b -> a) -> a -> IOBuffer r b -> IO a -- | Cast a buffer to a different type. Any extra data is truncated. This -- is not safe unless the buffer offset is 0. castBuffer :: (Storable el, Storable el') => IOBuffer r el -> IO (IOBuffer r el') -- | Safely convert an IOBuffer to a Vector. TODO: finish this -- implementation, look at Vector docs. freeze :: (Storable el) => IOBuffer r el -> IO (Vector el) -- | Write out the contents of the IOBuffer to a handle. This operation -- drains the buffer. hPut :: (Storable el) => Handle -> IOBuffer r el -> IO () unsafeToForeignPtr :: IOBuffer r el -> (Int, ForeignPtr Int, ForeignPtr el) instance (Storable el) => NullPoint (IOBuffer r el) module Data.MutableIter newtype MIteratee s m a MIteratee :: Iteratee s m a -> MIteratee s m a unwrap :: MIteratee s m a -> Iteratee s m a -- | A mutable buffer to hold storable elements. This data type supports -- memory recycling. data IOBuffer r el -- | Create a buffer from a length and data array. createIOBuffer :: (Storable el) => Int -> ForeignPtr Int -> ForeignPtr el -> IOBuffer r el type MEnumerator s m a = MIteratee s m a -> m (MIteratee s m a) type MEnumeratee sFrom sTo m a = MIteratee sTo m a -> MIteratee sFrom m (MIteratee sTo m a) joinIob :: (MonadCatchIO m, Storable el) => MIteratee (IOBuffer r el) m (MIteratee (IOBuffer r el') m a) -> MIteratee (IOBuffer r el) m a joinIM :: (Monad m) => m (MIteratee (IOBuffer r el) m a) -> MIteratee (IOBuffer r el) m a wrapEnum :: (Monad m) => Enumerator s m a -> MEnumerator s m a liftI :: (Monad m) => (Stream s -> MIteratee s m a) -> MIteratee s m a idone :: (Monad m) => a -> Stream s -> MIteratee s m a icont :: (Stream s -> MIteratee s m a) -> Maybe SomeException -> MIteratee s m a guardNull :: (MonadCatchIO m, Storable el) => IOBuffer r el -> MIteratee (IOBuffer r el) m a -> MIteratee (IOBuffer r el) m a -> MIteratee (IOBuffer r el) m a head :: (MonadCatchIO m, Storable el) => MIteratee (IOBuffer r el) m el heads :: (MonadCatchIO m, Storable el, Eq el) => [el] -> MIteratee (IOBuffer r el) m Int peek :: (MonadCatchIO m, Storable el) => MIteratee (IOBuffer r el) m (Maybe el) drop :: (MonadCatchIO m, Storable el) => Int -> MIteratee (IOBuffer r el) m () dropWhile :: (MonadCatchIO m, Storable el) => (el -> Bool) -> MIteratee (IOBuffer r el) m () foldl' :: (MonadCatchIO m, Storable el, Show a) => (a -> el -> a) -> a -> MIteratee (IOBuffer r el) m a mapStream :: (MonadCatchIO pr, Storable elo, Storable eli) => Int -> (eli -> elo) -> MEnumeratee (IOBuffer r eli) (IOBuffer r elo) pr a mapAccum :: (MonadCatchIO pr, Storable eli, Storable elo) => Int -> (b -> eli -> (b, elo)) -> b -> MEnumeratee (IOBuffer r eli) (IOBuffer r elo) pr a convStream :: (MonadCatchIO pr, Storable elo, Storable eli) => MIteratee (IOBuffer r eli) pr (IOBuffer r elo) -> MEnumeratee (IOBuffer r eli) (IOBuffer r elo) pr a takeUpTo :: (MonadCatchIO pr, Storable el) => Int -> MEnumeratee (IOBuffer r el) (IOBuffer r el) pr a enumHandleRandom :: (MonadCatchIO m, Storable el) => Int -> Handle -> MIteratee (IOBuffer r el) m a -> m (MIteratee (IOBuffer r el) m a) fileDriverRandom :: (MonadCatchIO m, Storable el) => Int -> (forall r. MIteratee (IOBuffer r el) m a) -> FilePath -> m a newFp :: (Storable a) => a -> IO (ForeignPtr a) instance (Monad m, Functor m) => Functor (MIteratee s m) instance (MonadCatchIO m, Storable el) => MonadCatchIO (MIteratee (IOBuffer r el) m) instance (MonadCatchIO m, Storable el) => MonadIO (MIteratee (IOBuffer r el) m) instance (Storable el) => MonadTrans (MIteratee (IOBuffer s el)) instance (MonadCatchIO m, Storable el) => Monad (MIteratee (IOBuffer r el) m) -- | Iteratees for parsing binary data. module Data.MutableIter.Binary -- | Indicate endian-ness. data Endian :: * -- | Most Significant Byte is first (big-endian) MSB :: Endian -- | Least Significan Byte is first (little-endian) LSB :: Endian endianRead2 :: (MonadCatchIO m) => Endian -> MIteratee (IOBuffer r Word8) m Word16 -- | read 3 bytes in an endian manner. If the first bit is set (negative), -- set the entire first byte so the Word32 can be properly set negative -- as well. endianRead3 :: (MonadCatchIO m) => Endian -> MIteratee (IOBuffer r Word8) m Word32 endianRead4 :: (MonadCatchIO m) => Endian -> MIteratee (IOBuffer r Word8) m Word32