franz-0.5.1: src/Database/Franz/Contents.hs
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE RecordWildCards #-}
module Database.Franz.Contents
( Contents
, Database.Franz.Internal.Contents.indexNames
, Item(..)
, toList
, toVector
, last
, length
, index
, lookupIndex
) where
import qualified Data.ByteString.Char8 as B
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import Database.Franz.Internal.Protocol
import Database.Franz.Internal.Contents
import Data.Int
import Prelude hiding (length, last)
data Item = Item
{ seqNo :: !Int
, indices :: !(U.Vector Int64)
, payload :: !B.ByteString
} deriving (Show, Eq)
toList :: Contents -> [Item]
toList contents = [unsafeIndex contents i | i <- [0..length contents - 1]]
toVector :: Contents -> V.Vector Item
toVector contents = V.generate (length contents) (unsafeIndex contents)
last :: Contents -> Maybe Item
last contents
| i >= 0 = Just $ unsafeIndex contents i
| otherwise = Nothing
where
i = length contents - 1
index :: Contents -> Int -> Maybe Item
index contents i
| i >= length contents || i < 0 = Nothing
| otherwise = Just $ unsafeIndex contents i
unsafeIndex :: Contents -> Int -> Item
unsafeIndex Contents{..} i = Item{..}
where
ofs0 = maybe payloadOffset fst $ indicess V.!? (i - 1)
(ofs1, indices) = indicess V.! i
seqNo = seqnoOffset + i + 1
payload = B.take (ofs1 - ofs0) $ B.drop (ofs0 - payloadOffset) payloads
lookupIndex :: Contents -> IndexName -> Maybe (Item -> Int64)
lookupIndex Contents{indexNames} name
= (\j Item{indices} -> indices U.! j) <$> V.elemIndex name indexNames