Mercurial > urweb
annotate demo/listFun.ur @ 1949:d7bec4e63415
Do a bit of extra userspace copying to send HTTP response with a single system call
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Tue, 31 Dec 2013 09:34:41 -0500 |
parents | 7ef4b2911b09 |
children |
rev | line source |
---|---|
adamc@398 | 1 open List |
adamc@398 | 2 |
adamc@386 | 3 functor Make(M : sig |
adamc@386 | 4 type t |
adamc@398 | 5 val toString : t -> string |
adamc@398 | 6 val fromString : string -> option t |
adamc@386 | 7 end) = struct |
adamc@398 | 8 fun toXml (ls : list M.t) = |
adamc@398 | 9 case ls of |
adamc@398 | 10 Nil => <xml>[]</xml> |
adamc@398 | 11 | Cons (x, ls') => <xml>{[M.toString x]} :: {toXml ls'}</xml> |
adamc@398 | 12 |
adamc@501 | 13 fun console (ls : list M.t) = |
adamc@501 | 14 let |
adamc@501 | 15 fun cons (r : {X : string}) = |
adamc@501 | 16 case M.fromString r.X of |
adamc@501 | 17 None => return <xml><body>Invalid string!</body></xml> |
adamc@501 | 18 | Some v => console (Cons (v, ls)) |
adamc@501 | 19 in |
adamc@501 | 20 return <xml><body> |
adamc@501 | 21 Current list: {toXml ls}<br/> |
adamc@501 | 22 Reversed list: {toXml (rev ls)}<br/> |
adamc@501 | 23 Length: {[length ls]}<br/> |
adamc@501 | 24 <br/> |
adamc@398 | 25 |
adamc@501 | 26 <form> |
adamc@501 | 27 Add element: <textbox{#X}/> <submit action={cons}/> |
adamc@501 | 28 </form> |
adamc@501 | 29 </body></xml> |
adamc@501 | 30 end |
adamc@398 | 31 |
adamc@398 | 32 fun main () = console Nil |
adamc@386 | 33 end |