packages feed

moonlight-category-0.1.0.0: test/support/Moonlight/Category/Test/PolynomialFixture.hs

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

module Moonlight.Category.Test.PolynomialFixture
  ( BranchPosition,
    DemoParameterizedPolynomial,
    DemoPolynomial,
    FullSliceBranchPosition,
    FullSliceRootPosition,
    ParameterizedPosition
      ( FullSliceBranchWitness,
        FullSliceRootWitness,
        TrimmedSliceRootWitness
      ),
    Position (BranchWitness, RootWitness),
    RootPosition,
    TrimmedSliceRootPosition,
  )
where

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

type DemoPolynomial :: Type
data DemoPolynomial

type RootPosition :: Type
data RootPosition

type BranchPosition :: Type
data BranchPosition

type DemoParameterizedPolynomial :: Type
data DemoParameterizedPolynomial

type FullSliceRootPosition :: Type
data FullSliceRootPosition

type FullSliceBranchPosition :: Type
data FullSliceBranchPosition

type TrimmedSliceRootPosition :: Type
data TrimmedSliceRootPosition

instance PolynomialFunctor DemoPolynomial where
  data Position DemoPolynomial position where
    RootWitness :: Position DemoPolynomial RootPosition
    BranchWitness :: Position DemoPolynomial BranchPosition
  type Direction DemoPolynomial RootPosition = Bool
  type Direction DemoPolynomial BranchPosition = Maybe Bool
  allPositions = [Exists RootWitness, Exists BranchWitness]

instance ParameterizedPolynomialFunctor DemoParameterizedPolynomial where
  type PolynomialParameter DemoParameterizedPolynomial = Bool

  data ParameterizedPosition DemoParameterizedPolynomial position where
    FullSliceRootWitness :: ParameterizedPosition DemoParameterizedPolynomial FullSliceRootPosition
    FullSliceBranchWitness :: ParameterizedPosition DemoParameterizedPolynomial FullSliceBranchPosition
    TrimmedSliceRootWitness :: ParameterizedPosition DemoParameterizedPolynomial TrimmedSliceRootPosition

  type ParameterizedDirection DemoParameterizedPolynomial FullSliceRootPosition = Bool
  type ParameterizedDirection DemoParameterizedPolynomial FullSliceBranchPosition = Maybe Bool
  type ParameterizedDirection DemoParameterizedPolynomial TrimmedSliceRootPosition = ()

  positionsAt includeBranch =
    if includeBranch
      then [Exists FullSliceRootWitness, Exists FullSliceBranchWitness]
      else [Exists TrimmedSliceRootWitness]