objectid-0.1.0.2: src/Data/ObjectID.hs
{-# LANGUAGE FlexibleInstances #-}
-- |
-- Module : Data.ObjectID
-- Copyright : Jeremy Groven
-- License : BSD3
--
-- Opaque type to uniquely identify things. Objects to be identified must
-- implement the 'uniqueByteString' of 'IsObject', ideally in some way that
-- different objects have different bytestrings, while two instances of the
-- same object will have the same bytestring.
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 )
-- |Opaque type used to uniquely identify objects
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
-- |Get the 'ObjectID' from a 'Serialize' instance
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