content: {-# LANGUAGE GADTs                #-}
  {-# LANGUAGE TemplateHaskell      #-}
  {-# LANGUAGE TypeOperators        #-}
  {-# LANGUAGE TypeSynonymInstances #-}
  --------------------------------------------------------------------------------
  -- |
  -- Module      :  Data.Comp.Show
  -- Copyright   :  (c) 2010-2011 Patrick Bahr, Tom Hvitved
  -- License     :  BSD3
  -- Maintainer  :  Patrick Bahr <paba@diku.dk>
  -- Stability   :  experimental
  -- Portability :  non-portable (GHC Extensions)
  --
  -- This module defines showing of signatures, which lifts to showing of
  -- terms and contexts.
  --
  --------------------------------------------------------------------------------
  
  module Data.Comp.Show
      ( ShowF(..)
      ) where
  
  import Data.Comp.Algebra
  import Data.Comp.Annotation
  import Data.Comp.Derive (liftSum)
  import Data.Comp.Derive.Show
  import Data.Comp.Derive.Utils (derive)
  import Data.Comp.Term
  
  instance (Functor f, ShowF f) => ShowF (Cxt h f) where
      showF (Hole s) = s
      showF (Term t) = showF $ fmap showF t
  
  instance (Functor f, ShowF f, Show a) => Show (Cxt h f a) where
      show = free showF show
  
  instance (ShowF f, Show p) => ShowF (f :&: p) where
      showF (v :&: p) = showF v ++ " :&: " ++ show p
  
  $(derive [liftSum] [''ShowF])
  $(derive [makeShowF] [''Maybe, ''[], ''(,)])
  
  instance (ShowConstr f, Show p) => ShowConstr (f :&: p) where
      showConstr (v :&: p) = showConstr v ++ " :&: " ++ show p
  
  $(derive [liftSum] [''ShowConstr])
  