{-# LANGUAGE DeriveDataTypeable
           , GeneralizedNewtypeDeriving
  #-}

module Data.BTree.UUID
       ( UUID
       , uuid
       )
       where


import Data.Word
import Text.Printf
import Control.Concurrent
import Data.Typeable

import qualified Data.Char as C

import Data.Serialize

import System.IO.Unsafe
import qualified Data.ByteString.Char8      as B
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.ByteString.Base64     as B64

newtype UUID = UUID { unUUID :: B.ByteString }
             deriving (Ord, Eq)


instance Serialize UUID where
  put = put . unUUID
  get = UUID `fmap` get



instance Show UUID where
  show (UUID bs) = B.unpack $ B64.encode bs


uuids :: MVar Int
uuids = unsafePerformIO $ newMVar 1
{-# NOINLINE uuids #-}


uuid :: IO UUID
uuid = (UUID . encode) `fmap`
       (modifyMVar uuids $ \n -> return (n+1, n))