comparison tests/testJson.ur @ 23:9d6b931fbd13

Implement JSON type class for recursive datatypes, using Mu combinator.
author Edward Z. Yang <ezyang@mit.edu>
date Wed, 02 May 2012 11:47:37 -0400
parents 8de201d70b91
children
comparison
equal deleted inserted replaced
22:8de201d70b91 23:9d6b931fbd13
55 <b>Age:</b> {[p.Age]}<br/> 55 <b>Age:</b> {[p.Age]}<br/>
56 <b>Street address:</b> {[p.Address.StreetAddress]}<br/> 56 <b>Street address:</b> {[p.Address.StreetAddress]}<br/>
57 <b>City:</b> {[p.Address.City]}<br/> 57 <b>City:</b> {[p.Address.City]}<br/>
58 <b>State:</b> {[p.Address.State]}<br/> 58 <b>State:</b> {[p.Address.State]}<br/>
59 <b>Postal code:</b> {[p.Address.PostalCode]}<br/> 59 <b>Postal code:</b> {[p.Address.PostalCode]}<br/>
60 <b>Phone numbers:</b> {List.mapX (fn pn => <xml>{[pn.Number]}; </xml>) p.PhoneNumber}<br/> 60 <!-- <b>Phone numbers:</b> {List.mapX (fn pn => <xml>{[pn.Number]}; </xml>) p.PhoneNumber}<br/> -->
61 </xml> 61 </xml>
62 62
63 fun parse r = return <xml><body> 63 fun parse r = return <xml><body>
64 {renderPerson (fromJson r.Text)} 64 {renderPerson (fromJson r.Text)}
65 </body></xml> 65 </body></xml>
77 <form> 77 <form>
78 <textarea{#Text} rows={10} cols={80}/><br/> 78 <textarea{#Text} rows={10} cols={80}/><br/>
79 <submit value="Parse" action={parse}/> 79 <submit value="Parse" action={parse}/>
80 </form> 80 </form>
81 </body></xml> 81 </body></xml>
82
83 structure God = Json.Recursive(struct
84 con t a = variant [Fun = string * list a,
85 Var = string]
86
87 fun json_t [a] (_ : json a) : json (t a) =
88 let
89 val json_fun : json (string * list a) = json_record ("1", "2")
90 in
91 json_variant {Fun = "Fun", Var = "Var"}
92 end
93 end)
94
95 fun renderGod (God.Rec g) =
96 match g
97 {Fun = fn (s, gs) => <xml>
98 <b>Main god:</b> {[s]}<br/>
99 <b>Subgods:</b> <ul>
100 {List.mapX (fn g' => <xml><li>{renderGod g'}</li></xml>) gs}
101 </ul>
102 </xml>,
103 Var = fn s => <xml>
104 <b>Var:</b> {[s]}
105 </xml>}
106
107 fun parseGod r = return <xml><body>
108 <h2>Beautified</h2>
109 {renderGod (fromJson r.Text)}
110
111 <h2>Round-tripped</h2>
112 {[toJson (fromJson r.Text : God.r)]}
113 </body></xml>
114
115 fun godMain () = return <xml><body>
116 <h1>Parse ye gods</h1>
117
118 <form>
119 <textarea{#Text} rows={10} cols={80}/><br/>
120 <submit value="Parse" action={parseGod}/>
121 </form>
122 </body></xml>