packages feed

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

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}

module Moonlight.Category.Test.CoveringFixture
  ( DemoField (..),
    DemoFieldWitness (..),
    DemoSubsetWitness (..),
    embedDemoSubsetWitness,
    sameDemoFieldWitness,
  )
where

import Data.Kind (Type)
import Data.Type.Equality ((:~:) (Refl))
import Moonlight.Category.Pure.CoveringFamily (CoveringFamily (..), Exists (..))

type DemoField :: Type
data DemoField
  = AlphaField
  | BetaField
  | GammaField

type DemoFieldWitness :: DemoField -> Type
data DemoFieldWitness field where
  AlphaFieldWitness :: DemoFieldWitness 'AlphaField
  BetaFieldWitness :: DemoFieldWitness 'BetaField
  GammaFieldWitness :: DemoFieldWitness 'GammaField

type DemoSubsetWitness :: DemoField -> Type
data DemoSubsetWitness field where
  AlphaSubsetWitness :: DemoSubsetWitness 'AlphaField
  GammaSubsetWitness :: DemoSubsetWitness 'GammaField

instance CoveringFamily DemoFieldWitness where
  allMembers =
    [ Exists AlphaFieldWitness,
      Exists BetaFieldWitness,
      Exists GammaFieldWitness
    ]

instance CoveringFamily DemoSubsetWitness where
  allMembers =
    [ Exists AlphaSubsetWitness,
      Exists GammaSubsetWitness
    ]

sameDemoFieldWitness ::
  DemoFieldWitness left ->
  DemoFieldWitness right ->
  Maybe (left :~: right)
sameDemoFieldWitness leftWitness rightWitness =
  case (leftWitness, rightWitness) of
    (AlphaFieldWitness, AlphaFieldWitness) -> Just Refl
    (BetaFieldWitness, BetaFieldWitness) -> Just Refl
    (GammaFieldWitness, GammaFieldWitness) -> Just Refl
    _ -> Nothing

embedDemoSubsetWitness ::
  DemoSubsetWitness field ->
  DemoFieldWitness field
embedDemoSubsetWitness subsetWitness =
  case subsetWitness of
    AlphaSubsetWitness -> AlphaFieldWitness
    GammaSubsetWitness -> GammaFieldWitness