content: {-# OPTIONS -fno-warn-redundant-constraints #-}
  
  {-# LANGUAGE DatatypeContexts #-}
  {-# LANGUAGE EmptyDataDecls #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE UndecidableInstances #-}
  
  module HTk.Toolkit.TreeList (getObjectFromTreeList) where
  
  class Eq c => CItem c
  
  -- A bizarre instance decl!
  -- People who use instance decls like this are asking for trouble
  instance {-# OVERLAPPABLE #-} GUIObject w => Eq w where
    w1 == w2 = toGUIObject w1 == toGUIObject w2
  
  data StateEntry a 
    = StateEntry (TreeListObject a) a -- Comment this 'a' out and it type checks
    deriving Eq
  
  -- The delicate point about this test is that we want to 
  -- infer a derived instance decl like this:
  --    instance (CItem a, Eq a) => Eq (StateEntry a)
  -- But note the instance decl for (Eq w) for any w!
  -- There's a danger than we'll use that instance decl
  -- to get the derived instance
  --    instance (CItem a, GUIObject a) => Eq (StateEntry a)
  -- And then that doesn't work subsequently
  
  getObjectFromTreeList :: CItem a => StateEntry a -> Bool  
  getObjectFromTreeList state = state == state
  
  data CItem a => TreeListObject a
  
  instance {-# OVERLAPPING #-} CItem a => Eq (TreeListObject a)
  
  class GUIObject w where
    toGUIObject     :: w -> GUIOBJECT
  
  
  data GUIOBJECT
  
  instance Eq GUIOBJECT where
    (==) = undefined
    (/=) = undefined
  