{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} module Prometheus.Label ( Label (..) , LabelPairs , Label0 , Label1 , Label2 , Label3 , Label4 , Label5 , Label6 , Label7 , Label8 , Label9 ) where import Data.Text -- | A list of tuples where the first value is the label and the second is the -- value of that label. type LabelPairs = [(Text, Text)] -- | Label describes a class of types that can be used to as the label of -- a vector. class Ord l => Label l where labelPairs :: l -> l -> LabelPairs type Label0 = () instance Label () where labelPairs () () = [] type Label1 = Text instance Label Text where labelPairs key value = [(key, value)] type Label2 = (Text, Text) instance (a ~ Text, b ~ a) => Label (a, b) where labelPairs (k1, k2) (v1, v2) = [(k1, v1), (k2, v2)] type Label3 = (Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a) => Label (a, b, c) where labelPairs (k1, k2, k3) (v1, v2, v3) = [(k1, v1), (k2, v2), (k3, v3)] type Label4 = (Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a) => Label (a, b, c, d) where labelPairs (k1, k2, k3, k4) (v1, v2, v3, v4) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4)] type Label5 = (Text, Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a, e ~ a) => Label (a, b, c, d, e) where labelPairs (k1, k2, k3, k4, k5) (v1, v2, v3, v4, v5) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5)] type Label6 = (Text, Text, Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a, e ~ a, f ~ a) => Label (a, b, c, d, e, f) where labelPairs (k1, k2, k3, k4, k5, k6) (v1, v2, v3, v4, v5, v6) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5), (k6, v6)] type Label7 = (Text, Text, Text, Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a, e ~ a, f ~ a, g ~ a) => Label (a, b, c, d, e, f, g) where labelPairs (k1, k2, k3, k4, k5, k6, k7) (v1, v2, v3, v4, v5, v6, v7) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5), (k6, v6), (k7, v7)] type Label8 = (Text, Text, Text, Text, Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a, e ~ a, f ~ a, g ~ a, h ~ a) => Label (a, b, c, d, e, f, g, h) where labelPairs (k1, k2, k3, k4, k5, k6, k7, k8) (v1, v2, v3, v4, v5, v6, v7, v8) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5), (k6, v6), (k7, v7), (k8, v8)] type Label9 = (Text, Text, Text, Text, Text, Text, Text, Text, Text) instance (a ~ Text, b ~ a, c ~ a, d ~ a, e ~ a, f ~ a, g ~ a, h ~ a, i ~ a) => Label (a, b, c, d, e, f, g, h, i) where labelPairs (k1, k2, k3, k4, k5, k6, k7, k8, k9) (v1, v2, v3, v4, v5, v6, v7, v8, v9) = [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5), (k6, v6), (k7, v7), (k8, v8), (k9, v9)]