{-# LANGUAGE CPP #-} {- | Module  : Control.Graph.Base Description : Base type class for graph indexed types. Copyright  : (c) Aaron Friel License  : BSD-3 Maintainer  : Aaron Friel Stability  : unstable Portability : portable -} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeFamilies #-} module Control.Graphted.Class (Graphted (..), Constraint) where #if MIN_VERSION_GLASGOW_HASKELL(8,0,1,0) import Data.Kind (Constraint) #else import GHC.Exts (Constraint) #endif -- | Base class that all Graph-indexed types may implement. -- class Graphted (f :: p -> * -> *) where -- | The unit of our kind p. type Unit f :: p -- | An invariant on combining indexes. type family Inv f (i :: p) (j :: p) :: Constraint type instance Inv f i j = () -- | An elementary composition of indexes. -- -- N.B.: This may be nonsensical if and only if type classes override the -- default definitions of their own type families. -- -- This exists for convenience. type family Combine f (i :: p) (j :: p) :: p