module HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy
( snippet
, getRowListBetween
, getRowVectorBetween
, toListList
, toListVector
, toVectorVector
, selectListList
, mapSelectListList
) where
import Data.Function
import HaskellWorks.Data.Dsv.Lazy.Cursor.Internal
import HaskellWorks.Data.Dsv.Lazy.Cursor.Type
import HaskellWorks.Data.RankSelect.Base.Rank1
import Prelude
import qualified Data.ByteString.Lazy as LBS
import qualified Data.List as L
import qualified Data.Vector as DV
snippet :: DsvCursor -> LBS.ByteString
snippet :: DsvCursor -> ByteString
snippet DsvCursor
c = Int64 -> ByteString -> ByteString
LBS.take (Int64
len Int64 -> Int64 -> Int64
forall a. Ord a => a -> a -> a
`max` Int64
0) (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> ByteString -> ByteString
LBS.drop Int64
posC (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ DsvCursor -> ByteString
dsvCursorText DsvCursor
c
where d :: DsvCursor
d = DsvCursor -> DsvCursor
nextField DsvCursor
c
posC :: Int64
posC = Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64) -> Word64 -> Int64
forall a b. (a -> b) -> a -> b
$ DsvCursor -> Word64
dsvCursorPosition DsvCursor
c
posD :: Int64
posD = Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64) -> Word64 -> Int64
forall a b. (a -> b) -> a -> b
$ DsvCursor -> Word64
dsvCursorPosition DsvCursor
d
len :: Int64
len = Int64
posD Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
- Int64
posC
{-# INLINE snippet #-}
getRowVectorBetween :: DsvCursor -> DsvCursor -> Bool -> DV.Vector LBS.ByteString
getRowVectorBetween :: DsvCursor -> DsvCursor -> Bool -> Vector ByteString
getRowVectorBetween DsvCursor
c DsvCursor
d Bool
dEnd = Int
-> (DsvCursor -> Maybe (ByteString, DsvCursor))
-> DsvCursor
-> Vector ByteString
forall b a. Int -> (b -> Maybe (a, b)) -> b -> Vector a
DV.unfoldrN Int
fields DsvCursor -> Maybe (ByteString, DsvCursor)
go DsvCursor
c
where cr :: Word64
cr = [Vector Word64] -> Word64 -> Word64
forall v. Rank1 v => v -> Word64 -> Word64
rank1 (DsvCursor -> [Vector Word64]
dsvCursorMarkers DsvCursor
c) (DsvCursor -> Word64
dsvCursorPosition DsvCursor
c)
dr :: Word64
dr = [Vector Word64] -> Word64 -> Word64
forall v. Rank1 v => v -> Word64 -> Word64
rank1 (DsvCursor -> [Vector Word64]
dsvCursorMarkers DsvCursor
d) (DsvCursor -> Word64
dsvCursorPosition DsvCursor
d)
c2d :: Int
c2d = Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
dr Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word64
cr)
fields :: Int
fields = if Bool
dEnd then Int
c2d Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1 else Int
c2d
go :: DsvCursor -> Maybe (LBS.ByteString, DsvCursor)
go :: DsvCursor -> Maybe (ByteString, DsvCursor)
go DsvCursor
e = case DsvCursor -> DsvCursor
nextField DsvCursor
e of
DsvCursor
f -> case DsvCursor -> DsvCursor
nextPosition DsvCursor
f of
DsvCursor
g -> case DsvCursor -> ByteString
snippet DsvCursor
e of
ByteString
s -> (ByteString, DsvCursor) -> Maybe (ByteString, DsvCursor)
forall a. a -> Maybe a
Just (ByteString
s, DsvCursor
g)
{-# INLINE go #-}
{-# INLINE getRowVectorBetween #-}
getRowListBetween :: DsvCursor -> DsvCursor -> Bool -> [LBS.ByteString]
getRowListBetween :: DsvCursor -> DsvCursor -> Bool -> [ByteString]
getRowListBetween DsvCursor
c DsvCursor
d Bool
dEnd = Int -> [ByteString] -> [ByteString]
forall a. Int -> [a] -> [a]
take Int
fields ((DsvCursor -> Maybe (ByteString, DsvCursor))
-> DsvCursor -> [ByteString]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
L.unfoldr DsvCursor -> Maybe (ByteString, DsvCursor)
go DsvCursor
c)
where cr :: Word64
cr = [Vector Word64] -> Word64 -> Word64
forall v. Rank1 v => v -> Word64 -> Word64
rank1 (DsvCursor -> [Vector Word64]
dsvCursorMarkers DsvCursor
c) (DsvCursor -> Word64
dsvCursorPosition DsvCursor
c)
dr :: Word64
dr = [Vector Word64] -> Word64 -> Word64
forall v. Rank1 v => v -> Word64 -> Word64
rank1 (DsvCursor -> [Vector Word64]
dsvCursorMarkers DsvCursor
d) (DsvCursor -> Word64
dsvCursorPosition DsvCursor
d)
c2d :: Int
c2d = Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
dr Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word64
cr)
fields :: Int
fields = if Bool
dEnd then Int
c2d Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1 else Int
c2d
go :: DsvCursor -> Maybe (LBS.ByteString, DsvCursor)
go :: DsvCursor -> Maybe (ByteString, DsvCursor)
go DsvCursor
e = case DsvCursor -> DsvCursor
nextField DsvCursor
e of
DsvCursor
f -> case DsvCursor -> DsvCursor
nextPosition DsvCursor
f of
DsvCursor
g -> case DsvCursor -> ByteString
snippet DsvCursor
e of
ByteString
s -> (ByteString, DsvCursor) -> Maybe (ByteString, DsvCursor)
forall a. a -> Maybe a
Just (ByteString
s, DsvCursor
g)
{-# INLINE go #-}
{-# INLINE getRowListBetween #-}
toListList :: DsvCursor -> [[LBS.ByteString]]
toListList :: DsvCursor -> [[ByteString]]
toListList DsvCursor
c = if DsvCursor -> Word64
dsvCursorPosition DsvCursor
d Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> DsvCursor -> Word64
dsvCursorPosition DsvCursor
c Bool -> Bool -> Bool
&& Bool -> Bool
not (DsvCursor -> Bool
atEnd DsvCursor
c)
then DsvCursor -> DsvCursor -> Bool -> [ByteString]
getRowListBetween DsvCursor
c DsvCursor
d Bool
dEnd[ByteString] -> [[ByteString]] -> [[ByteString]]
forall a. a -> [a] -> [a]
:DsvCursor -> [[ByteString]]
toListList (DsvCursor -> DsvCursor
trim DsvCursor
d)
else []
where nr :: DsvCursor
nr = DsvCursor -> DsvCursor
nextRow DsvCursor
c
d :: DsvCursor
d = DsvCursor -> DsvCursor
nextPosition DsvCursor
nr
dEnd :: Bool
dEnd = DsvCursor -> Bool
atEnd DsvCursor
nr
{-# INLINE toListList #-}
toListVector :: DsvCursor -> [DV.Vector LBS.ByteString]
toListVector :: DsvCursor -> [Vector ByteString]
toListVector DsvCursor
c = if DsvCursor -> Word64
dsvCursorPosition DsvCursor
d Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> DsvCursor -> Word64
dsvCursorPosition DsvCursor
c Bool -> Bool -> Bool
&& Bool -> Bool
not (DsvCursor -> Bool
atEnd DsvCursor
c)
then DsvCursor -> DsvCursor -> Bool -> Vector ByteString
getRowVectorBetween DsvCursor
c DsvCursor
d Bool
dEndVector ByteString -> [Vector ByteString] -> [Vector ByteString]
forall a. a -> [a] -> [a]
:DsvCursor -> [Vector ByteString]
toListVector (DsvCursor -> DsvCursor
trim DsvCursor
d)
else []
where nr :: DsvCursor
nr = DsvCursor -> DsvCursor
nextRow DsvCursor
c
d :: DsvCursor
d = DsvCursor -> DsvCursor
nextPosition DsvCursor
nr
dEnd :: Bool
dEnd = DsvCursor -> Bool
atEnd DsvCursor
nr
{-# INLINE toListVector #-}
toVectorVector :: DsvCursor -> DV.Vector (DV.Vector LBS.ByteString)
toVectorVector :: DsvCursor -> Vector (Vector ByteString)
toVectorVector = [Vector ByteString] -> Vector (Vector ByteString)
forall a. [a] -> Vector a
DV.fromList ([Vector ByteString] -> Vector (Vector ByteString))
-> (DsvCursor -> [Vector ByteString])
-> DsvCursor
-> Vector (Vector ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DsvCursor -> [Vector ByteString]
toListVector
{-# INLINE toVectorVector #-}
selectRowFrom :: [Int] -> DsvCursor -> [LBS.ByteString]
selectRowFrom :: [Int] -> DsvCursor -> [ByteString]
selectRowFrom [Int]
sel DsvCursor
c = Int -> ByteString
go (Int -> ByteString) -> [Int] -> [ByteString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Int]
sel
where go :: Int -> LBS.ByteString
go :: Int -> ByteString
go Int
n = DsvCursor -> ByteString
snippet DsvCursor
nc
where nc :: DsvCursor
nc = DsvCursor -> DsvCursor
nextPosition (Word64 -> DsvCursor -> DsvCursor
advanceField (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) DsvCursor
c)
{-# INLINE go #-}
{-# INLINE selectRowFrom #-}
mapSelectRowFrom :: [(Int, LBS.ByteString -> LBS.ByteString)] -> DsvCursor -> [LBS.ByteString]
mapSelectRowFrom :: [(Int, ByteString -> ByteString)] -> DsvCursor -> [ByteString]
mapSelectRowFrom [(Int, ByteString -> ByteString)]
sel DsvCursor
c = (Int -> (ByteString -> ByteString) -> ByteString)
-> (Int, ByteString -> ByteString) -> ByteString
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> (ByteString -> ByteString) -> ByteString
go ((Int, ByteString -> ByteString) -> ByteString)
-> [(Int, ByteString -> ByteString)] -> [ByteString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(Int, ByteString -> ByteString)]
sel
where go :: Int -> (LBS.ByteString -> LBS.ByteString) -> LBS.ByteString
go :: Int -> (ByteString -> ByteString) -> ByteString
go Int
n ByteString -> ByteString
f = ByteString -> ByteString
f (DsvCursor -> ByteString
snippet DsvCursor
nc)
where nc :: DsvCursor
nc = DsvCursor -> DsvCursor
nextPosition (Word64 -> DsvCursor -> DsvCursor
advanceField (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) DsvCursor
c)
{-# INLINE go #-}
{-# INLINE mapSelectRowFrom #-}
selectListList :: [Int] -> DsvCursor -> [[LBS.ByteString]]
selectListList :: [Int] -> DsvCursor -> [[ByteString]]
selectListList [Int]
sel DsvCursor
c = if DsvCursor -> Word64
dsvCursorPosition DsvCursor
d Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> DsvCursor -> Word64
dsvCursorPosition DsvCursor
c Bool -> Bool -> Bool
&& Bool -> Bool
not (DsvCursor -> Bool
atEnd DsvCursor
c)
then [Int] -> DsvCursor -> [ByteString]
selectRowFrom [Int]
sel DsvCursor
c[ByteString] -> [[ByteString]] -> [[ByteString]]
forall a. a -> [a] -> [a]
:[Int] -> DsvCursor -> [[ByteString]]
selectListList [Int]
sel (DsvCursor -> DsvCursor
trim DsvCursor
d)
else []
where nr :: DsvCursor
nr = DsvCursor -> DsvCursor
nextRow DsvCursor
c
d :: DsvCursor
d = DsvCursor -> DsvCursor
nextPosition DsvCursor
nr
{-# INLINE selectListList #-}
mapSelectListList :: [(Int, LBS.ByteString -> LBS.ByteString)] -> DsvCursor -> [[LBS.ByteString]]
mapSelectListList :: [(Int, ByteString -> ByteString)] -> DsvCursor -> [[ByteString]]
mapSelectListList [(Int, ByteString -> ByteString)]
sel DsvCursor
c = if DsvCursor -> Word64
dsvCursorPosition DsvCursor
d Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> DsvCursor -> Word64
dsvCursorPosition DsvCursor
c Bool -> Bool -> Bool
&& Bool -> Bool
not (DsvCursor -> Bool
atEnd DsvCursor
c)
then [(Int, ByteString -> ByteString)] -> DsvCursor -> [ByteString]
mapSelectRowFrom [(Int, ByteString -> ByteString)]
sel DsvCursor
c[ByteString] -> [[ByteString]] -> [[ByteString]]
forall a. a -> [a] -> [a]
:[(Int, ByteString -> ByteString)] -> DsvCursor -> [[ByteString]]
mapSelectListList [(Int, ByteString -> ByteString)]
sel (DsvCursor -> DsvCursor
trim DsvCursor
d)
else []
where nr :: DsvCursor
nr = DsvCursor -> DsvCursor
nextRow DsvCursor
c
d :: DsvCursor
d = DsvCursor -> DsvCursor
nextPosition DsvCursor
nr
{-# INLINE mapSelectListList #-}