module Data.Repa.Flow.Auto.SizedIO
(
module Data.Repa.Flow.IO.Bucket
, sourceBytes
, sourceChars
, sourceLines
, sourceRecords
, sourceTSV
, sourceCSV
)
where
import Data.Repa.Flow.Auto
import Data.Repa.Flow.IO.Bucket
import Data.Repa.Array.Generic as A
import Data.Repa.Array.Material as A
import Data.Repa.Array.Meta.Delayed as A
import qualified Data.Repa.Flow.Generic as G
import qualified Data.Repa.Flow.Generic.IO as G
import Data.Word
import Data.Char
#include "repa-flow.h"
sourceBytes
:: Integer -> Array B Bucket -> IO (Sources Word8)
sourceBytes i bs
= G.map_i (A.convert A)
=<< G.sourceBytes i bs
sourceChars
:: Integer -> Array B Bucket -> IO (Sources Char)
sourceChars i bs
= G.map_i (A.convert A)
=<< G.sourceChars i bs
sourceLines
:: Integer
-> IO ()
-> Array B Bucket
-> IO (Sources (Array A Char))
sourceLines nChunk fails bs
= G.map_i ((A.convert A). chopChunk)
=<< G.sourceRecords nChunk isNewLine fails bs
where
isNewLine :: Word8 -> Bool
isNewLine x = x == nl
chopChunk chunk
= A.mapElems (A.computeS A . A.map (chr . fromIntegral))
$ A.trimEnds (== nl) chunk
nl :: Word8
!nl = fromIntegral $ ord '\n'
sourceRecords
:: Integer
-> (Word8 -> Bool)
-> IO ()
-> Array B Bucket
-> IO (Sources (Array A Word8))
sourceRecords i pSep aFail bs
= G.map_i (A.convert A)
=<< G.sourceRecords i pSep aFail bs
sourceCSV
:: Integer
-> IO ()
-> Array B Bucket
-> IO (Sources (Array A (Array A Char)))
sourceCSV i aFail bs
= G.map_i (A.convert A)
=<< G.sourceCSV i aFail bs
sourceTSV
:: Integer
-> IO ()
-> Array B Bucket
-> IO (Sources (Array A (Array A Char)))
sourceTSV i aFail bs
= G.map_i (A.convert A)
=<< G.sourceTSV i aFail bs