{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE FlexibleInstances  #-}

-- | Provides base types and utility functions needed for modules in Discord.Internal.Types
module Discord.Internal.Types.Prelude where

import Data.Bits
import Data.Word

import Data.Aeson.Types
import Data.Time.Clock
import qualified Data.Text as T
import Data.Time.Clock.POSIX
import Control.Monad (mzero)

import Data.Functor.Compose (Compose(Compose, getCompose))
import Data.Bifunctor (first)
import Text.Read (readMaybe)
import Data.Data (Data (dataTypeOf), dataTypeConstrs, fromConstr)
import Data.Maybe (fromJust)

-- | Authorization token for the Discord API
data Auth = Auth T.Text
  deriving (Int -> Auth -> ShowS
[Auth] -> ShowS
Auth -> String
(Int -> Auth -> ShowS)
-> (Auth -> String) -> ([Auth] -> ShowS) -> Show Auth
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Auth] -> ShowS
$cshowList :: [Auth] -> ShowS
show :: Auth -> String
$cshow :: Auth -> String
showsPrec :: Int -> Auth -> ShowS
$cshowsPrec :: Int -> Auth -> ShowS
Show, ReadPrec [Auth]
ReadPrec Auth
Int -> ReadS Auth
ReadS [Auth]
(Int -> ReadS Auth)
-> ReadS [Auth] -> ReadPrec Auth -> ReadPrec [Auth] -> Read Auth
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Auth]
$creadListPrec :: ReadPrec [Auth]
readPrec :: ReadPrec Auth
$creadPrec :: ReadPrec Auth
readList :: ReadS [Auth]
$creadList :: ReadS [Auth]
readsPrec :: Int -> ReadS Auth
$creadsPrec :: Int -> ReadS Auth
Read, Auth -> Auth -> Bool
(Auth -> Auth -> Bool) -> (Auth -> Auth -> Bool) -> Eq Auth
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Auth -> Auth -> Bool
$c/= :: Auth -> Auth -> Bool
== :: Auth -> Auth -> Bool
$c== :: Auth -> Auth -> Bool
Eq, Eq Auth
Eq Auth
-> (Auth -> Auth -> Ordering)
-> (Auth -> Auth -> Bool)
-> (Auth -> Auth -> Bool)
-> (Auth -> Auth -> Bool)
-> (Auth -> Auth -> Bool)
-> (Auth -> Auth -> Auth)
-> (Auth -> Auth -> Auth)
-> Ord Auth
Auth -> Auth -> Bool
Auth -> Auth -> Ordering
Auth -> Auth -> Auth
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Auth -> Auth -> Auth
$cmin :: Auth -> Auth -> Auth
max :: Auth -> Auth -> Auth
$cmax :: Auth -> Auth -> Auth
>= :: Auth -> Auth -> Bool
$c>= :: Auth -> Auth -> Bool
> :: Auth -> Auth -> Bool
$c> :: Auth -> Auth -> Bool
<= :: Auth -> Auth -> Bool
$c<= :: Auth -> Auth -> Bool
< :: Auth -> Auth -> Bool
$c< :: Auth -> Auth -> Bool
compare :: Auth -> Auth -> Ordering
$ccompare :: Auth -> Auth -> Ordering
$cp1Ord :: Eq Auth
Ord)


-- | Get the raw token formatted for use with the websocket gateway
authToken :: Auth -> T.Text
authToken :: Auth -> Text
authToken (Auth Text
tok) = let token :: Text
token = Text -> Text
T.strip Text
tok
                           bot :: Text
bot = if Text
"Bot " Text -> Text -> Bool
`T.isPrefixOf` Text
token then Text
"" else Text
"Bot "
                       in Text
bot Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
token

-- | A unique integer identifier. Can be used to calculate the creation date of an entity.
newtype Snowflake = Snowflake Word64
  deriving (Eq Snowflake
Eq Snowflake
-> (Snowflake -> Snowflake -> Ordering)
-> (Snowflake -> Snowflake -> Bool)
-> (Snowflake -> Snowflake -> Bool)
-> (Snowflake -> Snowflake -> Bool)
-> (Snowflake -> Snowflake -> Bool)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> Ord Snowflake
Snowflake -> Snowflake -> Bool
Snowflake -> Snowflake -> Ordering
Snowflake -> Snowflake -> Snowflake
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Snowflake -> Snowflake -> Snowflake
$cmin :: Snowflake -> Snowflake -> Snowflake
max :: Snowflake -> Snowflake -> Snowflake
$cmax :: Snowflake -> Snowflake -> Snowflake
>= :: Snowflake -> Snowflake -> Bool
$c>= :: Snowflake -> Snowflake -> Bool
> :: Snowflake -> Snowflake -> Bool
$c> :: Snowflake -> Snowflake -> Bool
<= :: Snowflake -> Snowflake -> Bool
$c<= :: Snowflake -> Snowflake -> Bool
< :: Snowflake -> Snowflake -> Bool
$c< :: Snowflake -> Snowflake -> Bool
compare :: Snowflake -> Snowflake -> Ordering
$ccompare :: Snowflake -> Snowflake -> Ordering
$cp1Ord :: Eq Snowflake
Ord, Snowflake -> Snowflake -> Bool
(Snowflake -> Snowflake -> Bool)
-> (Snowflake -> Snowflake -> Bool) -> Eq Snowflake
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Snowflake -> Snowflake -> Bool
$c/= :: Snowflake -> Snowflake -> Bool
== :: Snowflake -> Snowflake -> Bool
$c== :: Snowflake -> Snowflake -> Bool
Eq, Integer -> Snowflake
Snowflake -> Snowflake
Snowflake -> Snowflake -> Snowflake
(Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake)
-> (Snowflake -> Snowflake)
-> (Snowflake -> Snowflake)
-> (Integer -> Snowflake)
-> Num Snowflake
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> Snowflake
$cfromInteger :: Integer -> Snowflake
signum :: Snowflake -> Snowflake
$csignum :: Snowflake -> Snowflake
abs :: Snowflake -> Snowflake
$cabs :: Snowflake -> Snowflake
negate :: Snowflake -> Snowflake
$cnegate :: Snowflake -> Snowflake
* :: Snowflake -> Snowflake -> Snowflake
$c* :: Snowflake -> Snowflake -> Snowflake
- :: Snowflake -> Snowflake -> Snowflake
$c- :: Snowflake -> Snowflake -> Snowflake
+ :: Snowflake -> Snowflake -> Snowflake
$c+ :: Snowflake -> Snowflake -> Snowflake
Num, Enum Snowflake
Real Snowflake
Real Snowflake
-> Enum Snowflake
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> (Snowflake, Snowflake))
-> (Snowflake -> Snowflake -> (Snowflake, Snowflake))
-> (Snowflake -> Integer)
-> Integral Snowflake
Snowflake -> Integer
Snowflake -> Snowflake -> (Snowflake, Snowflake)
Snowflake -> Snowflake -> Snowflake
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: Snowflake -> Integer
$ctoInteger :: Snowflake -> Integer
divMod :: Snowflake -> Snowflake -> (Snowflake, Snowflake)
$cdivMod :: Snowflake -> Snowflake -> (Snowflake, Snowflake)
quotRem :: Snowflake -> Snowflake -> (Snowflake, Snowflake)
$cquotRem :: Snowflake -> Snowflake -> (Snowflake, Snowflake)
mod :: Snowflake -> Snowflake -> Snowflake
$cmod :: Snowflake -> Snowflake -> Snowflake
div :: Snowflake -> Snowflake -> Snowflake
$cdiv :: Snowflake -> Snowflake -> Snowflake
rem :: Snowflake -> Snowflake -> Snowflake
$crem :: Snowflake -> Snowflake -> Snowflake
quot :: Snowflake -> Snowflake -> Snowflake
$cquot :: Snowflake -> Snowflake -> Snowflake
$cp2Integral :: Enum Snowflake
$cp1Integral :: Real Snowflake
Integral, Int -> Snowflake
Snowflake -> Int
Snowflake -> [Snowflake]
Snowflake -> Snowflake
Snowflake -> Snowflake -> [Snowflake]
Snowflake -> Snowflake -> Snowflake -> [Snowflake]
(Snowflake -> Snowflake)
-> (Snowflake -> Snowflake)
-> (Int -> Snowflake)
-> (Snowflake -> Int)
-> (Snowflake -> [Snowflake])
-> (Snowflake -> Snowflake -> [Snowflake])
-> (Snowflake -> Snowflake -> [Snowflake])
-> (Snowflake -> Snowflake -> Snowflake -> [Snowflake])
-> Enum Snowflake
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Snowflake -> Snowflake -> Snowflake -> [Snowflake]
$cenumFromThenTo :: Snowflake -> Snowflake -> Snowflake -> [Snowflake]
enumFromTo :: Snowflake -> Snowflake -> [Snowflake]
$cenumFromTo :: Snowflake -> Snowflake -> [Snowflake]
enumFromThen :: Snowflake -> Snowflake -> [Snowflake]
$cenumFromThen :: Snowflake -> Snowflake -> [Snowflake]
enumFrom :: Snowflake -> [Snowflake]
$cenumFrom :: Snowflake -> [Snowflake]
fromEnum :: Snowflake -> Int
$cfromEnum :: Snowflake -> Int
toEnum :: Int -> Snowflake
$ctoEnum :: Int -> Snowflake
pred :: Snowflake -> Snowflake
$cpred :: Snowflake -> Snowflake
succ :: Snowflake -> Snowflake
$csucc :: Snowflake -> Snowflake
Enum, Num Snowflake
Ord Snowflake
Num Snowflake
-> Ord Snowflake -> (Snowflake -> Rational) -> Real Snowflake
Snowflake -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: Snowflake -> Rational
$ctoRational :: Snowflake -> Rational
$cp2Real :: Ord Snowflake
$cp1Real :: Num Snowflake
Real, Eq Snowflake
Snowflake
Eq Snowflake
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake -> Snowflake)
-> (Snowflake -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> Snowflake
-> (Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Bool)
-> (Snowflake -> Maybe Int)
-> (Snowflake -> Int)
-> (Snowflake -> Bool)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int -> Snowflake)
-> (Snowflake -> Int)
-> Bits Snowflake
Int -> Snowflake
Snowflake -> Bool
Snowflake -> Int
Snowflake -> Maybe Int
Snowflake -> Snowflake
Snowflake -> Int -> Bool
Snowflake -> Int -> Snowflake
Snowflake -> Snowflake -> Snowflake
forall a.
Eq a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
popCount :: Snowflake -> Int
$cpopCount :: Snowflake -> Int
rotateR :: Snowflake -> Int -> Snowflake
$crotateR :: Snowflake -> Int -> Snowflake
rotateL :: Snowflake -> Int -> Snowflake
$crotateL :: Snowflake -> Int -> Snowflake
unsafeShiftR :: Snowflake -> Int -> Snowflake
$cunsafeShiftR :: Snowflake -> Int -> Snowflake
shiftR :: Snowflake -> Int -> Snowflake
$cshiftR :: Snowflake -> Int -> Snowflake
unsafeShiftL :: Snowflake -> Int -> Snowflake
$cunsafeShiftL :: Snowflake -> Int -> Snowflake
shiftL :: Snowflake -> Int -> Snowflake
$cshiftL :: Snowflake -> Int -> Snowflake
isSigned :: Snowflake -> Bool
$cisSigned :: Snowflake -> Bool
bitSize :: Snowflake -> Int
$cbitSize :: Snowflake -> Int
bitSizeMaybe :: Snowflake -> Maybe Int
$cbitSizeMaybe :: Snowflake -> Maybe Int
testBit :: Snowflake -> Int -> Bool
$ctestBit :: Snowflake -> Int -> Bool
complementBit :: Snowflake -> Int -> Snowflake
$ccomplementBit :: Snowflake -> Int -> Snowflake
clearBit :: Snowflake -> Int -> Snowflake
$cclearBit :: Snowflake -> Int -> Snowflake
setBit :: Snowflake -> Int -> Snowflake
$csetBit :: Snowflake -> Int -> Snowflake
bit :: Int -> Snowflake
$cbit :: Int -> Snowflake
zeroBits :: Snowflake
$czeroBits :: Snowflake
rotate :: Snowflake -> Int -> Snowflake
$crotate :: Snowflake -> Int -> Snowflake
shift :: Snowflake -> Int -> Snowflake
$cshift :: Snowflake -> Int -> Snowflake
complement :: Snowflake -> Snowflake
$ccomplement :: Snowflake -> Snowflake
xor :: Snowflake -> Snowflake -> Snowflake
$cxor :: Snowflake -> Snowflake -> Snowflake
.|. :: Snowflake -> Snowflake -> Snowflake
$c.|. :: Snowflake -> Snowflake -> Snowflake
.&. :: Snowflake -> Snowflake -> Snowflake
$c.&. :: Snowflake -> Snowflake -> Snowflake
$cp1Bits :: Eq Snowflake
Bits)

instance Show Snowflake where
  show :: Snowflake -> String
show (Snowflake Word64
a) = Word64 -> String
forall a. Show a => a -> String
show Word64
a

instance Read Snowflake where
  readsPrec :: Int -> ReadS Snowflake
readsPrec Int
p = Compose ((->) String) [] (Snowflake, String) -> ReadS Snowflake
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose (Compose ((->) String) [] (Snowflake, String) -> ReadS Snowflake)
-> Compose ((->) String) [] (Snowflake, String) -> ReadS Snowflake
forall a b. (a -> b) -> a -> b
$ (Word64 -> Snowflake) -> (Word64, String) -> (Snowflake, String)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first Word64 -> Snowflake
Snowflake ((Word64, String) -> (Snowflake, String))
-> Compose ((->) String) [] (Word64, String)
-> Compose ((->) String) [] (Snowflake, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> [(Word64, String)])
-> Compose ((->) String) [] (Word64, String)
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (Int -> String -> [(Word64, String)]
forall a. Read a => Int -> ReadS a
readsPrec Int
p)

instance ToJSON Snowflake where
  toJSON :: Snowflake -> Value
toJSON (Snowflake Word64
snowflake) = Text -> Value
String (Text -> Value) -> (String -> Text) -> String -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ Word64 -> String
forall a. Show a => a -> String
show Word64
snowflake

instance FromJSON Snowflake where
  parseJSON :: Value -> Parser Snowflake
parseJSON (String Text
snowflake) = case String -> Maybe Snowflake
forall a. Read a => String -> Maybe a
readMaybe (Text -> String
T.unpack Text
snowflake) of
    Maybe Snowflake
Nothing -> String -> Parser Snowflake
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"null snowflake"
    (Just Snowflake
i) -> Snowflake -> Parser Snowflake
forall (f :: * -> *) a. Applicative f => a -> f a
pure Snowflake
i
  parseJSON Value
_ = Parser Snowflake
forall (m :: * -> *) a. MonadPlus m => m a
mzero

type ChannelId = Snowflake
type StageId = Snowflake
type GuildId = Snowflake
type MessageId = Snowflake
type AttachmentId = Snowflake
type EmojiId = Snowflake
type StickerId = Snowflake
type UserId = Snowflake
type OverwriteId = Snowflake
type RoleId = Snowflake
type IntegrationId = Snowflake
type WebhookId = Snowflake
type ParentId = Snowflake
type ApplicationId = Snowflake 
type ApplicationCommandId = Snowflake
type InteractionId = Snowflake
type InteractionToken = T.Text
type Shard = (Int, Int)

-- | Gets a creation date from a snowflake.
snowflakeCreationDate :: Snowflake -> UTCTime
snowflakeCreationDate :: Snowflake -> UTCTime
snowflakeCreationDate Snowflake
x = POSIXTime -> UTCTime
posixSecondsToUTCTime (POSIXTime -> UTCTime)
-> (Snowflake -> POSIXTime) -> Snowflake -> UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Snowflake -> POSIXTime
forall a b. (Real a, Fractional b) => a -> b
realToFrac
  (Snowflake -> UTCTime) -> Snowflake -> UTCTime
forall a b. (a -> b) -> a -> b
$ Snowflake
1420070400 Snowflake -> Snowflake -> Snowflake
forall a. Num a => a -> a -> a
+ Snowflake -> Snowflake -> Snowflake
forall a. Integral a => a -> a -> a
quot (Snowflake -> Int -> Snowflake
forall a. Bits a => a -> Int -> a
shiftR Snowflake
x Int
22) Snowflake
1000

-- | Default timestamp
epochTime :: UTCTime
epochTime :: UTCTime
epochTime = POSIXTime -> UTCTime
posixSecondsToUTCTime POSIXTime
0

type ColorInteger = Integer

makeTable :: (Data t, Enum t) => t -> [(Int, t)]
makeTable :: t -> [(Int, t)]
makeTable t
t = (Constr -> (Int, t)) -> [Constr] -> [(Int, t)]
forall a b. (a -> b) -> [a] -> [b]
map (\Constr
cData -> let c :: t
c = Constr -> t
forall a. Data a => Constr -> a
fromConstr Constr
cData in (t -> Int
forall a. Enum a => a -> Int
fromEnum t
c, t
c)) (DataType -> [Constr]
dataTypeConstrs (DataType -> [Constr]) -> DataType -> [Constr]
forall a b. (a -> b) -> a -> b
$ t -> DataType
forall a. Data a => a -> DataType
dataTypeOf t
t)

toMaybeJSON :: (ToJSON a) => a -> Maybe Value
toMaybeJSON :: a -> Maybe Value
toMaybeJSON = Value -> Maybe Value
forall (m :: * -> *) a. Monad m => a -> m a
return (Value -> Maybe Value) -> (a -> Value) -> a -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Value
forall a. ToJSON a => a -> Value
toJSON

-- | What type of interaction has a user requested? Each requires its own type
-- of response.
data InteractionType
  = InteractionTypePing
  | InteractionTypeApplicationCommand
  | InteractionTypeMessageComponent
  | InteractionTypeApplicationCommandAutocomplete
  deriving (Int -> InteractionType -> ShowS
[InteractionType] -> ShowS
InteractionType -> String
(Int -> InteractionType -> ShowS)
-> (InteractionType -> String)
-> ([InteractionType] -> ShowS)
-> Show InteractionType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InteractionType] -> ShowS
$cshowList :: [InteractionType] -> ShowS
show :: InteractionType -> String
$cshow :: InteractionType -> String
showsPrec :: Int -> InteractionType -> ShowS
$cshowsPrec :: Int -> InteractionType -> ShowS
Show, ReadPrec [InteractionType]
ReadPrec InteractionType
Int -> ReadS InteractionType
ReadS [InteractionType]
(Int -> ReadS InteractionType)
-> ReadS [InteractionType]
-> ReadPrec InteractionType
-> ReadPrec [InteractionType]
-> Read InteractionType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [InteractionType]
$creadListPrec :: ReadPrec [InteractionType]
readPrec :: ReadPrec InteractionType
$creadPrec :: ReadPrec InteractionType
readList :: ReadS [InteractionType]
$creadList :: ReadS [InteractionType]
readsPrec :: Int -> ReadS InteractionType
$creadsPrec :: Int -> ReadS InteractionType
Read, Typeable InteractionType
DataType
Constr
Typeable InteractionType
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> InteractionType -> c InteractionType)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c InteractionType)
-> (InteractionType -> Constr)
-> (InteractionType -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c InteractionType))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c InteractionType))
-> ((forall b. Data b => b -> b)
    -> InteractionType -> InteractionType)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> InteractionType -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> InteractionType -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> InteractionType -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> InteractionType -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> InteractionType -> m InteractionType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> InteractionType -> m InteractionType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> InteractionType -> m InteractionType)
-> Data InteractionType
InteractionType -> DataType
InteractionType -> Constr
(forall b. Data b => b -> b) -> InteractionType -> InteractionType
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InteractionType -> c InteractionType
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InteractionType
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> InteractionType -> u
forall u. (forall d. Data d => d -> u) -> InteractionType -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InteractionType
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InteractionType -> c InteractionType
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c InteractionType)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InteractionType)
$cInteractionTypeApplicationCommandAutocomplete :: Constr
$cInteractionTypeMessageComponent :: Constr
$cInteractionTypeApplicationCommand :: Constr
$cInteractionTypePing :: Constr
$tInteractionType :: DataType
gmapMo :: (forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
gmapMp :: (forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
gmapM :: (forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> InteractionType -> m InteractionType
gmapQi :: Int -> (forall d. Data d => d -> u) -> InteractionType -> u
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> InteractionType -> u
gmapQ :: (forall d. Data d => d -> u) -> InteractionType -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> InteractionType -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InteractionType -> r
gmapT :: (forall b. Data b => b -> b) -> InteractionType -> InteractionType
$cgmapT :: (forall b. Data b => b -> b) -> InteractionType -> InteractionType
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InteractionType)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InteractionType)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c InteractionType)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c InteractionType)
dataTypeOf :: InteractionType -> DataType
$cdataTypeOf :: InteractionType -> DataType
toConstr :: InteractionType -> Constr
$ctoConstr :: InteractionType -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InteractionType
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InteractionType
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InteractionType -> c InteractionType
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InteractionType -> c InteractionType
$cp1Data :: Typeable InteractionType
Data, InteractionType -> InteractionType -> Bool
(InteractionType -> InteractionType -> Bool)
-> (InteractionType -> InteractionType -> Bool)
-> Eq InteractionType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InteractionType -> InteractionType -> Bool
$c/= :: InteractionType -> InteractionType -> Bool
== :: InteractionType -> InteractionType -> Bool
$c== :: InteractionType -> InteractionType -> Bool
Eq, Eq InteractionType
Eq InteractionType
-> (InteractionType -> InteractionType -> Ordering)
-> (InteractionType -> InteractionType -> Bool)
-> (InteractionType -> InteractionType -> Bool)
-> (InteractionType -> InteractionType -> Bool)
-> (InteractionType -> InteractionType -> Bool)
-> (InteractionType -> InteractionType -> InteractionType)
-> (InteractionType -> InteractionType -> InteractionType)
-> Ord InteractionType
InteractionType -> InteractionType -> Bool
InteractionType -> InteractionType -> Ordering
InteractionType -> InteractionType -> InteractionType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: InteractionType -> InteractionType -> InteractionType
$cmin :: InteractionType -> InteractionType -> InteractionType
max :: InteractionType -> InteractionType -> InteractionType
$cmax :: InteractionType -> InteractionType -> InteractionType
>= :: InteractionType -> InteractionType -> Bool
$c>= :: InteractionType -> InteractionType -> Bool
> :: InteractionType -> InteractionType -> Bool
$c> :: InteractionType -> InteractionType -> Bool
<= :: InteractionType -> InteractionType -> Bool
$c<= :: InteractionType -> InteractionType -> Bool
< :: InteractionType -> InteractionType -> Bool
$c< :: InteractionType -> InteractionType -> Bool
compare :: InteractionType -> InteractionType -> Ordering
$ccompare :: InteractionType -> InteractionType -> Ordering
$cp1Ord :: Eq InteractionType
Ord)

instance Enum InteractionType where
  fromEnum :: InteractionType -> Int
fromEnum InteractionType
InteractionTypePing = Int
1
  fromEnum InteractionType
InteractionTypeApplicationCommand = Int
2
  fromEnum InteractionType
InteractionTypeMessageComponent = Int
3
  fromEnum InteractionType
InteractionTypeApplicationCommandAutocomplete = Int
4
  toEnum :: Int -> InteractionType
toEnum Int
a = Maybe InteractionType -> InteractionType
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe InteractionType -> InteractionType)
-> Maybe InteractionType -> InteractionType
forall a b. (a -> b) -> a -> b
$ Int -> [(Int, InteractionType)] -> Maybe InteractionType
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Int
a [(Int, InteractionType)]
table
    where
      table :: [(Int, InteractionType)]
table = InteractionType -> [(Int, InteractionType)]
forall t. (Data t, Enum t) => t -> [(Int, t)]
makeTable InteractionType
InteractionTypePing

instance ToJSON InteractionType where
  toJSON :: InteractionType -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value)
-> (InteractionType -> Int) -> InteractionType -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InteractionType -> Int
forall a. Enum a => a -> Int
fromEnum

instance FromJSON InteractionType where
  parseJSON :: Value -> Parser InteractionType
parseJSON = String
-> (Scientific -> Parser InteractionType)
-> Value
-> Parser InteractionType
forall a. String -> (Scientific -> Parser a) -> Value -> Parser a
withScientific String
"InteractionType" (InteractionType -> Parser InteractionType
forall (m :: * -> *) a. Monad m => a -> m a
return (InteractionType -> Parser InteractionType)
-> (Scientific -> InteractionType)
-> Scientific
-> Parser InteractionType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> InteractionType
forall a. Enum a => Int -> a
toEnum (Int -> InteractionType)
-> (Scientific -> Int) -> Scientific -> InteractionType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round)

class Internals a b where
  toInternal :: a -> b
  fromInternal :: b -> Maybe a

instance Internals a a where
  toInternal :: a -> a
toInternal = a -> a
forall a. a -> a
id
  fromInternal :: a -> Maybe a
fromInternal = a -> Maybe a
forall a. a -> Maybe a
Just