{-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeFamilies #-} import Data.Kind main :: IO () main = pure () data Entity (cs :: [Type -> Constraint]) = forall a. All cs a => MkEntity a type family All (cs :: [Type -> Constraint]) (a :: Type) :: Constraint where All (c ': cs) a = (c a, All cs a) All '[] a = () data DataID = DataID class c a => HasDataID a where getDataID :: a -> DataID getDependencies :: a -> [Entity [HasDataID c, c]]