{-# 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
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
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
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
Ord, Int -> RequestId
RequestId -> Int
RequestId -> [RequestId]
RequestId -> RequestId
RequestId -> RequestId -> [RequestId]
RequestId -> RequestId -> RequestId -> [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. 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
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
Hashable, Get RequestId
[RequestId] -> Put
RequestId -> Put
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 -> ()
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 = forall input a.
(Stream input Identity Char, HasParser a) =>
String -> input -> a
parse String
"request id"

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

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