module Data.ObjectID
( ObjectID
, calculateSerialize
, calculateBuilder
, calculateByteString
) where
import Crypto.Hash.Skein256 ( hash )
import Blaze.ByteString.Builder ( Builder, toByteString )
import Data.ByteString ( ByteString )
import Data.Serialize ( Serialize(..), encode, decode )
import Data.Serialize.Get ( getWord64be )
import Data.Serialize.Put ( putWord64be )
import Data.Word ( Word64 )
data ObjectID = ObjectID !Word64 !Word64 !Word64 !Word64
deriving ( Show, Eq, Ord )
instance Serialize ObjectID where
put (ObjectID a b c d) = do
putWord64be a
putWord64be b
putWord64be c
putWord64be d
get = do
a <- getWord64be
b <- getWord64be
c <- getWord64be
d <- getWord64be
return $ ObjectID a b c d
calculateSerialize :: Serialize a => a -> ObjectID
calculateSerialize = calculateByteString . encode
calculateBuilder :: Builder -> ObjectID
calculateBuilder = calculateByteString . toByteString
calculateByteString :: ByteString -> ObjectID
calculateByteString bs =
let hsh = hash 256 bs
Right oid = decode hsh
in oid