{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.App.Internal.Resolving.Event
  ( EventHandler (..),
    ResponseEvent (..),
  )
where

import Data.Kind (Type)
import Data.Morpheus.Types.IO
  ( GQLResponse,
  )

class EventHandler e where
  type Channel e
  getChannels :: e -> [Channel e]

data ResponseEvent event (m :: Type -> Type)
  = Publish event
  | Subscribe
      { ResponseEvent event m -> Channel event
subChannel :: Channel event,
        ResponseEvent event m -> event -> m GQLResponse
subRes :: event -> m GQLResponse
      }