-- Generated by GenCmds.hs. DO NOT EDIT.

{-# LANGUAGE OverloadedStrings #-}

module Database.Redis.Commands (

-- ** Connection
auth, -- |Authenticate to the server (<http://redis.io/commands/auth>).
echo, -- |Echo the given string (<http://redis.io/commands/echo>).
ping, -- |Ping the server (<http://redis.io/commands/ping>).
quit, -- |Close the connection (<http://redis.io/commands/quit>).
select, -- |Change the selected database for the current connection (<http://redis.io/commands/select>).

-- ** Keys
del, -- |Delete a key (<http://redis.io/commands/del>).
exists, -- |Determine if a key exists (<http://redis.io/commands/exists>).
expire, -- |Set a key's time to live in seconds (<http://redis.io/commands/expire>).
expireat, -- |Set the expiration for a key as a UNIX timestamp (<http://redis.io/commands/expireat>).
keys, -- |Find all keys matching the given pattern (<http://redis.io/commands/keys>).
move, -- |Move a key to another database (<http://redis.io/commands/move>).
objectRefcount, -- |Inspect the internals of Redis objects (<http://redis.io/commands/object>). The Redis command @OBJECT@ is split up into 'objectRefcount', 'objectEncoding', 'objectIdletime'.
objectEncoding, -- |Inspect the internals of Redis objects (<http://redis.io/commands/object>). The Redis command @OBJECT@ is split up into 'objectRefcount', 'objectEncoding', 'objectIdletime'.
objectIdletime, -- |Inspect the internals of Redis objects (<http://redis.io/commands/object>). The Redis command @OBJECT@ is split up into 'objectRefcount', 'objectEncoding', 'objectIdletime'.
persist, -- |Remove the expiration from a key (<http://redis.io/commands/persist>).
randomkey, -- |Return a random key from the keyspace (<http://redis.io/commands/randomkey>).
rename, -- |Rename a key (<http://redis.io/commands/rename>).
renamenx, -- |Rename a key, only if the new key does not exist (<http://redis.io/commands/renamenx>).
SortOpts(..),
defaultSortOpts,
SortOrder(..),
sort, -- |Sort the elements in a list, set or sorted set (<http://redis.io/commands/sort>). The Redis command @SORT@ is split up into 'sort', 'sortStore'.
sortStore, -- |Sort the elements in a list, set or sorted set (<http://redis.io/commands/sort>). The Redis command @SORT@ is split up into 'sort', 'sortStore'.
ttl, -- |Get the time to live for a key (<http://redis.io/commands/ttl>).
getType, -- |Determine the type stored at key (<http://redis.io/commands/type>).

-- ** Hashes
hdel, -- |Delete one or more hash fields (<http://redis.io/commands/hdel>).
hexists, -- |Determine if a hash field exists (<http://redis.io/commands/hexists>).
hget, -- |Get the value of a hash field (<http://redis.io/commands/hget>).
hgetall, -- |Get all the fields and values in a hash (<http://redis.io/commands/hgetall>).
hincrby, -- |Increment the integer value of a hash field by the given number (<http://redis.io/commands/hincrby>).
hkeys, -- |Get all the fields in a hash (<http://redis.io/commands/hkeys>).
hlen, -- |Get the number of fields in a hash (<http://redis.io/commands/hlen>).
hmget, -- |Get the values of all the given hash fields (<http://redis.io/commands/hmget>).
hmset, -- |Set multiple hash fields to multiple values (<http://redis.io/commands/hmset>).
hset, -- |Set the string value of a hash field (<http://redis.io/commands/hset>).
hsetnx, -- |Set the value of a hash field, only if the field does not exist (<http://redis.io/commands/hsetnx>).
hvals, -- |Get all the values in a hash (<http://redis.io/commands/hvals>).

-- ** Lists
blpop, -- |Remove and get the first element in a list, or block until one is available (<http://redis.io/commands/blpop>).
brpop, -- |Remove and get the last element in a list, or block until one is available (<http://redis.io/commands/brpop>).
brpoplpush, -- |Pop a value from a list, push it to another list and return it; or block until one is available (<http://redis.io/commands/brpoplpush>).
lindex, -- |Get an element from a list by its index (<http://redis.io/commands/lindex>).
linsertBefore, -- |Insert an element before or after another element in a list (<http://redis.io/commands/linsert>). The Redis command @LINSERT@ is split up into 'linsertBefore', 'linsertAfter'.
linsertAfter, -- |Insert an element before or after another element in a list (<http://redis.io/commands/linsert>). The Redis command @LINSERT@ is split up into 'linsertBefore', 'linsertAfter'.
llen, -- |Get the length of a list (<http://redis.io/commands/llen>).
lpop, -- |Remove and get the first element in a list (<http://redis.io/commands/lpop>).
lpush, -- |Prepend one or multiple values to a list (<http://redis.io/commands/lpush>).
lpushx, -- |Prepend a value to a list, only if the list exists (<http://redis.io/commands/lpushx>).
lrange, -- |Get a range of elements from a list (<http://redis.io/commands/lrange>).
lrem, -- |Remove elements from a list (<http://redis.io/commands/lrem>).
lset, -- |Set the value of an element in a list by its index (<http://redis.io/commands/lset>).
ltrim, -- |Trim a list to the specified range (<http://redis.io/commands/ltrim>).
rpop, -- |Remove and get the last element in a list (<http://redis.io/commands/rpop>).
rpoplpush, -- |Remove the last element in a list, append it to another list and return it (<http://redis.io/commands/rpoplpush>).
rpush, -- |Append one or multiple values to a list (<http://redis.io/commands/rpush>).
rpushx, -- |Append a value to a list, only if the list exists (<http://redis.io/commands/rpushx>).

-- ** Server
bgrewriteaof, -- |Asynchronously rewrite the append-only file (<http://redis.io/commands/bgrewriteaof>).
bgsave, -- |Asynchronously save the dataset to disk (<http://redis.io/commands/bgsave>).
configGet, -- |Get the value of a configuration parameter (<http://redis.io/commands/config-get>).
configResetstat, -- |Reset the stats returned by INFO (<http://redis.io/commands/config-resetstat>).
configSet, -- |Set a configuration parameter to the given value (<http://redis.io/commands/config-set>).
dbsize, -- |Return the number of keys in the selected database (<http://redis.io/commands/dbsize>).
debugObject, -- |Get debugging information about a key (<http://redis.io/commands/debug-object>).
debugSegfault, -- |Make the server crash (<http://redis.io/commands/debug-segfault>).
flushall, -- |Remove all keys from all databases (<http://redis.io/commands/flushall>).
flushdb, -- |Remove all keys from the current database (<http://redis.io/commands/flushdb>).
info, -- |Get information and statistics about the server (<http://redis.io/commands/info>).
lastsave, -- |Get the UNIX time stamp of the last successful save to disk (<http://redis.io/commands/lastsave>).
save, -- |Synchronously save the dataset to disk (<http://redis.io/commands/save>).
shutdown, -- |Synchronously save the dataset to disk and then shut down the server (<http://redis.io/commands/shutdown>).
slaveof, -- |Make the server a slave of another instance, or promote it as master (<http://redis.io/commands/slaveof>).
slowlogGet, -- |Manages the Redis slow queries log (<http://redis.io/commands/slowlog>). The Redis command @SLOWLOG@ is split up into 'slowlogGet', 'slowlogLen', 'slowlogReset'.
slowlogLen, -- |Manages the Redis slow queries log (<http://redis.io/commands/slowlog>). The Redis command @SLOWLOG@ is split up into 'slowlogGet', 'slowlogLen', 'slowlogReset'.
slowlogReset, -- |Manages the Redis slow queries log (<http://redis.io/commands/slowlog>). The Redis command @SLOWLOG@ is split up into 'slowlogGet', 'slowlogLen', 'slowlogReset'.

-- ** Sets
sadd, -- |Add one or more members to a set (<http://redis.io/commands/sadd>).
scard, -- |Get the number of members in a set (<http://redis.io/commands/scard>).
sdiff, -- |Subtract multiple sets (<http://redis.io/commands/sdiff>).
sdiffstore, -- |Subtract multiple sets and store the resulting set in a key (<http://redis.io/commands/sdiffstore>).
sinter, -- |Intersect multiple sets (<http://redis.io/commands/sinter>).
sinterstore, -- |Intersect multiple sets and store the resulting set in a key (<http://redis.io/commands/sinterstore>).
sismember, -- |Determine if a given value is a member of a set (<http://redis.io/commands/sismember>).
smembers, -- |Get all the members in a set (<http://redis.io/commands/smembers>).
smove, -- |Move a member from one set to another (<http://redis.io/commands/smove>).
spop, -- |Remove and return a random member from a set (<http://redis.io/commands/spop>).
srandmember, -- |Get a random member from a set (<http://redis.io/commands/srandmember>).
srem, -- |Remove one or more members from a set (<http://redis.io/commands/srem>).
sunion, -- |Add multiple sets (<http://redis.io/commands/sunion>).
sunionstore, -- |Add multiple sets and store the resulting set in a key (<http://redis.io/commands/sunionstore>).

-- ** Sorted Sets
zadd, -- |Add one or more members to a sorted set, or update its score if it already exists (<http://redis.io/commands/zadd>).
zcard, -- |Get the number of members in a sorted set (<http://redis.io/commands/zcard>).
zcount, -- |Count the members in a sorted set with scores within the given values (<http://redis.io/commands/zcount>).
zincrby, -- |Increment the score of a member in a sorted set (<http://redis.io/commands/zincrby>).
Aggregate(..),
zinterstore, -- |Intersect multiple sorted sets and store the resulting sorted set in a new key (<http://redis.io/commands/zinterstore>). The Redis command @ZINTERSTORE@ is split up into 'zinterstore', 'zinterstoreWeights'.
zinterstoreWeights, -- |Intersect multiple sorted sets and store the resulting sorted set in a new key (<http://redis.io/commands/zinterstore>). The Redis command @ZINTERSTORE@ is split up into 'zinterstore', 'zinterstoreWeights'.
zrange, -- |Return a range of members in a sorted set, by index (<http://redis.io/commands/zrange>). The Redis command @ZRANGE@ is split up into 'zrange', 'zrangeWithscores'.
zrangeWithscores, -- |Return a range of members in a sorted set, by index (<http://redis.io/commands/zrange>). The Redis command @ZRANGE@ is split up into 'zrange', 'zrangeWithscores'.
zrangebyscore, -- |Return a range of members in a sorted set, by score (<http://redis.io/commands/zrangebyscore>). The Redis command @ZRANGEBYSCORE@ is split up into 'zrangebyscore', 'zrangebyscoreWithscores', 'zrangebyscoreLimit', 'zrangebyscoreWithscoresLimit'.
zrangebyscoreWithscores, -- |Return a range of members in a sorted set, by score (<http://redis.io/commands/zrangebyscore>). The Redis command @ZRANGEBYSCORE@ is split up into 'zrangebyscore', 'zrangebyscoreWithscores', 'zrangebyscoreLimit', 'zrangebyscoreWithscoresLimit'.
zrangebyscoreLimit, -- |Return a range of members in a sorted set, by score (<http://redis.io/commands/zrangebyscore>). The Redis command @ZRANGEBYSCORE@ is split up into 'zrangebyscore', 'zrangebyscoreWithscores', 'zrangebyscoreLimit', 'zrangebyscoreWithscoresLimit'.
zrangebyscoreWithscoresLimit, -- |Return a range of members in a sorted set, by score (<http://redis.io/commands/zrangebyscore>). The Redis command @ZRANGEBYSCORE@ is split up into 'zrangebyscore', 'zrangebyscoreWithscores', 'zrangebyscoreLimit', 'zrangebyscoreWithscoresLimit'.
zrank, -- |Determine the index of a member in a sorted set (<http://redis.io/commands/zrank>).
zrem, -- |Remove one or more members from a sorted set (<http://redis.io/commands/zrem>).
zremrangebyrank, -- |Remove all members in a sorted set within the given indexes (<http://redis.io/commands/zremrangebyrank>).
zremrangebyscore, -- |Remove all members in a sorted set within the given scores (<http://redis.io/commands/zremrangebyscore>).
zrevrange, -- |Return a range of members in a sorted set, by index, with scores ordered from high to low (<http://redis.io/commands/zrevrange>). The Redis command @ZREVRANGE@ is split up into 'zrevrange', 'zrevrangeWithscores'.
zrevrangeWithscores, -- |Return a range of members in a sorted set, by index, with scores ordered from high to low (<http://redis.io/commands/zrevrange>). The Redis command @ZREVRANGE@ is split up into 'zrevrange', 'zrevrangeWithscores'.
zrevrangebyscore, -- |Return a range of members in a sorted set, by score, with scores ordered from high to low (<http://redis.io/commands/zrevrangebyscore>). The Redis command @ZREVRANGEBYSCORE@ is split up into 'zrevrangebyscore', 'zrevrangebyscoreWithscores', 'zrevrangebyscoreLimit', 'zrevrangebyscoreWithscoresLimit'.
zrevrangebyscoreWithscores, -- |Return a range of members in a sorted set, by score, with scores ordered from high to low (<http://redis.io/commands/zrevrangebyscore>). The Redis command @ZREVRANGEBYSCORE@ is split up into 'zrevrangebyscore', 'zrevrangebyscoreWithscores', 'zrevrangebyscoreLimit', 'zrevrangebyscoreWithscoresLimit'.
zrevrangebyscoreLimit, -- |Return a range of members in a sorted set, by score, with scores ordered from high to low (<http://redis.io/commands/zrevrangebyscore>). The Redis command @ZREVRANGEBYSCORE@ is split up into 'zrevrangebyscore', 'zrevrangebyscoreWithscores', 'zrevrangebyscoreLimit', 'zrevrangebyscoreWithscoresLimit'.
zrevrangebyscoreWithscoresLimit, -- |Return a range of members in a sorted set, by score, with scores ordered from high to low (<http://redis.io/commands/zrevrangebyscore>). The Redis command @ZREVRANGEBYSCORE@ is split up into 'zrevrangebyscore', 'zrevrangebyscoreWithscores', 'zrevrangebyscoreLimit', 'zrevrangebyscoreWithscoresLimit'.
zrevrank, -- |Determine the index of a member in a sorted set, with scores ordered from high to low (<http://redis.io/commands/zrevrank>).
zscore, -- |Get the score associated with the given member in a sorted set (<http://redis.io/commands/zscore>).
zunionstore, -- |Add multiple sorted sets and store the resulting sorted set in a new key (<http://redis.io/commands/zunionstore>). The Redis command @ZUNIONSTORE@ is split up into 'zunionstore', 'zunionstoreWeights'.
zunionstoreWeights, -- |Add multiple sorted sets and store the resulting sorted set in a new key (<http://redis.io/commands/zunionstore>). The Redis command @ZUNIONSTORE@ is split up into 'zunionstore', 'zunionstoreWeights'.

-- ** Strings
append, -- |Append a value to a key (<http://redis.io/commands/append>).
decr, -- |Decrement the integer value of a key by one (<http://redis.io/commands/decr>).
decrby, -- |Decrement the integer value of a key by the given number (<http://redis.io/commands/decrby>).
get, -- |Get the value of a key (<http://redis.io/commands/get>).
getbit, -- |Returns the bit value at offset in the string value stored at key (<http://redis.io/commands/getbit>).
getrange, -- |Get a substring of the string stored at a key (<http://redis.io/commands/getrange>).
getset, -- |Set the string value of a key and return its old value (<http://redis.io/commands/getset>).
incr, -- |Increment the integer value of a key by one (<http://redis.io/commands/incr>).
incrby, -- |Increment the integer value of a key by the given number (<http://redis.io/commands/incrby>).
mget, -- |Get the values of all the given keys (<http://redis.io/commands/mget>).
mset, -- |Set multiple keys to multiple values (<http://redis.io/commands/mset>).
msetnx, -- |Set multiple keys to multiple values, only if none of the keys exist (<http://redis.io/commands/msetnx>).
set, -- |Set the string value of a key (<http://redis.io/commands/set>).
setbit, -- |Sets or clears the bit at offset in the string value stored at key (<http://redis.io/commands/setbit>).
setex, -- |Set the value and expiration of a key (<http://redis.io/commands/setex>).
setnx, -- |Set the value of a key, only if the key does not exist (<http://redis.io/commands/setnx>).
setrange, -- |Overwrite part of a string at key starting at the specified offset (<http://redis.io/commands/setrange>).
strlen, -- |Get the length of the value stored in a key (<http://redis.io/commands/strlen>).

-- ** Transactions
discard, -- |Discard all commands issued after MULTI (<http://redis.io/commands/discard>).
exec, -- |Execute all commands issued after MULTI (<http://redis.io/commands/exec>).
multi, -- |Mark the start of a transaction block (<http://redis.io/commands/multi>).
unwatch, -- |Forget about all watched keys (<http://redis.io/commands/unwatch>).
watch, -- |Watch the given keys to determine execution of the MULTI\/EXEC block (<http://redis.io/commands/watch>).

-- * Unimplemented Commands
-- |These commands are not implemented, as of now. Library
--  users can implement these or other commands from
--  experimental Redis versions by using the 'sendRequest'
--  function.
--
-- * EVAL (<http://redis.io/commands/eval>)
--
--
-- * MONITOR (<http://redis.io/commands/monitor>)
--
--
-- * SYNC (<http://redis.io/commands/sync>)
--
) where

import Prelude hiding (min,max)
import Data.ByteString (ByteString)
import Database.Redis.ManualCommands
import Database.Redis.Types
import Database.Redis.Core
import Database.Redis.Reply

flushall
    :: Redis (Either Reply Status)
flushall  = sendRequest (["FLUSHALL"] )

hdel
    :: ByteString -- ^ key
    -> [ByteString] -- ^ field
    -> Redis (Either Reply Bool)
hdel key field = sendRequest (["HDEL"] ++ [encode key] ++ map encode field )

hincrby
    :: ByteString -- ^ key
    -> ByteString -- ^ field
    -> Integer -- ^ increment
    -> Redis (Either Reply Integer)
hincrby key field increment = sendRequest (["HINCRBY"] ++ [encode key] ++ [encode field] ++ [encode increment] )

configResetstat
    :: Redis (Either Reply Status)
configResetstat  = sendRequest (["CONFIG","RESETSTAT"] )

del
    :: [ByteString] -- ^ key
    -> Redis (Either Reply Integer)
del key = sendRequest (["DEL"] ++ map encode key )

zrevrank
    :: ByteString -- ^ key
    -> ByteString -- ^ member
    -> Redis (Either Reply (Maybe Integer))
zrevrank key member = sendRequest (["ZREVRANK"] ++ [encode key] ++ [encode member] )

brpoplpush
    :: ByteString -- ^ source
    -> ByteString -- ^ destination
    -> Integer -- ^ timeout
    -> Redis (Either Reply (Maybe ByteString))
brpoplpush source destination timeout = sendRequest (["BRPOPLPUSH"] ++ [encode source] ++ [encode destination] ++ [encode timeout] )

incrby
    :: ByteString -- ^ key
    -> Integer -- ^ increment
    -> Redis (Either Reply Integer)
incrby key increment = sendRequest (["INCRBY"] ++ [encode key] ++ [encode increment] )

rpop
    :: ByteString -- ^ key
    -> Redis (Either Reply (Maybe ByteString))
rpop key = sendRequest (["RPOP"] ++ [encode key] )

setrange
    :: ByteString -- ^ key
    -> Integer -- ^ offset
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
setrange key offset value = sendRequest (["SETRANGE"] ++ [encode key] ++ [encode offset] ++ [encode value] )

setbit
    :: ByteString -- ^ key
    -> Integer -- ^ offset
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
setbit key offset value = sendRequest (["SETBIT"] ++ [encode key] ++ [encode offset] ++ [encode value] )

save
    :: Redis (Either Reply Status)
save  = sendRequest (["SAVE"] )

echo
    :: ByteString -- ^ message
    -> Redis (Either Reply ByteString)
echo message = sendRequest (["ECHO"] ++ [encode message] )

blpop
    :: [ByteString] -- ^ key
    -> Integer -- ^ timeout
    -> Redis (Either Reply (Maybe (ByteString,ByteString)))
blpop key timeout = sendRequest (["BLPOP"] ++ map encode key ++ [encode timeout] )

sdiffstore
    :: ByteString -- ^ destination
    -> [ByteString] -- ^ key
    -> Redis (Either Reply Integer)
sdiffstore destination key = sendRequest (["SDIFFSTORE"] ++ [encode destination] ++ map encode key )

move
    :: ByteString -- ^ key
    -> Integer -- ^ db
    -> Redis (Either Reply Bool)
move key db = sendRequest (["MOVE"] ++ [encode key] ++ [encode db] )

multi
    :: Redis (Either Reply Status)
multi  = sendRequest (["MULTI"] )

getrange
    :: ByteString -- ^ key
    -> Integer -- ^ start
    -> Integer -- ^ end
    -> Redis (Either Reply ByteString)
getrange key start end = sendRequest (["GETRANGE"] ++ [encode key] ++ [encode start] ++ [encode end] )

srem
    :: ByteString -- ^ key
    -> [ByteString] -- ^ member
    -> Redis (Either Reply Integer)
srem key member = sendRequest (["SREM"] ++ [encode key] ++ map encode member )

watch
    :: [ByteString] -- ^ key
    -> Redis (Either Reply Status)
watch key = sendRequest (["WATCH"] ++ map encode key )

getbit
    :: ByteString -- ^ key
    -> Integer -- ^ offset
    -> Redis (Either Reply Integer)
getbit key offset = sendRequest (["GETBIT"] ++ [encode key] ++ [encode offset] )

zcount
    :: ByteString -- ^ key
    -> Double -- ^ min
    -> Double -- ^ max
    -> Redis (Either Reply Integer)
zcount key min max = sendRequest (["ZCOUNT"] ++ [encode key] ++ [encode min] ++ [encode max] )

quit
    :: Redis (Either Reply Status)
quit  = sendRequest (["QUIT"] )

msetnx
    :: [(ByteString,ByteString)] -- ^ keyValue
    -> Redis (Either Reply Bool)
msetnx keyValue = sendRequest (["MSETNX"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )

sismember
    :: ByteString -- ^ key
    -> ByteString -- ^ member
    -> Redis (Either Reply Bool)
sismember key member = sendRequest (["SISMEMBER"] ++ [encode key] ++ [encode member] )

bgrewriteaof
    :: Redis (Either Reply Status)
bgrewriteaof  = sendRequest (["BGREWRITEAOF"] )

hmset
    :: ByteString -- ^ key
    -> [(ByteString,ByteString)] -- ^ fieldValue
    -> Redis (Either Reply Status)
hmset key fieldValue = sendRequest (["HMSET"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])fieldValue )

scard
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
scard key = sendRequest (["SCARD"] ++ [encode key] )

zincrby
    :: ByteString -- ^ key
    -> Integer -- ^ increment
    -> ByteString -- ^ member
    -> Redis (Either Reply Double)
zincrby key increment member = sendRequest (["ZINCRBY"] ++ [encode key] ++ [encode increment] ++ [encode member] )

sinter
    :: [ByteString] -- ^ key
    -> Redis (Either Reply [ByteString])
sinter key = sendRequest (["SINTER"] ++ map encode key )

mset
    :: [(ByteString,ByteString)] -- ^ keyValue
    -> Redis (Either Reply Status)
mset keyValue = sendRequest (["MSET"] ++ concatMap (\(x,y) -> [encode x,encode y])keyValue )

rpoplpush
    :: ByteString -- ^ source
    -> ByteString -- ^ destination
    -> Redis (Either Reply (Maybe ByteString))
rpoplpush source destination = sendRequest (["RPOPLPUSH"] ++ [encode source] ++ [encode destination] )

hlen
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
hlen key = sendRequest (["HLEN"] ++ [encode key] )

setex
    :: ByteString -- ^ key
    -> Integer -- ^ seconds
    -> ByteString -- ^ value
    -> Redis (Either Reply Status)
setex key seconds value = sendRequest (["SETEX"] ++ [encode key] ++ [encode seconds] ++ [encode value] )

sunionstore
    :: ByteString -- ^ destination
    -> [ByteString] -- ^ key
    -> Redis (Either Reply Integer)
sunionstore destination key = sendRequest (["SUNIONSTORE"] ++ [encode destination] ++ map encode key )

brpop
    :: [ByteString] -- ^ key
    -> Integer -- ^ timeout
    -> Redis (Either Reply (Maybe (ByteString,ByteString)))
brpop key timeout = sendRequest (["BRPOP"] ++ map encode key ++ [encode timeout] )

hgetall
    :: ByteString -- ^ key
    -> Redis (Either Reply [(ByteString,ByteString)])
hgetall key = sendRequest (["HGETALL"] ++ [encode key] )

dbsize
    :: Redis (Either Reply Integer)
dbsize  = sendRequest (["DBSIZE"] )

lpop
    :: ByteString -- ^ key
    -> Redis (Either Reply (Maybe ByteString))
lpop key = sendRequest (["LPOP"] ++ [encode key] )

hmget
    :: ByteString -- ^ key
    -> [ByteString] -- ^ field
    -> Redis (Either Reply [Maybe ByteString])
hmget key field = sendRequest (["HMGET"] ++ [encode key] ++ map encode field )

lrange
    :: ByteString -- ^ key
    -> Integer -- ^ start
    -> Integer -- ^ stop
    -> Redis (Either Reply [ByteString])
lrange key start stop = sendRequest (["LRANGE"] ++ [encode key] ++ [encode start] ++ [encode stop] )

expire
    :: ByteString -- ^ key
    -> Integer -- ^ seconds
    -> Redis (Either Reply Bool)
expire key seconds = sendRequest (["EXPIRE"] ++ [encode key] ++ [encode seconds] )

lastsave
    :: Redis (Either Reply Integer)
lastsave  = sendRequest (["LASTSAVE"] )

llen
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
llen key = sendRequest (["LLEN"] ++ [encode key] )

decrby
    :: ByteString -- ^ key
    -> Integer -- ^ decrement
    -> Redis (Either Reply Integer)
decrby key decrement = sendRequest (["DECRBY"] ++ [encode key] ++ [encode decrement] )

exec
    :: Redis (Either Reply Reply)
exec  = sendRequest (["EXEC"] )

mget
    :: [ByteString] -- ^ key
    -> Redis (Either Reply [Maybe ByteString])
mget key = sendRequest (["MGET"] ++ map encode key )

zadd
    :: ByteString -- ^ key
    -> [(Double,ByteString)] -- ^ scoreMember
    -> Redis (Either Reply Integer)
zadd key scoreMember = sendRequest (["ZADD"] ++ [encode key] ++ concatMap (\(x,y) -> [encode x,encode y])scoreMember )

keys
    :: ByteString -- ^ pattern
    -> Redis (Either Reply [ByteString])
keys pattern = sendRequest (["KEYS"] ++ [encode pattern] )

bgsave
    :: Redis (Either Reply Status)
bgsave  = sendRequest (["BGSAVE"] )

slaveof
    :: ByteString -- ^ host
    -> ByteString -- ^ port
    -> Redis (Either Reply Status)
slaveof host port = sendRequest (["SLAVEOF"] ++ [encode host] ++ [encode port] )

debugObject
    :: ByteString -- ^ key
    -> Redis (Either Reply ByteString)
debugObject key = sendRequest (["DEBUG","OBJECT"] ++ [encode key] )

getset
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply (Maybe ByteString))
getset key value = sendRequest (["GETSET"] ++ [encode key] ++ [encode value] )

rpushx
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
rpushx key value = sendRequest (["RPUSHX"] ++ [encode key] ++ [encode value] )

setnx
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply Bool)
setnx key value = sendRequest (["SETNX"] ++ [encode key] ++ [encode value] )

zrank
    :: ByteString -- ^ key
    -> ByteString -- ^ member
    -> Redis (Either Reply (Maybe Integer))
zrank key member = sendRequest (["ZRANK"] ++ [encode key] ++ [encode member] )

zremrangebyscore
    :: ByteString -- ^ key
    -> Double -- ^ min
    -> Double -- ^ max
    -> Redis (Either Reply Integer)
zremrangebyscore key min max = sendRequest (["ZREMRANGEBYSCORE"] ++ [encode key] ++ [encode min] ++ [encode max] )

ttl
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
ttl key = sendRequest (["TTL"] ++ [encode key] )

hkeys
    :: ByteString -- ^ key
    -> Redis (Either Reply [ByteString])
hkeys key = sendRequest (["HKEYS"] ++ [encode key] )

rpush
    :: ByteString -- ^ key
    -> [ByteString] -- ^ value
    -> Redis (Either Reply Integer)
rpush key value = sendRequest (["RPUSH"] ++ [encode key] ++ map encode value )

randomkey
    :: Redis (Either Reply (Maybe ByteString))
randomkey  = sendRequest (["RANDOMKEY"] )

spop
    :: ByteString -- ^ key
    -> Redis (Either Reply (Maybe ByteString))
spop key = sendRequest (["SPOP"] ++ [encode key] )

hsetnx
    :: ByteString -- ^ key
    -> ByteString -- ^ field
    -> ByteString -- ^ value
    -> Redis (Either Reply Bool)
hsetnx key field value = sendRequest (["HSETNX"] ++ [encode key] ++ [encode field] ++ [encode value] )

configGet
    :: ByteString -- ^ parameter
    -> Redis (Either Reply [(ByteString,ByteString)])
configGet parameter = sendRequest (["CONFIG","GET"] ++ [encode parameter] )

hvals
    :: ByteString -- ^ key
    -> Redis (Either Reply [ByteString])
hvals key = sendRequest (["HVALS"] ++ [encode key] )

exists
    :: ByteString -- ^ key
    -> Redis (Either Reply Bool)
exists key = sendRequest (["EXISTS"] ++ [encode key] )

sunion
    :: [ByteString] -- ^ key
    -> Redis (Either Reply [ByteString])
sunion key = sendRequest (["SUNION"] ++ map encode key )

zrem
    :: ByteString -- ^ key
    -> [ByteString] -- ^ member
    -> Redis (Either Reply Integer)
zrem key member = sendRequest (["ZREM"] ++ [encode key] ++ map encode member )

smembers
    :: ByteString -- ^ key
    -> Redis (Either Reply [ByteString])
smembers key = sendRequest (["SMEMBERS"] ++ [encode key] )

ping
    :: Redis (Either Reply Status)
ping  = sendRequest (["PING"] )

rename
    :: ByteString -- ^ key
    -> ByteString -- ^ newkey
    -> Redis (Either Reply Status)
rename key newkey = sendRequest (["RENAME"] ++ [encode key] ++ [encode newkey] )

decr
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
decr key = sendRequest (["DECR"] ++ [encode key] )

select
    :: Integer -- ^ index
    -> Redis (Either Reply Status)
select index = sendRequest (["SELECT"] ++ [encode index] )

hexists
    :: ByteString -- ^ key
    -> ByteString -- ^ field
    -> Redis (Either Reply Bool)
hexists key field = sendRequest (["HEXISTS"] ++ [encode key] ++ [encode field] )

sinterstore
    :: ByteString -- ^ destination
    -> [ByteString] -- ^ key
    -> Redis (Either Reply Integer)
sinterstore destination key = sendRequest (["SINTERSTORE"] ++ [encode destination] ++ map encode key )

shutdown
    :: Redis (Either Reply Status)
shutdown  = sendRequest (["SHUTDOWN"] )

configSet
    :: ByteString -- ^ parameter
    -> ByteString -- ^ value
    -> Redis (Either Reply Status)
configSet parameter value = sendRequest (["CONFIG","SET"] ++ [encode parameter] ++ [encode value] )

renamenx
    :: ByteString -- ^ key
    -> ByteString -- ^ newkey
    -> Redis (Either Reply Bool)
renamenx key newkey = sendRequest (["RENAMENX"] ++ [encode key] ++ [encode newkey] )

expireat
    :: ByteString -- ^ key
    -> Integer -- ^ timestamp
    -> Redis (Either Reply Bool)
expireat key timestamp = sendRequest (["EXPIREAT"] ++ [encode key] ++ [encode timestamp] )

get
    :: ByteString -- ^ key
    -> Redis (Either Reply (Maybe ByteString))
get key = sendRequest (["GET"] ++ [encode key] )

lrem
    :: ByteString -- ^ key
    -> Integer -- ^ count
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
lrem key count value = sendRequest (["LREM"] ++ [encode key] ++ [encode count] ++ [encode value] )

incr
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
incr key = sendRequest (["INCR"] ++ [encode key] )

zcard
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
zcard key = sendRequest (["ZCARD"] ++ [encode key] )

ltrim
    :: ByteString -- ^ key
    -> Integer -- ^ start
    -> Integer -- ^ stop
    -> Redis (Either Reply Status)
ltrim key start stop = sendRequest (["LTRIM"] ++ [encode key] ++ [encode start] ++ [encode stop] )

append
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
append key value = sendRequest (["APPEND"] ++ [encode key] ++ [encode value] )

lset
    :: ByteString -- ^ key
    -> Integer -- ^ index
    -> ByteString -- ^ value
    -> Redis (Either Reply Status)
lset key index value = sendRequest (["LSET"] ++ [encode key] ++ [encode index] ++ [encode value] )

info
    :: Redis (Either Reply ByteString)
info  = sendRequest (["INFO"] )

hget
    :: ByteString -- ^ key
    -> ByteString -- ^ field
    -> Redis (Either Reply (Maybe ByteString))
hget key field = sendRequest (["HGET"] ++ [encode key] ++ [encode field] )

sdiff
    :: [ByteString] -- ^ key
    -> Redis (Either Reply [ByteString])
sdiff key = sendRequest (["SDIFF"] ++ map encode key )

smove
    :: ByteString -- ^ source
    -> ByteString -- ^ destination
    -> ByteString -- ^ member
    -> Redis (Either Reply Bool)
smove source destination member = sendRequest (["SMOVE"] ++ [encode source] ++ [encode destination] ++ [encode member] )

flushdb
    :: Redis (Either Reply Status)
flushdb  = sendRequest (["FLUSHDB"] )

set
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply Status)
set key value = sendRequest (["SET"] ++ [encode key] ++ [encode value] )

zremrangebyrank
    :: ByteString -- ^ key
    -> Integer -- ^ start
    -> Integer -- ^ stop
    -> Redis (Either Reply Integer)
zremrangebyrank key start stop = sendRequest (["ZREMRANGEBYRANK"] ++ [encode key] ++ [encode start] ++ [encode stop] )

sadd
    :: ByteString -- ^ key
    -> [ByteString] -- ^ member
    -> Redis (Either Reply Integer)
sadd key member = sendRequest (["SADD"] ++ [encode key] ++ map encode member )

lpush
    :: ByteString -- ^ key
    -> [ByteString] -- ^ value
    -> Redis (Either Reply Integer)
lpush key value = sendRequest (["LPUSH"] ++ [encode key] ++ map encode value )

lindex
    :: ByteString -- ^ key
    -> Integer -- ^ index
    -> Redis (Either Reply (Maybe ByteString))
lindex key index = sendRequest (["LINDEX"] ++ [encode key] ++ [encode index] )

zscore
    :: ByteString -- ^ key
    -> ByteString -- ^ member
    -> Redis (Either Reply (Maybe Double))
zscore key member = sendRequest (["ZSCORE"] ++ [encode key] ++ [encode member] )

strlen
    :: ByteString -- ^ key
    -> Redis (Either Reply Integer)
strlen key = sendRequest (["STRLEN"] ++ [encode key] )

unwatch
    :: Redis (Either Reply Status)
unwatch  = sendRequest (["UNWATCH"] )

hset
    :: ByteString -- ^ key
    -> ByteString -- ^ field
    -> ByteString -- ^ value
    -> Redis (Either Reply Bool)
hset key field value = sendRequest (["HSET"] ++ [encode key] ++ [encode field] ++ [encode value] )

lpushx
    :: ByteString -- ^ key
    -> ByteString -- ^ value
    -> Redis (Either Reply Integer)
lpushx key value = sendRequest (["LPUSHX"] ++ [encode key] ++ [encode value] )

discard
    :: Redis (Either Reply Status)
discard  = sendRequest (["DISCARD"] )

debugSegfault
    :: Redis (Either Reply Status)
debugSegfault  = sendRequest (["DEBUG","SEGFAULT"] )

srandmember
    :: ByteString -- ^ key
    -> Redis (Either Reply (Maybe ByteString))
srandmember key = sendRequest (["SRANDMEMBER"] ++ [encode key] )

persist
    :: ByteString -- ^ key
    -> Redis (Either Reply Bool)
persist key = sendRequest (["PERSIST"] ++ [encode key] )