{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module System.Metrics.Prometheus.MetricId where

import           Data.Map       (Map)
import qualified Data.Map       as Map
import           Data.Monoid    (Monoid)
import           Data.Semigroup (Semigroup)
import           Data.String    (IsString)
import           Data.Text      (Text)
import           Prelude        hiding (null)


newtype Name = Name { Name -> Text
unName :: Text } deriving (Int -> Name -> ShowS
[Name] -> ShowS
Name -> String
(Int -> Name -> ShowS)
-> (Name -> String) -> ([Name] -> ShowS) -> Show Name
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Name] -> ShowS
$cshowList :: [Name] -> ShowS
show :: Name -> String
$cshow :: Name -> String
showsPrec :: Int -> Name -> ShowS
$cshowsPrec :: Int -> Name -> ShowS
Show, Name -> Name -> Bool
(Name -> Name -> Bool) -> (Name -> Name -> Bool) -> Eq Name
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Name -> Name -> Bool
$c/= :: Name -> Name -> Bool
== :: Name -> Name -> Bool
$c== :: Name -> Name -> Bool
Eq, Eq Name
Eq Name
-> (Name -> Name -> Ordering)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Bool)
-> (Name -> Name -> Name)
-> (Name -> Name -> Name)
-> Ord Name
Name -> Name -> Bool
Name -> Name -> Ordering
Name -> Name -> Name
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 :: Name -> Name -> Name
$cmin :: Name -> Name -> Name
max :: Name -> Name -> Name
$cmax :: Name -> Name -> Name
>= :: Name -> Name -> Bool
$c>= :: Name -> Name -> Bool
> :: Name -> Name -> Bool
$c> :: Name -> Name -> Bool
<= :: Name -> Name -> Bool
$c<= :: Name -> Name -> Bool
< :: Name -> Name -> Bool
$c< :: Name -> Name -> Bool
compare :: Name -> Name -> Ordering
$ccompare :: Name -> Name -> Ordering
Ord, String -> Name
(String -> Name) -> IsString Name
forall a. (String -> a) -> IsString a
fromString :: String -> Name
$cfromString :: String -> Name
IsString, Semigroup Name
Name
Semigroup Name
-> Name
-> (Name -> Name -> Name)
-> ([Name] -> Name)
-> Monoid Name
[Name] -> Name
Name -> Name -> Name
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [Name] -> Name
$cmconcat :: [Name] -> Name
mappend :: Name -> Name -> Name
$cmappend :: Name -> Name -> Name
mempty :: Name
$cmempty :: Name
Monoid, NonEmpty Name -> Name
Name -> Name -> Name
(Name -> Name -> Name)
-> (NonEmpty Name -> Name)
-> (forall b. Integral b => b -> Name -> Name)
-> Semigroup Name
forall b. Integral b => b -> Name -> Name
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b. Integral b => b -> Name -> Name
$cstimes :: forall b. Integral b => b -> Name -> Name
sconcat :: NonEmpty Name -> Name
$csconcat :: NonEmpty Name -> Name
<> :: Name -> Name -> Name
$c<> :: Name -> Name -> Name
Semigroup)
newtype Labels = Labels { Labels -> Map Text Text
unLabels :: Map Text Text } deriving (Int -> Labels -> ShowS
[Labels] -> ShowS
Labels -> String
(Int -> Labels -> ShowS)
-> (Labels -> String) -> ([Labels] -> ShowS) -> Show Labels
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Labels] -> ShowS
$cshowList :: [Labels] -> ShowS
show :: Labels -> String
$cshow :: Labels -> String
showsPrec :: Int -> Labels -> ShowS
$cshowsPrec :: Int -> Labels -> ShowS
Show, Labels -> Labels -> Bool
(Labels -> Labels -> Bool)
-> (Labels -> Labels -> Bool) -> Eq Labels
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Labels -> Labels -> Bool
$c/= :: Labels -> Labels -> Bool
== :: Labels -> Labels -> Bool
$c== :: Labels -> Labels -> Bool
Eq, Eq Labels
Eq Labels
-> (Labels -> Labels -> Ordering)
-> (Labels -> Labels -> Bool)
-> (Labels -> Labels -> Bool)
-> (Labels -> Labels -> Bool)
-> (Labels -> Labels -> Bool)
-> (Labels -> Labels -> Labels)
-> (Labels -> Labels -> Labels)
-> Ord Labels
Labels -> Labels -> Bool
Labels -> Labels -> Ordering
Labels -> Labels -> Labels
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 :: Labels -> Labels -> Labels
$cmin :: Labels -> Labels -> Labels
max :: Labels -> Labels -> Labels
$cmax :: Labels -> Labels -> Labels
>= :: Labels -> Labels -> Bool
$c>= :: Labels -> Labels -> Bool
> :: Labels -> Labels -> Bool
$c> :: Labels -> Labels -> Bool
<= :: Labels -> Labels -> Bool
$c<= :: Labels -> Labels -> Bool
< :: Labels -> Labels -> Bool
$c< :: Labels -> Labels -> Bool
compare :: Labels -> Labels -> Ordering
$ccompare :: Labels -> Labels -> Ordering
Ord, Semigroup Labels
Labels
Semigroup Labels
-> Labels
-> (Labels -> Labels -> Labels)
-> ([Labels] -> Labels)
-> Monoid Labels
[Labels] -> Labels
Labels -> Labels -> Labels
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [Labels] -> Labels
$cmconcat :: [Labels] -> Labels
mappend :: Labels -> Labels -> Labels
$cmappend :: Labels -> Labels -> Labels
mempty :: Labels
$cmempty :: Labels
Monoid, NonEmpty Labels -> Labels
Labels -> Labels -> Labels
(Labels -> Labels -> Labels)
-> (NonEmpty Labels -> Labels)
-> (forall b. Integral b => b -> Labels -> Labels)
-> Semigroup Labels
forall b. Integral b => b -> Labels -> Labels
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b. Integral b => b -> Labels -> Labels
$cstimes :: forall b. Integral b => b -> Labels -> Labels
sconcat :: NonEmpty Labels -> Labels
$csconcat :: NonEmpty Labels -> Labels
<> :: Labels -> Labels -> Labels
$c<> :: Labels -> Labels -> Labels
Semigroup)


data MetricId =
    MetricId
    { MetricId -> Name
name   :: Name
    , MetricId -> Labels
labels :: Labels
    } deriving (MetricId -> MetricId -> Bool
(MetricId -> MetricId -> Bool)
-> (MetricId -> MetricId -> Bool) -> Eq MetricId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetricId -> MetricId -> Bool
$c/= :: MetricId -> MetricId -> Bool
== :: MetricId -> MetricId -> Bool
$c== :: MetricId -> MetricId -> Bool
Eq, Eq MetricId
Eq MetricId
-> (MetricId -> MetricId -> Ordering)
-> (MetricId -> MetricId -> Bool)
-> (MetricId -> MetricId -> Bool)
-> (MetricId -> MetricId -> Bool)
-> (MetricId -> MetricId -> Bool)
-> (MetricId -> MetricId -> MetricId)
-> (MetricId -> MetricId -> MetricId)
-> Ord MetricId
MetricId -> MetricId -> Bool
MetricId -> MetricId -> Ordering
MetricId -> MetricId -> MetricId
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 :: MetricId -> MetricId -> MetricId
$cmin :: MetricId -> MetricId -> MetricId
max :: MetricId -> MetricId -> MetricId
$cmax :: MetricId -> MetricId -> MetricId
>= :: MetricId -> MetricId -> Bool
$c>= :: MetricId -> MetricId -> Bool
> :: MetricId -> MetricId -> Bool
$c> :: MetricId -> MetricId -> Bool
<= :: MetricId -> MetricId -> Bool
$c<= :: MetricId -> MetricId -> Bool
< :: MetricId -> MetricId -> Bool
$c< :: MetricId -> MetricId -> Bool
compare :: MetricId -> MetricId -> Ordering
$ccompare :: MetricId -> MetricId -> Ordering
Ord, Int -> MetricId -> ShowS
[MetricId] -> ShowS
MetricId -> String
(Int -> MetricId -> ShowS)
-> (MetricId -> String) -> ([MetricId] -> ShowS) -> Show MetricId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetricId] -> ShowS
$cshowList :: [MetricId] -> ShowS
show :: MetricId -> String
$cshow :: MetricId -> String
showsPrec :: Int -> MetricId -> ShowS
$cshowsPrec :: Int -> MetricId -> ShowS
Show)


addLabel :: Text -> Text -> Labels -> Labels
addLabel :: Text -> Text -> Labels -> Labels
addLabel Text
key Text
val = Map Text Text -> Labels
Labels (Map Text Text -> Labels)
-> (Labels -> Map Text Text) -> Labels -> Labels
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Map Text Text -> Map Text Text
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Text
key Text
val (Map Text Text -> Map Text Text)
-> (Labels -> Map Text Text) -> Labels -> Map Text Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Labels -> Map Text Text
unLabels


fromList :: [(Text, Text)] -> Labels
fromList :: [(Text, Text)] -> Labels
fromList = Map Text Text -> Labels
Labels (Map Text Text -> Labels)
-> ([(Text, Text)] -> Map Text Text) -> [(Text, Text)] -> Labels
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Text, Text)] -> Map Text Text
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList


toList :: Labels -> [(Text, Text)]
toList :: Labels -> [(Text, Text)]
toList = Map Text Text -> [(Text, Text)]
forall k a. Map k a -> [(k, a)]
Map.toList (Map Text Text -> [(Text, Text)])
-> (Labels -> Map Text Text) -> Labels -> [(Text, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Labels -> Map Text Text
unLabels


null :: Labels -> Bool
null :: Labels -> Bool
null = Map Text Text -> Bool
forall k a. Map k a -> Bool
Map.null (Map Text Text -> Bool)
-> (Labels -> Map Text Text) -> Labels -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Labels -> Map Text Text
unLabels