packages feed

witness-0.5: src/Data/Witness/WitnessValue.hs

module Data.Witness.WitnessValue where

import Data.Kind
import Data.Witness.Any

class WitnessValue (w :: k -> Type) where
    type WitnessValueType w :: Type
    witnessToValue :: forall (t :: k). w t -> WitnessValueType w
    valueToWitness :: forall r. WitnessValueType w -> (forall (t :: k). w t -> r) -> r

anyToValue ::
       forall k (w :: k -> Type). WitnessValue w
    => AnyW w
    -> WitnessValueType w
anyToValue (MkAnyW wt) = witnessToValue wt

valueToAny ::
       forall k (w :: k -> Type). WitnessValue w
    => WitnessValueType w
    -> AnyW w
valueToAny v = valueToWitness v MkAnyW