packages feed

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

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

import qualified Moonlight.Category.Effect.Harness as Harness
import Moonlight.Category.Effect.LawNames (LawName (..))
import Moonlight.Category.Effect.Laws.Generators
  ( SampleUnitMorphism (..),
    SampleUnitObject (..),
  )
import Moonlight.Category.Pure.Unit (UnitCat (..), UnitMor (..))
import Moonlight.Pale.Test.Laws.Suite (LawSuite, lawGroup, namedQuickCheckLaw)

productProj1Prop :: SampleUnitObject -> Bool
productProj1Prop (SampleUnitObject productObject) =
  Harness.productProjection1 @UnitCat UnitCat productObject UnitMor UnitMor

productProj2Prop :: SampleUnitObject -> Bool
productProj2Prop (SampleUnitObject productObject) =
  Harness.productProjection2 @UnitCat UnitCat productObject UnitMor UnitMor

coproductInj1Prop :: SampleUnitObject -> Bool
coproductInj1Prop (SampleUnitObject coproductObject) =
  Harness.coproductInjection1 @UnitCat UnitCat coproductObject UnitMor UnitMor

coproductInj2Prop :: SampleUnitObject -> Bool
coproductInj2Prop (SampleUnitObject coproductObject) =
  Harness.coproductInjection2 @UnitCat UnitCat coproductObject UnitMor UnitMor

pullbackProp :: SampleUnitMorphism -> Bool
pullbackProp (SampleUnitMorphism morphism) =
  Harness.pullbackCommutative @UnitCat UnitCat morphism morphism

pushoutProp :: SampleUnitMorphism -> Bool
pushoutProp (SampleUnitMorphism morphism) =
  Harness.pushoutCommutative @UnitCat UnitCat morphism morphism

equalizerProp :: SampleUnitMorphism -> Bool
equalizerProp (SampleUnitMorphism morphism) =
  Harness.equalizerCommutative @UnitCat UnitCat morphism morphism

coequalizerProp :: SampleUnitMorphism -> Bool
coequalizerProp (SampleUnitMorphism morphism) =
  Harness.coequalizerCommutative @UnitCat UnitCat morphism morphism

lawSuites :: [LawSuite]
lawSuites =
  [ lawGroup
      "limits"
      [ namedQuickCheckLaw ProductProj1 productProj1Prop,
        namedQuickCheckLaw ProductProj2 productProj2Prop,
        namedQuickCheckLaw CoproductInj1 coproductInj1Prop,
        namedQuickCheckLaw CoproductInj2 coproductInj2Prop,
        namedQuickCheckLaw PullbackCommutes pullbackProp,
        namedQuickCheckLaw PushoutCommutes pushoutProp,
        namedQuickCheckLaw EqualizerCommutes equalizerProp,
        namedQuickCheckLaw CoequalizerCommutes coequalizerProp
      ]
  ]