packages feed

moonlight-algebra-0.1.0.0: src-laws/Moonlight/Algebra/Effect/LawNames.hs

{-# LANGUAGE DerivingStrategies #-}

module Moonlight.Algebra.Effect.LawNames
  ( LawName (..),
    lawName,
    CommonLawName (..),
    IsLawName (..),
    constructorLawNameWithOverrides,
  )
where

import Data.Kind (Type)
import Moonlight.Core (CommonLawName (..), IsLawName (..), constructorLawNameWithOverrides)

type LawName :: Type
data LawName
  = MonoidAssoc
  | MonoidLeftId
  | MonoidRightId
  | GroupInvLeft
  | GroupInvRight
  | AbelianComm
  | RingAddAssoc
  | RingMulComm
  | CommonLaw CommonLawName
  | ModuleDistribScalarAdd
  | ModuleDistribVectorAdd
  | HeytingImpliesSelfTop
  | HeytingMeetImplication
  | HeytingConsequentMeetImplication
  | HeytingImplicationDistributesMeet
  | HeytingNegDefault
  | HeytingEquivalenceDefault
  | GcdDividesLeft
  | GcdDividesRight
  | ExtGcdBezout
  | ModInverseCorrect
  | ModInverseAbsentNonunit
  | CrtSound
  | UnitInverseOne
  | UnitInverseCorrect
  | UnitInverseAbsent
  | FreeMonoidAssoc
  | FreeMonoidLeftId
  | FreeMonoidRightId
  | PolynomialCanonicalizationIdempotent
  | ZnGeneratorNormalized
  | PolynomialGeneratorCanonical
  | FreeAbelianGeneratorCanonical
  | SparseVecGeneratorCanonical
  | PowerSetGeneratorCanonical
  | LaneVectorSubtraction
  | OrientationGroupInvLeft
  | OrientationGroupInvRight
  | OrientationAbelianComm
  deriving stock (Eq, Ord, Show)

lawName :: LawName -> String
lawName lawNameValue =
  case lawNameValue of
    CommonLaw commonLawName -> lawNameText commonLawName
    specificLawName -> constructorLawNameWithOverrides [("PowerSetGeneratorCanonical", "powerset_generator_canonical")] (show specificLawName)

instance IsLawName LawName where
  lawNameText = lawName