{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Label(module Data.Label.TH,module Data.Label) where

import Language.Haskell.TH -- separate, to satisfy TH stage restriction
import Data.Label.TH

-- sequence of label letters
data a :< b = a :< b

instance (Show a,Show b) => Show (a:<b) where
  showsPrec d (a:<b) = showsPrec d a . showsPrec d b

-- generate valid letter types for labels
$(genLabelLetters labels)

-- sequence of type tag letters
data a :. b

-- don't look at values when showing tag letter sequences
instance (Show a,Show b) => Show (a:.b) where
  showsPrec d _ = showsPrec d (undefined::a) . showsPrec d (undefined::b)

-- generate valid letter types for type tags
$(genTypeTagLetters labels)

