packages feed

moonlight-category-0.1.0.0: src-abstract/Moonlight/Category/Pure/PolynomialFunctor.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}

-- | Polynomial functors as positions with directions, and the parameterized variant.
module Moonlight.Category.Pure.PolynomialFunctor
  ( PolynomialFunctor (..),
    ParameterizedPolynomialFunctor (..),
  )
where

import Data.Kind (Constraint, Type)
import Moonlight.Category.Pure.CoveringFamily (Exists)

type PolynomialFunctor :: Type -> Constraint
-- | A polynomial described by positions and the directions at each position.
class PolynomialFunctor polynomial where
  data Position polynomial :: Type -> Type
  type Direction polynomial position :: Type
  allPositions :: [Exists (Position polynomial)]

type ParameterizedPolynomialFunctor :: Type -> Constraint
-- | A polynomial family whose positions and directions vary by parameter.
class ParameterizedPolynomialFunctor polynomial where
  type PolynomialParameter polynomial :: Type
  data ParameterizedPosition polynomial :: Type -> Type
  type ParameterizedDirection polynomial position :: Type
  positionsAt :: PolynomialParameter polynomial -> [Exists (ParameterizedPosition polynomial)]