-- |
-- Module      : Data.UUID.Versions
-- License     : MIT
-- Maintainer  : mmzk1526@outlook.com
-- Portability : GHC
--
-- Supported 'UUID' versions for 'Data.TypeID.TypeID''.
--
module Data.UUID.Versions
 (
  -- * Supported 'UUID' versions
    UUIDVersion(..)
  -- * Validation
  , validateWithVersion
 ) where

import           Data.Bits
import           Data.UUID.Types.Internal

-- | The supported 'UUID' versions. These constructors are used as type-level
-- tags for 'Data.TypeID.TypeID''.
--
-- 'V5' is not supported yet.
data UUIDVersion = V1 | V4 | V5 | V7
  deriving (UUIDVersion -> UUIDVersion -> Bool
(UUIDVersion -> UUIDVersion -> Bool)
-> (UUIDVersion -> UUIDVersion -> Bool) -> Eq UUIDVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UUIDVersion -> UUIDVersion -> Bool
== :: UUIDVersion -> UUIDVersion -> Bool
$c/= :: UUIDVersion -> UUIDVersion -> Bool
/= :: UUIDVersion -> UUIDVersion -> Bool
Eq, Eq UUIDVersion
Eq UUIDVersion
-> (UUIDVersion -> UUIDVersion -> Ordering)
-> (UUIDVersion -> UUIDVersion -> Bool)
-> (UUIDVersion -> UUIDVersion -> Bool)
-> (UUIDVersion -> UUIDVersion -> Bool)
-> (UUIDVersion -> UUIDVersion -> Bool)
-> (UUIDVersion -> UUIDVersion -> UUIDVersion)
-> (UUIDVersion -> UUIDVersion -> UUIDVersion)
-> Ord UUIDVersion
UUIDVersion -> UUIDVersion -> Bool
UUIDVersion -> UUIDVersion -> Ordering
UUIDVersion -> UUIDVersion -> UUIDVersion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: UUIDVersion -> UUIDVersion -> Ordering
compare :: UUIDVersion -> UUIDVersion -> Ordering
$c< :: UUIDVersion -> UUIDVersion -> Bool
< :: UUIDVersion -> UUIDVersion -> Bool
$c<= :: UUIDVersion -> UUIDVersion -> Bool
<= :: UUIDVersion -> UUIDVersion -> Bool
$c> :: UUIDVersion -> UUIDVersion -> Bool
> :: UUIDVersion -> UUIDVersion -> Bool
$c>= :: UUIDVersion -> UUIDVersion -> Bool
>= :: UUIDVersion -> UUIDVersion -> Bool
$cmax :: UUIDVersion -> UUIDVersion -> UUIDVersion
max :: UUIDVersion -> UUIDVersion -> UUIDVersion
$cmin :: UUIDVersion -> UUIDVersion -> UUIDVersion
min :: UUIDVersion -> UUIDVersion -> UUIDVersion
Ord, UUIDVersion
UUIDVersion -> UUIDVersion -> Bounded UUIDVersion
forall a. a -> a -> Bounded a
$cminBound :: UUIDVersion
minBound :: UUIDVersion
$cmaxBound :: UUIDVersion
maxBound :: UUIDVersion
Bounded, Int -> UUIDVersion
UUIDVersion -> Int
UUIDVersion -> [UUIDVersion]
UUIDVersion -> UUIDVersion
UUIDVersion -> UUIDVersion -> [UUIDVersion]
UUIDVersion -> UUIDVersion -> UUIDVersion -> [UUIDVersion]
(UUIDVersion -> UUIDVersion)
-> (UUIDVersion -> UUIDVersion)
-> (Int -> UUIDVersion)
-> (UUIDVersion -> Int)
-> (UUIDVersion -> [UUIDVersion])
-> (UUIDVersion -> UUIDVersion -> [UUIDVersion])
-> (UUIDVersion -> UUIDVersion -> [UUIDVersion])
-> (UUIDVersion -> UUIDVersion -> UUIDVersion -> [UUIDVersion])
-> Enum UUIDVersion
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: UUIDVersion -> UUIDVersion
succ :: UUIDVersion -> UUIDVersion
$cpred :: UUIDVersion -> UUIDVersion
pred :: UUIDVersion -> UUIDVersion
$ctoEnum :: Int -> UUIDVersion
toEnum :: Int -> UUIDVersion
$cfromEnum :: UUIDVersion -> Int
fromEnum :: UUIDVersion -> Int
$cenumFrom :: UUIDVersion -> [UUIDVersion]
enumFrom :: UUIDVersion -> [UUIDVersion]
$cenumFromThen :: UUIDVersion -> UUIDVersion -> [UUIDVersion]
enumFromThen :: UUIDVersion -> UUIDVersion -> [UUIDVersion]
$cenumFromTo :: UUIDVersion -> UUIDVersion -> [UUIDVersion]
enumFromTo :: UUIDVersion -> UUIDVersion -> [UUIDVersion]
$cenumFromThenTo :: UUIDVersion -> UUIDVersion -> UUIDVersion -> [UUIDVersion]
enumFromThenTo :: UUIDVersion -> UUIDVersion -> UUIDVersion -> [UUIDVersion]
Enum, Int -> UUIDVersion -> ShowS
[UUIDVersion] -> ShowS
UUIDVersion -> [Char]
(Int -> UUIDVersion -> ShowS)
-> (UUIDVersion -> [Char])
-> ([UUIDVersion] -> ShowS)
-> Show UUIDVersion
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UUIDVersion -> ShowS
showsPrec :: Int -> UUIDVersion -> ShowS
$cshow :: UUIDVersion -> [Char]
show :: UUIDVersion -> [Char]
$cshowList :: [UUIDVersion] -> ShowS
showList :: [UUIDVersion] -> ShowS
Show)

toInt :: Num a => UUIDVersion -> a
toInt :: forall a. Num a => UUIDVersion -> a
toInt UUIDVersion
V1 = a
1
toInt UUIDVersion
V4 = a
4
toInt UUIDVersion
V5 = a
5
toInt UUIDVersion
V7 = a
7
{-# INLINE toInt #-}

-- | Validate the given 'UUID' with the given 'UUIDVersion'.
--
-- The variant is supposed to be 0x2.
validateWithVersion :: UUID -> UUIDVersion -> Bool
validateWithVersion :: UUID -> UUIDVersion -> Bool
validateWithVersion (UUID Word64
w1 Word64
w2) UUIDVersion
version
  = (Word64
w1 Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` Int
12) Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. Word64
0xF Word64 -> Word64 -> Bool
forall a. Eq a => a -> a -> Bool
== UUIDVersion -> Word64
forall a. Num a => UUIDVersion -> a
toInt UUIDVersion
version Bool -> Bool -> Bool
&& (Word64
w2 Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` Int
62) Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. Word64
0x3 Word64 -> Word64 -> Bool
forall a. Eq a => a -> a -> Bool
== Word64
0x2
{-# INLINE validateWithVersion #-}