{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Network.Legion.Index (
Tag(..),
IndexRecord(..),
Indexable(..),
SearchTag(..),
) where
import Data.Aeson (ToJSON, toJSON, object, (.=))
import Data.Binary (Binary)
import Data.ByteString (ByteString)
import Data.Set (Set)
import Data.String (IsString)
import Data.Text.Encoding (decodeUtf8)
import GHC.Generics (Generic)
import Network.Legion.PartitionKey (PartitionKey, unKey)
class Indexable s where
indexEntries :: s -> Set Tag
newtype Tag = Tag {unTag :: ByteString}
deriving (Eq, Ord, Show, Binary, IsString)
data IndexRecord = IndexRecord {
irTag :: Tag,
irKey :: PartitionKey
}
deriving (Eq, Ord, Show, Generic)
instance Binary IndexRecord
instance ToJSON IndexRecord where
toJSON (IndexRecord tag key) = object [
(decodeUtf8 . unTag) tag .= toInteger (unKey key)
]
data SearchTag = SearchTag {
stTag :: Tag,
stKey :: Maybe PartitionKey
}
deriving (Show, Eq, Ord, Generic)
instance Binary SearchTag