app :: MonadWidget t m => App t m ()
app = do
  ti <- textInput $ TextInputConfig "range" "4" never
                    (constDyn $ "min" =: "1" <> "max" =: "6")
  n <- holdDyn (4::Int) (read <$> updated (value ti))
  let f = reflexDia (def & sizeSpec .~ D.mkSizeSpec2D (Just 600) (Just 600)) . example
  el "div" $ widgetHoldHelper f 4 (updated n)
  return ()

hilbert 0 = mempty
hilbert n = hilbert' (n-1) D.# D.reflectY <> D.vrule 1
         <> hilbert  (n-1) <> D.hrule 1
         <> hilbert  (n-1) <> D.vrule (-1)
         <> hilbert' (n-1) D.# D.reflectX
  where
    hilbert' m = hilbert m D.# D.rotateBy (1/4)

example n = D.frame 1 . D.lw D.thin . D.lc D.darkred . D.fc D.white
                  . D.strokeT $ hilbert n