{-| Quick conduit for reading from Redis lists. Not tested much, and probably quite slow. -} module Data.Conduit.Redis where import Data.Conduit import Data.Conduit.Util import qualified Data.ByteString.Char8 as BS import Network import Database.Redis hiding (String, decode) import Control.Monad (void) import Control.Monad.IO.Class (liftIO) redisSource :: (MonadResource m) => HostName -- ^ Hostname of the Redis server -> Int -- ^ Port of the Redis server (usually 6379) -> BS.ByteString -- ^ Name of the list -> Source m BS.ByteString redisSource h p list = let cinfo = defaultConnectInfo { connectHost = h, connectPort = PortNumber $ fromIntegral p } pull = do o <- blpop [list] 0 case o of Right (Just (_,k)) -> return k _ -> pull in sourceStateIO (connect cinfo) (\conn -> runRedis conn (void quit)) (\conn -> do o <- liftIO $ runRedis conn pull return (StateOpen conn o) )