module Text.Search.Sphinx.Put where import Data.Int (Int64) import Data.Binary (Word64) import Data.Binary.Put import Data.ByteString.Lazy hiding (pack, length, map, groupBy) import Data.ByteString.Lazy.Char8 (pack) import qualified Data.ByteString.Lazy as BS import qualified Text.Search.Sphinx.Types as T num = putWord32be . fromIntegral num64 i = putWord64be $ fromIntegral i enum :: Enum a => a -> Put enum = num . fromEnum list f ls = num (length ls) >> mapM_ f ls numC cfg = mapM_ (\x -> num $ x cfg) numC64 cfg = mapM_ (\x -> num64 $ x cfg) strC cfg = mapM_ (\x -> str $ x cfg) stringIntList :: [(String, Int)] -> Put stringIntList xs = list strInt xs where strInt (s,i) = str s >> num i str :: String -> Put str s = do let bs = pack s num (fromEnum $ BS.length bs) putLazyByteString bs cmd :: T.SearchdCommand -> Put cmd = putWord16be . toEnum . T.searchdCommand verCmd :: T.VerCommand -> Put verCmd = putWord16be . toEnum . T.verCommand foldPuts :: [Put] -> Put foldPuts [] = return () foldPuts [p] = p foldPuts (p:ps) = p >> foldPuts ps