packages feed

moonlight-category-0.1.0.0: src-laws/Moonlight/Category/Effect/Laws/Algebra.hs

module Moonlight.Category.Effect.Laws.Algebra
  ( lawSuites,
  )
where

import qualified Moonlight.Category.Effect.Harness as Harness
import Moonlight.Category.Effect.LawNames (LawName (..))
import Moonlight.Category.Effect.Laws.Generators
  ( SampleOrdinalLower (..),
    SampleOrdinalUpper (..),
  )
import Moonlight.Category.Pure.Poset
  ( OrdinalLower,
    OrdinalUpper,
  )
import Moonlight.Pale.Test.Laws.Suite (LawSuite, lawGroup, namedQuickCheckLaw)

galoisAdjointProp :: SampleOrdinalLower -> SampleOrdinalUpper -> Bool
galoisAdjointProp (SampleOrdinalLower leftValue) (SampleOrdinalUpper rightValue) =
  Harness.galoisAdjoint @OrdinalLower @OrdinalUpper leftValue rightValue

galoisDeflationProp :: SampleOrdinalUpper -> Bool
galoisDeflationProp (SampleOrdinalUpper rightValue) =
  Harness.galoisDeflation @OrdinalLower @OrdinalUpper rightValue

galoisInflationProp :: SampleOrdinalLower -> Bool
galoisInflationProp (SampleOrdinalLower leftValue) =
  Harness.galoisInflation @OrdinalLower @OrdinalUpper leftValue

galoisRetractionProp :: SampleOrdinalLower -> Bool
galoisRetractionProp (SampleOrdinalLower leftValue) =
  Harness.galoisRetraction @OrdinalLower @OrdinalUpper leftValue

ordinalMonotoneProp :: Bool
ordinalMonotoneProp = Harness.ordinalGaloisMonotone @OrdinalLower @OrdinalUpper

lawSuites :: [LawSuite]
lawSuites =
  [ lawGroup
      "galois"
      [ namedQuickCheckLaw GaloisAdjoint galoisAdjointProp,
        namedQuickCheckLaw GaloisDeflation galoisDeflationProp,
        namedQuickCheckLaw GaloisInflation galoisInflationProp,
        namedQuickCheckLaw GaloisRetraction galoisRetractionProp,
        namedQuickCheckLaw OrdinalGaloisMonotone ordinalMonotoneProp
      ]
  ]