h$2.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None  567dittoProved records a value, the location that value came from, and something that was proved about the value.ditto*Type for failing computations Similar to Either but with an accumilating  Applicative instancedittoused to represent whether a value was found in the form submission data, missing from the form submission data, or expected that the default value should be used ditto2views, values as a result of the environment, etc.$Function which creates the form viewditto+A range of ID's to specify a group of formsdittoAn ID used to identify formsditto Encoding a FormId: use this instead of show4 for the name of the input / query string parameterditto get the head  from a dittoGlobal prefix for the formditto:Stack indicating field. Head is most specific to this itemdittoLocal name of the inputdittoIndex of the input  None 3ditto*Class which all backends should implement.4dittoinput is here the type that is used to represent a value uploaded by the client in the request.5dittoParse the input into a string. This is used for simple text fields among other things7dittoParse the input value into 9ditto*Get a file descriptor for an uploaded file:dittoA Class to lift a <( into an application-specific error type<dittoan error type used to represent errors that are common to all backendsThese errors should only occur if there is a bug in the ditto-* packages. Perhaps we should make them an  Exception so that we can get rid of the : class.Cditto some default error messages for =CD=CD:;3978654None #$%25>!IdittoRun the form, but with a given  environment functionLditto1Run the form, but always return the initial valueOdittoThe environment typeclass: the interface between ditto and a given frameworkQdittoditto's representation of a formletIt's reccommended to use  ApplicativeDo' where possible when constructing formsSdittoDecode the value from the inputTdittoThe initial valueUdittoA  FormState which produces a View and a ResultVditto8The Form's state is just the range of identifiers so farWditto environment+ which will always return the initial valueXdittoAlways succeed decodingYdittoCommon operations on Forms1Change the view of a form using a simple functionThis is useful for wrapping a form inside of a
or other markup element.ZdittoIncrement a form ID[ditto Check if a  is contained in a \dittoGet a FormId from the FormState]ditto'Utility function: Get the current range^dittoGet a  FormIdName from the FormState_dittoTurns a FormId into a  FormRange( by incrementing the base for the end Id`ditto Run a formaditto!Run a form, and unwrap the resultbdittoEvaluate a formReturns:  Left viewon failure. The view will be produced by a  View err view-, which can be modified with functions like withChildErrors# for the sake of rendering errors.Right a on success.cditto"infix mapView: succinctly mix the view dsl and the formlets dsl e.g. div_ [class_ "my cool form"] @$ do (_ :: Form m input err view' a).dditto?Utility Function: turn a view and pure value into a successful Veditto'Utility function: Get the current inputfditto1Utility function: Gets the input of an arbitrary .gditto%Select the errors for a certain rangehdittoSelect the errors originating from this form or from any of the children of this formidittoMake a form which renders a view*, accepts no input and produces no outputjdittoCatch errors purelykdittoCatch errors inside Form / mlditto Map over the Result and View of a formmdittoRun the form with no environment, return only the html. This means that the values will always be their defaultsnditto#lift the result of a decoding to a FormodittoForm is a  MonadTrans, but we can't have an instance of it because of the order and kind of its type variablesYditto Manipulatorditto Initial formdittoResulting form[dittoId to check fordittoRangedittoIf the range contains the idbdittoIdentifier for the formditto Form to rundittoResultmditto form prefixditto form to view'IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno'VQRSTUOPLMNIJKWcjkb\ef]^Z[lYdhg`aX_imnoc0None%5H dittoA + attempts to prove something about a value.If successful, it can also transform the value to a new value. The proof should hold for the new value as well.Generally, each  has a unique data-type associated with it which names the proof, such as:ditto!function which provides the proofdittousually const bdittoapply a  to a Qdittotransform the Q result using a monadic  function.dittotransform the Q result using an  function.dittoprove that a list is not emptyditto+read an unsigned number in decimal notationdittoread signed decimal numberdittoread  numberdittoread a signed  numberdittocreate an error message (! is the value that did not parse)  None%!Ndittoa choice for inputChoiceditto the formIdditto labeldittois the choice selecteddittothe haskell value of the choiceditto$used for constructing elements like ", which pure a single input value.dittothis is necessary in order to basically map over the decoding functiondittoused for elements like : which are not always present in the form submission data.dittoused for elements like  which take a value, but are never present in the form data set.ditto used for dittoused for groups of checkboxes,  boxesdittoused to create