@@ -6,6 +6,7 @@
66{-# LANGUAGE UndecidableInstances #-}
77module Control.Ether.Core
88 ( EtherTags
9+ , UniqueEtherTag
910 , UniqueEtherTags
1011 , ensureUniqueEtherTags
1112 ) where
@@ -29,14 +30,17 @@ import qualified Control.Monad.Trans.State.Strict as Trans.Strict
2930import qualified Control.Monad.Trans.Writer.Lazy as Trans.Lazy
3031import qualified Control.Monad.Trans.Writer.Strict as Trans.Strict
3132
32−type family Elem (x :: k) (as :: [k]) :: Bool where
33− Elem x (x ': as) = 'True
34− Elem x (a ': as) = Elem x as
35− Elem x '[] = 'False
33+-- Never declare instances for this class
34+class UniqueEtherTag a
35+
36+type family IsUnique (x :: k) (as :: [k]) :: Constraint where
37+ IsUnique x (x ': as) = UniqueEtherTag x
38+ IsUnique x (a ': as) = IsUnique x as
39+ IsUnique x '[] = ()
3640
3741type family Unique (as :: [k]) :: Constraint where
3842 Unique '[] = ()
39− Unique (a ': as) = (Elem a as ~ 'False, Unique as)
43+ Unique (a ': as) = (IsUnique a as, Unique as)
4044
4145type family UniqueEtherTags (m :: * -> *) :: Constraint where
4246 UniqueEtherTags m = Unique (EtherTags m)