graphted-0.2.5.1: src/Control/Graphted/Class.hs
{-# LANGUAGE CPP #-}
{- |
Module : Control.Graph.Base
Description : Base type class for graph indexed types.
Copyright : (c) Aaron Friel
License : BSD-3
Maintainer : Aaron Friel <mayreply@aaronfriel.com>
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