Skip to content

Instantly share code, notes, and snippets.

@kinda-neat
Last active July 4, 2020 04:12
Show Gist options
  • Save kinda-neat/64787213c50c7469cc40dc39095063f1 to your computer and use it in GitHub Desktop.
Save kinda-neat/64787213c50c7469cc40dc39095063f1 to your computer and use it in GitHub Desktop.
ThreeLayerCake
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FunctionalDependencies #-}
module Bot
( runMeInMain
) where
import Control.Monad.Identity
import Control.Monad.Reader
class (Monad m, MonadReader Env m) =>
AwaitMessage m p
| m -> p
where
awaitMessage :: m p
class (Monad m, MonadReader Env m, AwaitMessage m p) =>
ReplyToMessage m p
| p -> m
where
replyToMessage :: p -> m ()
data Bot
= VK
| Telegram
type Token = String
type ChatId = String
type UserId = String
data TelegramConfig =
TelegramConfig Token
data Env = Env
{ telegramConfig :: TelegramConfig
, val2 :: Int
}
newtype TelegramM a = TelegramM
{ unTelegramM :: ReaderT Env IO a
} deriving (Functor, Applicative, Monad, MonadIO, MonadReader Env)
newtype VKM a = VKM
{ unVKM :: ReaderT Env IO a
} deriving (Functor, Applicative, Monad, MonadIO, MonadReader Env)
data TelegramPayload =
TelegramPayload ChatId
UserId
instance ReplyToMessage TelegramM TelegramPayload where
replyToMessage (TelegramPayload chatId userId) = do
(TelegramConfig token) <- asks telegramConfig
pure ()
instance AwaitMessage TelegramM TelegramPayload where
awaitMessage = pure $ TelegramPayload "chatId" "userId"
instance ReplyToMessage VKM VKPayload where
replyToMessage vkString = do
yo <- asks val2
pure ()
instance AwaitMessage VKM VKPayload where
awaitMessage = pure $ VKPayload "chatId" "userId"
type DifferentField = Int
type SessionId = String
data VKConfig =
VKConfig Token
DifferentField
data VKPayload =
VKPayload SessionId
ChatId
app :: (AwaitMessage m p, ReplyToMessage m p) => m ()
app = do
msg <- awaitMessage
replyToMessage msg
runMeInMain :: Bot -> IO ()
runMeInMain bot =
case bot of
Telegram -> runReaderT (unTelegramM app) env
VK -> runReaderT (unVKM app) env
where
env = (Env {telegramConfig = TelegramConfig "token", val2 = 3})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment