module Noether.Algebra.Inference
  ( Synergise
  , Infer
  , Prim
  , DerivedFrom
  , Strategy
  , module TypeFu.Map
  ) where

import           Noether.Lemmata.TypeFu
import           Noether.Lemmata.TypeFu.Map as TypeFu.Map

-- bahahahaha
data Synergise (a :: [k])

type family Strategy (t :: k) (a :: Type) (hint :: Symbol) :: Type

type family Infer_ (t :: k) (a :: Type) (hint :: [Symbol]) :: [Type] where
  Infer_ t a '[] = '[]
  Infer_ t a (x : xs) = (x := Strategy t a x) : Infer_ t a xs

type Infer (t :: k) a (h :: [Symbol]) = Synergise (Nub (Sort (Infer_ t a h)))

data family Sorted (t :: k)

-- Tags

data DerivedFrom (a :: k)

data Prim