{-# LANGUAGE UndecidableInstances, EmptyDataDecls #-}

{- |

(C) 2004 Ralf Laemmel

Context parameterisation and context passing.

-}


module Data.Generics.SYB.WithClass.Context

where

------------------------------------------------------------------------------

--
-- | The Sat class from John Hughes' "Restricted Data Types in Haskell"
--

class Sat a
  where
    dict :: a


------------------------------------------------------------------------------

-- | No context

data NoCtx a

noCtx :: NoCtx ()
noCtx = undefined

instance Sat (NoCtx a) where dict = undefined


------------------------------------------------------------------------------

-- | Pair context

data PairCtx l r a
   = PairCtx { leftCtx  :: l a
             , rightCtx :: r a }

pairCtx :: l () -> r () -> PairCtx l r ()
pairCtx _ _ = undefined

instance (Sat (l a), Sat (r a))
      => Sat (PairCtx l r a)
  where
    dict = PairCtx { leftCtx  = dict
                   , rightCtx = dict }


------------------------------------------------------------------------------