combine two equivalence class descriptors. -}

- -- | used to construct an equivalence class descriptor for a singleton class

- -- | used to combine the equivalence class descriptor of two classes

- -- which are meant to be combined.

+ => (v -> c) -- ^ used to construct an equivalence class descriptor for a singleton class

+ -> (c -> c -> c) -- ^ used to combine the equivalence class descriptor of two classes

+ -- which are meant to be combined.

-> (forall s. EquivT s c v m a)

runEquivT mk com m = runST $ do

equivalence relation. The first tow arguments specify how to construct

an equivalence class descriptor for a singleton class and how to

combine two equivalence class descriptors. -}

- -- | used to construct an equivalence class descriptor for a singleton class

- -- | used to combine the equivalence class descriptor of two classes

- -- which are meant to be combined.

+runEquivM :: (v -> c) -- ^ used to construct an equivalence class descriptor for a singleton class

+ -> (c -> c -> c) -- ^ used to combine the equivalence class descriptor of two classes

+ -- which are meant to be combined.

-> (forall s. EquivM s c v a)

runEquivM sing comb m = runIdentity $ runEquivT sing comb m