Я работаю над веб-приложением на основе мисо и пытаюсь обернуть модель (состояние) Transition Action InnerModel ()
в Transition Action ModelWrapper ()
, где
type Miso.Transition action model = StateT model (Writer [Sub action])
и data ModelWrapper = ClientModel Clients.Model | ...
к сожалению, я не могу найти способ изменить тип состояния или совсем не уверен, что мне делать.
Документация показывает, какзанимаюсь в основном с библиотекой линз.До сих пор я адаптировал такие вещи, как .=
, в Control.Monad.State.modify
, но не могу найти эквивалент zoom
, который мне нужен для выполнения вычисления с развернутой моделью в качестве состояния.
Я попробовал все следующее без удачи.самое близкое, что я получил, было с execStateT, но я не мог сохранить действия, так что это было бесполезно.
В приведенном ниже коде предприняты разные попытки справиться с ним и может обеспечить некоторый контекст.
updateModel ::
Action ->
Transition Action ModelWrapper ()
updateModel ac = case ac of
--ShowSection sect -> modify $ \mo -> mo{currentSection=sect}
--UpdateSubmodel submo -> modify $ \mo -> mo{sectionModel=submo}
UpdateSubmodel submo -> put submo
SectionAct sact -> case sact of
ActionClients clac -> do
gets $ \(ModelClients mo) -> mo
(Clients.updateModel sectionPipeback clac)
--return ()
--gets (\(ModelClients mo) -> mo)
--modify ModelClients
--modify $ \mo -> ModelClients mo
--ModelClients mo <- get
--let trans = (Clients.updateModel sectionPipeback clac)
-- w = execStateT trans mo
--put $ ModelClients mo
--let (clmo, acts) = runWriter $ execStateT trans mo
--let w = execStateT trans mo
--StateT (ModelClients $ execWriter w) w ()
--StateT (\ins -> writer )
--execStateT trans mo
--execStateT trans mo
--let (clmo, acts) = runWriter $ execStateT trans mo
--clmo <- lift $ execStateT trans mo
--put $ ModelClients clmo
--lift $ acts
--pure acts
--pure $ SeictionAct a
NoOp -> return ()