    -- |
    -- Module      : Data.UUID.Named
    -- Copyright   : (c) 2008 Antoine Latter
    --
    -- License     : BSD-style
    --
    -- Maintainer  : aslatter@gmail.com
    -- Stability   : experimental
    -- Portability : portable
    --
    --
    -- This module implements Version 3/5 UUIDs as specified
    -- in RFC 4122.
    --
    -- These UUIDs identify an object within a namespace,
    -- and are deterministic.
    --
    -- The namespace is identified by a UUID.  Several sample
    -- namespaces are enclosed.

    module Data.UUID.Named
        (generateNamed
        ,namespaceDNS
        ,namespaceURL
        ,namespaceOID
        ,namespaceX500
        ) where

    import Data.UUID.Internal

    import Data.Binary
    import Data.Maybe

    import qualified Data.ByteString.Lazy as BS

    -- |Generate a 'UUID' within the specified namespace out of the given
    -- object.
    generateNamed :: ([Word8] -> (Word32, Word32, Word32, Word32)) -- ^Hash
                  -> Word8   -- ^Version
                  ->  UUID   -- ^Namespace
                  -> [Word8] -- ^Object
                  -> UUID
    generateNamed hash version namespace object =
        let chunk = BS.unpack (toByteString namespace) ++ object
            (w1, w2, w3, w4) = hash chunk
        in buildFromWords version w1 w2 w3 w4

    unsafeFromString :: String -> UUID
    unsafeFromString = fromJust . fromString

    -- |The namespace for DNS addresses
    namespaceDNS :: UUID
    namespaceDNS = unsafeFromString "6ba7b810-9dad-11d1-80b4-00c04fd430c8"

    -- |The namespace for URLs
    namespaceURL :: UUID
    namespaceURL = unsafeFromString "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

    -- |The namespace for ISO OIDs
    namespaceOID :: UUID
    namespaceOID = unsafeFromString "6ba7b812-9dad-11d1-80b4-00c04fd430c8"

    -- |The namespace for X.500 DNs
    namespaceX500 :: UUID
    namespaceX500 = unsafeFromString "6ba7b814-9dad-11d1-80b4-00c04fd430c8"