module Discord.Handle
  ( DiscordHandle(..)
  , HandleThreadId(..)
  ) where

import Control.Concurrent (ThreadId, Chan, MVar)
import qualified Data.Text as T

import Discord.Internal.Rest (RestChanHandle(..))
import Discord.Internal.Gateway (GatewayHandle(..), CacheHandle(..))

-- | Thread Ids marked by what type they are
data HandleThreadId = HandleThreadIdRest ThreadId
                      | HandleThreadIdCache ThreadId
                      | HandleThreadIdLogger ThreadId
                      | HandleThreadIdGateway ThreadId

data DiscordHandle = DiscordHandle
  { DiscordHandle -> RestChanHandle
discordHandleRestChan :: RestChanHandle
  , DiscordHandle -> GatewayHandle
discordHandleGateway :: GatewayHandle
  , DiscordHandle -> CacheHandle
discordHandleCache :: CacheHandle
  , DiscordHandle -> [HandleThreadId]
discordHandleThreads :: [HandleThreadId]
  , DiscordHandle -> Chan Text
discordHandleLog :: Chan T.Text
  , DiscordHandle -> MVar Text
discordHandleLibraryError :: MVar T.Text
  }