module Lucienne.Model.Util (maybeAddId, showObjectId, readObjectId, showValue, objectId) where import Data.Bson (Document,Value(ObjId,String),(=:),ObjectId(Oid)) import Numeric (showHex,readHex) import qualified Data.CompactString.UTF8 as CS maybeAddId :: (a -> Maybe ObjectId) -> a -> Document -> Document maybeAddId getId a document = case getId a of Nothing -> document Just id -> ("_id" =: id) : document showObjectId :: ObjectId -> String showObjectId (Oid a b) = showHex a $ showHex b "" readObjectId :: String -> ObjectId readObjectId s = Oid (fst $ head $ readHex $ take 8 s) (fst $ head $ readHex $ drop 8 s) showValue :: Value -> String showValue value = case value of ObjId objId -> showObjectId objId String s -> CS.unpack s objectId :: Value -> ObjectId objectId (ObjId objId) = objId