module Database.Redis.Types (
RedisT,
Value(..),Score, SortedSet,
Request(..), Reply(..),
) where
import Control.Applicative
import Data.Binary
import qualified Data.ByteString as S
import qualified Data.HashMap.Strict as HMS
import qualified Data.HashSet as HS
import Data.Int
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import Database.Curry
type RedisT m = DBMT Value m
data Value
= VString !S.ByteString
| VList !(Seq.Seq S.ByteString)
| VSet !(HS.HashSet S.ByteString)
| VHash !(HMS.HashMap S.ByteString S.ByteString)
| VSortedSet !SortedSet
type Score = Int32
type SortedSet = (Set.Set (Score, S.ByteString), HMS.HashMap S.ByteString Score)
data Request
= Request [S.ByteString]
deriving (Show)
data Reply
= StatusReply !S.ByteString
| ErrorReply !S.ByteString
| IntReply !Int
| BulkReply !(Maybe S.ByteString)
| MultiBulkReply !(Maybe [Maybe S.ByteString])
deriving (Show)
instance Binary Value where
put (VString bs) = put (0 :: Word8) >> put bs
put (VList ls) = put (1 :: Word8) >> put ls
put (VSet ss) = put (2 :: Word8) >> put (HS.toList ss)
put (VHash ha) = put (3 :: Word8) >> put ha
put (VSortedSet ss) = put (4 :: Word8) >> put ss
get = get >>= \tag -> case (tag :: Word8) of
0 -> VString <$> get
1 -> VList <$> get
2 -> VSet . HS.fromList <$> get
3 -> VHash <$> get
4 -> VSortedSet <$> get
_ -> fail "data corrupted"