Mercurial > meta
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> |