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
|
||||
|
||||
|
||||
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 ()
|
||||
|
|
Loading…
Reference in New Issue