{-# OPTIONS_GHC -XTypeFamilies  #-}

-- Trac #3346

module Foo where

class EP a where
  type Result a
  from :: a -> Result a
  to   :: Result a -> a

{-# RULES "rule1"   forall x. to (from x) = x #-}
{-# RULES "rule2"   forall x. from (to x) = x #-}

foo :: EP a => a -> a
-- This is typed in a way rather similarly to RULE rule1
foo x = to (from x)

bar x = from (to x)
