dispatcher proto

This commit is contained in:
Dmitry Zuikov 2023-01-15 09:59:41 +03:00
parent 19bbbe9191
commit 2ce898a9d0
1 changed files with 79 additions and 0 deletions

View File

@ -1,11 +1,90 @@
module TestAbstractDispatch where
import HBS2.Prelude
-- import HBS2.Net.Messaging
import Data.Maybe
import Data.ByteString (ByteString)
-- concrete type or typeclass ?
import Data.Kind
import Data.Word
import Data.Map (Map)
import Data.Map qualified as Map
-- import Data.Proxy
newtype Cookie = Cookie Word32
deriving stock (Eq,Ord)
data MessageWithCookie = MessageWithCookie Cookie ByteString
class IsMessageWithCookie msg where
encode :: msg -> MessageWithCookie
decode :: MessageWithCookie -> Maybe msg
-- ЧТО МЫ ХОТИМ:
-- СООБЩЕНИЯ РАЗНЫХ ТИПОВ, ДОБАВЛЯТЬ НЕЗАВИСИМО
--
-- ЗАЧЕМ: ХУЙ ЗНАЕТ НА САМОМ ДЕЛЕ
-- НО, ДОПУСТИМ, ХОТИМ НЕЗАВИСИМЫЕ ОБРАБОТЧИКИ ДЛЯ
-- КАЖДОГО ТИПА СООБЩЕНИЯ
--
-- ПОЧЕМУ МЫ ЭТОГО ХОТИМ:
--
-- ЧТО БЫ НЕ ДЕЛАТЬ ОДИН СЛОЖНЫЙ ОБРАБОТЧИК С БОЛЬШИМ СТЕЙТОМ
-- ТАКОЕ УЖЕ ДЕЛАЛИ, ТАМ ХУЙ НОГУ СЛОМИТ ПОТОМ ОТЛАЖИВАТЬ
-- НАДО СДЕЛАТЬ, ЧТО БЫ МОЖНО БЫЛО ОТЛАДИТЬ ПО КУСКАМ
-- ТЕМ БОЛЕЕ, ЧТО ОНИ ДРУГ ОТ ДРУГА НЕ ЗАВИСЯТ
--
-- КАК-ТО ОБЕСПЕЧИМ УНИКАЛЬНОСТЬ КУКИ ДЛЯ КАЖДОГО ТИПА
--
--
data Handler = forall a . Show a => Handler
{ decodeMsg :: ByteString -> Maybe a
, dispatch :: a -> ()
}
newtype Dispatcher = Dispatcher { actions :: Map Cookie Handler }
-- sendRequest :: forall m msg . (MonadIO m, IsEncoded msg, HasCookie msg) => Dispatcher m -> msg -> m ()
sendRequest :: forall m msg . (MonadIO m, IsMessageWithCookie msg) => msg -> m ()
sendRequest msg = do
let coockoo = encode msg
let wtfmap = mempty :: Map Cookie ()
-- send (serialize coockoo)
undefined
dispatcher :: MonadIO m => Dispatcher -> m ()
dispatcher d = do
-- получили нечто
-- вытащили куку
-- КАК БЛЯДЬ? МЫ НЕ ЗНАЕМ ТУТ, ЧТО ЭТО ЗА СООБЩЕНИЕ. ЭТО ЧТО - ПОЛУДЕКОДИРОВАННОЕ
-- СООБЩЕНИЕ)
let (MessageWithCookie coo bs) = undefined :: MessageWithCookie
-- поискали в мапе по куке
let found' = Map.lookup coo (actions d)
-- нашли обработчик
let found = fromJust found'
-- декодировали сообщение и пихнули в обработчик
let _ = let (Handler de dispatch) = found in dispatch (fromJust (de bs))
-- сработало: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--
-- мы не знаем конкретный тип сообщения и нам пох. обработчик обрабатывает,
-- мы тут обеспечиваем общий механизм диспечеризации: заводим сессии, ждём
-- прибиваем сессии, рулим куками
undefined
testAbstractDispatch :: IO ()