module Potoki.Fetch
where
import Potoki.Prelude
import Potoki.Core.Fetch
import qualified Data.Attoparsec.Types as I
import qualified Data.Attoparsec.ByteString as K
import qualified Data.Attoparsec.Text as L
import qualified Data.HashMap.Strict as B
import qualified Data.Vector as C
import qualified Data.ByteString as D
import qualified Data.Text as A
import qualified Data.Text.IO as A
handleBytes :: Handle -> Int -> Fetch (Either IOException ByteString)
handleBytes handle chunkSize =
Fetch $ \ nil just -> do
chunk <- try (D.hGetSome handle chunkSize)
case chunk of
Right "" -> return nil
_ -> return (just chunk)
handleText :: Handle -> Fetch (Either IOException Text)
handleText handle =
Fetch $ \ nil just -> do
chunk <- try (A.hGetChunk handle)
case chunk of
Right "" -> return nil
_ -> return (just chunk)
mapFilter :: (input -> Maybe output) -> Fetch input -> Fetch output
mapFilter mapping (Fetch fetchIO) =
Fetch $ \ nil just ->
fix $ \ loop ->
join $ fetchIO (return nil) $ \ input ->
case mapping input of
Just output -> return (just output)
Nothing -> loop
just :: Fetch (Maybe element) -> Fetch element
just (Fetch fetchIO) =
Fetch $ \ nil just ->
fix $ \ loop ->
join $ fetchIO (return nil) $ \ case
Just output -> return (just output)
Nothing -> loop
takeWhile :: (element -> Bool) -> Fetch element -> Fetch element
takeWhile predicate (Fetch fetchIO) =
Fetch $ \ nil just ->
fetchIO nil $ \ input ->
if predicate input
then just input
else nil
infiniteMVar :: MVar element -> Fetch element
infiniteMVar var =
Fetch $ \ nil just ->
fmap just (takeMVar var)
finiteMVar :: MVar (Maybe element) -> Fetch element
finiteMVar var =
Fetch $ \ nil just ->
fmap (maybe nil just) (takeMVar var)