mirror of https://github.com/voidlizard/hbs2
dispatcher proto
This commit is contained in:
parent
19bbbe9191
commit
2ce898a9d0
|
@ -1,11 +1,90 @@
|
||||||
module TestAbstractDispatch where
|
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 ()
|
testAbstractDispatch :: IO ()
|
||||||
|
|
Loading…
Reference in New Issue