Не могу выйти из рекурсии в рефлекс-домене
Код компилируется, но при запуске застревает в бесконечном рекурсивном цикле. Непонятно, куда входит цикл, особенно при использовании рекурсивного do или monadfix. При попытке отладки в браузере он находит циклическую оценку в fixIO в строке 6086 rts.js.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecursiveDo #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE MonoLocalBinds #-}
import Reflex.Dom
import qualified Data.Text as T
main :: IO ()
main = mainWidget game
game :: MonadWidget t m => m ()
game = elClass "div" "game" $ do
elClass "div" "game-board" $ do
rec
stateEv <- board stateEv [["","",""],["","",""],["","",""]]
elClass "div" "game-info" $ do
elClass "div" "statu" $ blank
elClass "ol" "todo" $ blank
board :: MonadWidget t m
=> [[Event t T.Text]]
-> [[T.Text]]
-> m [[(Event t T.Text)]]
board s iss = elClass "div" "board" $ do
el "div" $ do
elClass "div" "status" $ text "Next player: X"
mapM (boardRow s) iss
boardRow :: MonadWidget t m
=> [[Event t T.Text]]
-> [T.Text]
-> m [(Event t T.Text)]
boardRow s is = elClass "div" "board-row" $ mapM (square s) is
square :: (
PostBuild t m
, DomBuilder t m
, MonadHold t m
)
=> [[Event t T.Text]]
-> T.Text
-> m (Event t T.Text)
square stateEv i = do
rec
let ev = domEvent Click e
ev' = updated dyn
ev'' = tagPromptlyDyn dyn ev
dyn = tooglePlayer <$> dynBool
dyns <- mapM (holdDyn i) (concat stateEv)
dynBool <- toggle True $ updated $ distributeListOverDyn dyns
(e, _) <- elAttr' "button" ("type" =: "button" <> "class" =: "square") $ dynText dyn
return ev''
tooglePlayer :: Bool -> T.Text
tooglePlayer True = "X"
tooglePlayer False = "O"