{-# LANGUAGE FlexibleInstances #-}
module Prometheus.Label (
    Label (..)
,   LabelPairs
,   Label0
,   Label1
,   Label2
,   Label3
,   Label4
,   Label5
,   Label6
,   Label7
,   Label8
,   Label9
) where


-- | A list of tuples where the first value is the label and the second is the
-- value of that label.
type LabelPairs = [(String, String)]

-- | 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 = String

instance Label String where
    labelPairs key value = [(key, value)]

type Label2 = (String, String)

instance Label (String, String)  where
    labelPairs (k1, k2) (v1, v2) = [(k1, v1), (k2, v2)]

type Label3 = (String, String, String)

instance Label (String, String, String)  where
    labelPairs (k1, k2, k3) (v1, v2, v3) = [(k1, v1), (k2, v2), (k3, v3)]

type Label4 = (String, String, String, String)

instance Label (String, String, String, String)  where
    labelPairs (k1, k2, k3, k4) (v1, v2, v3, v4) =
            [(k1, v1), (k2, v2), (k3, v3), (k4, v4)]

type Label5 = (String, String, String, String, String)

instance Label (String, String, String, String, String)  where
    labelPairs (k1, k2, k3, k4, k5) (v1, v2, v3, v4, v5) =
            [(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5)]

type Label6 = (String, String, String, String, String, String)

instance Label (String, String, String, String, String, String)  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 = (String, String, String, String, String, String, String)

instance Label (String, String, String, String, String, String, String)  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 = (String, String, String, String, String, String, String, String)

instance Label (String, String, String, String, String, String, String,
                String)  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 = (String, String, String, String, String, String, String, String,
               String)

instance Label (String, String, String, String, String, String, String,
                String, String)  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)]