A Halogen component renders immediately after put or modify has been called, meaning:
eval (SomeAction next) = do
H.put someNewState -- component rerenders when this gets run
window >>= document >>= getElementById "someId" -- changes made by the previous line are visible here
pure next
Due to this, I tend to collect all the necessary data at the beginning of the eval function, do whatever calculations and effects I need and at the end update component state with a single call to put if necessary.