{-# LANGUAGE DeriveGeneric, GeneralizedNewtypeDeriving #-}

module OpenSuse.Types.RequestId
  ( RequestId, mkRequestId, unRequestId
  , ReleaseRequestId, MaintenanceRequestId
  )
  where

import OpenSuse.Prelude

-- An OBS request identifier that is, essentially, a natural number.
newtype RequestId = RequestId Natural
  deriving (Int -> RequestId -> ShowS
[RequestId] -> ShowS
RequestId -> String
(Int -> RequestId -> ShowS)
-> (RequestId -> String)
-> ([RequestId] -> ShowS)
-> Show RequestId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RequestId] -> ShowS
$cshowList :: [RequestId] -> ShowS
show :: RequestId -> String
$cshow :: RequestId -> String
showsPrec :: Int -> RequestId -> ShowS
$cshowsPrec :: Int -> RequestId -> ShowS
Show, RequestId -> RequestId -> Bool
(RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> Bool) -> Eq RequestId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RequestId -> RequestId -> Bool
$c/= :: RequestId -> RequestId -> Bool
== :: RequestId -> RequestId -> Bool
$c== :: RequestId -> RequestId -> Bool
Eq, Eq RequestId
Eq RequestId
-> (RequestId -> RequestId -> Ordering)
-> (RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> RequestId)
-> (RequestId -> RequestId -> RequestId)
-> Ord RequestId
RequestId -> RequestId -> Bool
RequestId -> RequestId -> Ordering
RequestId -> RequestId -> RequestId
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
min :: RequestId -> RequestId -> RequestId
$cmin :: RequestId -> RequestId -> RequestId
max :: RequestId -> RequestId -> RequestId
$cmax :: RequestId -> RequestId -> RequestId
>= :: RequestId -> RequestId -> Bool
$c>= :: RequestId -> RequestId -> Bool
> :: RequestId -> RequestId -> Bool
$c> :: RequestId -> RequestId -> Bool
<= :: RequestId -> RequestId -> Bool
$c<= :: RequestId -> RequestId -> Bool
< :: RequestId -> RequestId -> Bool
$c< :: RequestId -> RequestId -> Bool
compare :: RequestId -> RequestId -> Ordering
$ccompare :: RequestId -> RequestId -> Ordering
$cp1Ord :: Eq RequestId
Ord, Int -> RequestId
RequestId -> Int
RequestId -> [RequestId]
RequestId -> RequestId
RequestId -> RequestId -> [RequestId]
RequestId -> RequestId -> RequestId -> [RequestId]
(RequestId -> RequestId)
-> (RequestId -> RequestId)
-> (Int -> RequestId)
-> (RequestId -> Int)
-> (RequestId -> [RequestId])
-> (RequestId -> RequestId -> [RequestId])
-> (RequestId -> RequestId -> [RequestId])
-> (RequestId -> RequestId -> RequestId -> [RequestId])
-> Enum RequestId
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: RequestId -> RequestId -> RequestId -> [RequestId]
$cenumFromThenTo :: RequestId -> RequestId -> RequestId -> [RequestId]
enumFromTo :: RequestId -> RequestId -> [RequestId]
$cenumFromTo :: RequestId -> RequestId -> [RequestId]
enumFromThen :: RequestId -> RequestId -> [RequestId]
$cenumFromThen :: RequestId -> RequestId -> [RequestId]
enumFrom :: RequestId -> [RequestId]
$cenumFrom :: RequestId -> [RequestId]
fromEnum :: RequestId -> Int
$cfromEnum :: RequestId -> Int
toEnum :: Int -> RequestId
$ctoEnum :: Int -> RequestId
pred :: RequestId -> RequestId
$cpred :: RequestId -> RequestId
succ :: RequestId -> RequestId
$csucc :: RequestId -> RequestId
Enum, (forall x. RequestId -> Rep RequestId x)
-> (forall x. Rep RequestId x -> RequestId) -> Generic RequestId
forall x. Rep RequestId x -> RequestId
forall x. RequestId -> Rep RequestId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RequestId x -> RequestId
$cfrom :: forall x. RequestId -> Rep RequestId x
Generic, Eq RequestId
Eq RequestId
-> (Int -> RequestId -> Int)
-> (RequestId -> Int)
-> Hashable RequestId
Int -> RequestId -> Int
RequestId -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: RequestId -> Int
$chash :: RequestId -> Int
hashWithSalt :: Int -> RequestId -> Int
$chashWithSalt :: Int -> RequestId -> Int
$cp1Hashable :: Eq RequestId
Hashable, Get RequestId
[RequestId] -> Put
RequestId -> Put
(RequestId -> Put)
-> Get RequestId -> ([RequestId] -> Put) -> Binary RequestId
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [RequestId] -> Put
$cputList :: [RequestId] -> Put
get :: Get RequestId
$cget :: Get RequestId
put :: RequestId -> Put
$cput :: RequestId -> Put
Binary, RequestId -> ()
(RequestId -> ()) -> NFData RequestId
forall a. (a -> ()) -> NFData a
rnf :: RequestId -> ()
$crnf :: RequestId -> ()
NFData)

-- | Constructor function for typed request identifiers.
mkRequestId :: Natural -> RequestId
mkRequestId :: Natural -> RequestId
mkRequestId = Natural -> RequestId
RequestId

-- | Accessor function for the underlying natural number.
unRequestId :: RequestId -> Natural
unRequestId :: RequestId -> Natural
unRequestId (RequestId Natural
n) = Natural
n

-- | Type synonym for convenience.
type MaintenanceRequestId = RequestId

-- | Type synonym for convenience.
type ReleaseRequestId = RequestId

instance FromJSON RequestId
instance ToJSON RequestId

instance IsString RequestId where
  fromString :: String -> RequestId
fromString = String -> String -> RequestId
forall input a.
(Stream input Identity Char, HasParser a) =>
String -> input -> a
parse String
"request id"

instance Pretty RequestId where
  pPrint :: RequestId -> Doc
pPrint = Natural -> Doc
forall a. Pretty a => a -> Doc
pPrint (Natural -> Doc) -> (RequestId -> Natural) -> RequestId -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RequestId -> Natural
unRequestId

instance HasParser RequestId where
  parser :: ParsecT st input m RequestId
parser = Natural -> RequestId
mkRequestId (Natural -> RequestId)
-> ParsecT st input m Natural -> ParsecT st input m RequestId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT st input m Natural
forall a st input (m :: * -> *).
HasParser a =>
CharParser st input m a
parser