{-# LANGUAGE ScopedTypeVariables #-}

module Temporal.Workflow.Signal where

import Data.Kind
import Data.Text (Text)
import Temporal.Payload


data KnownSignal (args :: [Type]) = forall codec.
  (ApplyPayloads codec args, GatherArgs codec args) =>
  KnownSignal
  { forall (args :: [*]). KnownSignal args -> Text
signalName :: Text
  , ()
signalCodec :: codec
  }


class SignalRef sig where
  type SignalArgs sig :: [Type]
  signalRef :: sig -> KnownSignal (SignalArgs sig)


instance SignalRef (KnownSignal args) where
  type SignalArgs (KnownSignal args) = args
  signalRef :: KnownSignal args -> KnownSignal (SignalArgs (KnownSignal args))
signalRef = KnownSignal args -> KnownSignal args
KnownSignal args -> KnownSignal (SignalArgs (KnownSignal args))
forall a. a -> a
id