module Data.Offset (
Offset(..)
, unwrapOffset
) where
import Data.Monoid
import Data.Nullable
import Data.NullPoint
import Data.Word
import qualified Data.ListLike.FoldableLL as LL
import qualified Data.ListLike as LL
import System.Posix.Types (FileOffset)
data Offset a = Offset !FileOffset !a
instance Nullable a => Nullable (Offset a) where
nullC (Offset _ bs) = nullC bs
instance NullPoint a => NullPoint (Offset a) where
empty = Offset 0 empty
instance Monoid a => Monoid (Offset a) where
mempty = Offset 0 mempty
mappend (Offset o1 s1) (Offset _ s2) = Offset o1 (s1 `mappend` s2)
mconcat [] = mempty
mconcat [x] = x
mconcat ((Offset o x):xs) = Offset o (mconcat (x:(map unwrapOffset xs)))
instance LL.FoldableLL s el => LL.FoldableLL (Offset s) el where
foldl = foldlO
foldr = foldrO
foldlO :: LL.FoldableLL s el => (a -> el -> a) -> a -> Offset s -> a
foldlO f a (Offset _ xs) = LL.foldl f a xs
foldrO :: LL.FoldableLL s el => (el -> b -> b) -> b -> Offset s -> b
foldrO f b (Offset _ xs) = LL.foldr f b xs
instance LL.ListLike s Word8 => LL.ListLike (Offset s) Word8 where
singleton = Offset 0 . LL.singleton
head (Offset _ xs) = LL.head xs
tail (Offset o xs) = Offset (o+1) (LL.tail xs)
null (Offset _ xs) = LL.null xs
length (Offset _ xs) = LL.length xs
unwrapOffset :: Offset a -> a
unwrapOffset (Offset _ x) = x