module UUID where import Data.Patch.ObjectMap ( ObjectMap(..), UUID(..), findPath ) import Data.Path ( SubPath ) import Control.Monad.IO.Class( MonadIO(..) ) import qualified Codec.Binary.Base64Url as B64 import qualified Data.ByteString as B import qualified Data.ByteString.Char8 as BC import System.Random ( randomRIO ) import Types instance FixedSize UUID where fixedSize _ = 32 toBS (UUID x) = x fromBS = UUID rootUUID :: UUID rootUUID = UUID . BC.pack $ replicate 28 '\0' ++ "ROOT" makeUUID :: MonadIO m => m UUID makeUUID = do x <- liftIO $ randomRIO (0,2^(256 ::Integer) :: Integer) return $ UUID (toBS x B.empty) where toBS :: Integer -> B.ByteString -> B.ByteString toBS 0 s = s toBS x s = toBS (x `div` 256) $ B.cons (fromIntegral $ x `mod` 256) s findUUID :: SubPath -> Gorsvet (Maybe UUID) findUUID path = do mb <- findPath path rootUUID =<< shadow case mb of Just (uuid, _) -> return (Just uuid) Nothing -> return Nothing formatUUID :: UUID -> String formatUUID (UUID x) = B64.encode $ B.unpack x