{-# 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 :: NoCtx ()
noCtx = NoCtx ()
forall a. HasCallStack => a
undefined

instance Sat (NoCtx a) where dict :: NoCtx a
dict = NoCtx a
forall a. HasCallStack => a
undefined


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

-- | Pair context

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

pairCtx :: l () -> r () -> PairCtx l r ()
pairCtx :: l () -> r () -> PairCtx l r ()
pairCtx l ()
_ r ()
_ = PairCtx l r ()
forall a. HasCallStack => a
undefined

instance (Sat (l a), Sat (r a))
      => Sat (PairCtx l r a)
  where
    dict :: PairCtx l r a
dict = PairCtx :: forall (l :: * -> *) (r :: * -> *) a. l a -> r a -> PairCtx l r a
PairCtx { leftCtx :: l a
leftCtx  = l a
forall a. Sat a => a
dict
                   , rightCtx :: r a
rightCtx = r a
forall a. Sat a => a
dict }


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