<div dir="ltr"><div>The third version of MFlow is out.</div><div> </div><div><a href="http://hackage.haskell.org/package/MFlow">http://hackage.haskell.org/package/MFlow</a></div><div> </div><div>MFlow is an all-heterodox web application framework, but very haskellish. </div>

<div> </div><div>Now MFlow support restful URLs.  It is the first stateful web framework to my knowledge that supports it. The type safe routes are implicitly expressed as normal monadic code within a navigation monad. The application look as a normal imperative console application, but the navigation monad goes back and forth to match the path of the URL. The user has control of the state, that can roll-back or not when the navigation goes back depending on the application needs. The state is in the form of normal Haskell variables In a monadic computation, with the weird addition of backtracking.</div>

<div> </div><div>The menu of the application below is implemented as an imperative-like syntax, but the application navigate forward and backward to synchronize with the requests of the web browser:</div><div><a href="http://mflowdemo.herokuapp.com/">http://mflowdemo.herokuapp.com/</a></div>

<div> </div><div>This version support  in-page flows.</div><div> What is that? look at this example:</div><div> </div><div><a href="http://mflowdemo.herokuapp.com/noscript/fviewmonad">http://mflowdemo.herokuapp.com/noscript/fviewmonad</a></div>

<div> </div><div>These flows are implemented as formlets with a monad instance, and callbacks which change the look. I call them &quot;widgets&quot;:</div><div> </div><div><a href="http://haskell-web.blogspot.com.es/2013/06/the-promising-land-of-monadic-formlets.html">http://haskell-web.blogspot.com.es/2013/06/the-promising-land-of-monadic-formlets.html</a></div>

<div> </div><div> </div><div>Each page may have many  of these active widgets, each one running their own flow. These widgets refresh themselves trough Ajax if they are enclosed in the primitive &quot;autoRefresh&quot;. If there is no Ajax or JavaScript available, they gracefully degrade by refreshing the entire page:</div>

<div> </div><div><a href="http://mflowdemo.herokuapp.com/noscript/combination">http://mflowdemo.herokuapp.com/noscript/combination</a></div><div> </div><div><a href="http://haskell-web.blogspot.com.es/2013/06/and-finally-widget-auto-refreshing.html">http://haskell-web.blogspot.com.es/2013/06/and-finally-widget-auto-refreshing.html</a></div>

<div> </div><div>The page flows and the multiflow idea was inspired in <a href="http://www.seaside.st/">Seaside</a>, a great Smalltalk web framework and adapted to the pure recursive nature of Haskell and the formlets.</div>

<div> </div><div>It also support some JQuery widgets integrated: modal and not modal dialogs, datePicker and other active widgets that handle other widgets.</div><div> </div><div>It also support the older features: persistent state, WAI, blaze-html and others integration, server process timeouts, Ajax, requirements, </div>

<div> content management, caching of widget rendering and all the other previous stuff.</div><div> </div><div>I wish to thank some people for their feedback. Specially Adrian May for his feedback and interest</div><p><br>

-- <br>Alberto.
</p></div>