module HtmlFormHandler(formHandlerSP) where import Fudgets import HtmlFormF2(FormMsg(..)) import qualified Data.Map as T import Data.Maybe(fromMaybe) -- type signature needed because of the annoying monomorphism restriction formHandlerSP :: (Ord a, Ord b) => SP (Maybe (a, (b, FormMsg))) (Either (b, FormMsg) (a, [(String, String)])) formHandlerSP = mapstateSP formHandler (Nothing,T.empty) state0 = (Nothing,T.empty) formHandler _ Nothing = (state0,[]) formHandler state@(waitingfor,forms) (Just (formpath,(n,msg))) = case msg of Reset -> (state,toAll msg) Submit -> ((Just elems,forms),toAll msg) RadioChange (n,v) -> (state,toAll msg) Output values -> case waitingfor of Nothing -> ((waitingfor,forms'),[]) Just es -> case es' of [] -> ((Nothing,forms), [Right (formpath,concat (T.elems form'))]) _ -> ((Just es',forms'),[]) where es' = [ e |e<-es,e/=n] where form' = T.insert n values form forms' = T.insert formpath form' forms where form = fromMaybe T.empty (T.lookup formpath forms) toAll msg =[Left (n,msg) | n<-elems] elems = T.keys form --tr x = ctrace "formHandler" x x