view tests/testJson.ur @ 16:959583692166

Reorder arguments for better partial application
author Adam Chlipala <adam@chlipala.net>
date Sun, 11 Dec 2011 14:44:18 -0500
parents 189245a3c075
children 8de201d70b91
line wrap: on
line source
open Json

(* Example from http://en.wikipedia.org/wiki/JSON *)

type address = {StreetAddress : string,
                City : string,
                State : string,
                PostalCode : string}

type phoneNumber = {Type_ : string,
                    Number : string}

type person = {FirstName : string,
               LastName : string,
               Age : int,
               Address : address,
               PhoneNumber : list phoneNumber}

val sample : person = {FirstName = "Larry",
                       LastName = "Lambda",
                       Age = 42,
                       Address = {StreetAddress = "99 Confluence Circle",
                                  City = "Hoserville",
                                  State = "QQ",
                                  PostalCode = "66666"},
                       PhoneNumber = {Type_ = "mobile", Number = "1234"}
                                         :: {Type_ = "secret", Number = "ssssh"}
                                         :: []}

val json_address : json address = json_record {StreetAddress = "streetAddress",
                                               City = "city",
                                               State = "state",
                                               PostalCode = "postalCode"}

val json_phoneNumber : json phoneNumber = json_record {Type_ = "type",
                                                       Number = "number"}

val json_person : json person = json_record {FirstName = "firstName",
                                             LastName = "lastName",
                                             Age = "age",
                                             Address = "address",
                                             PhoneNumber = "phoneNumber"}

fun renderPerson (p : person) = <xml>
  <b>First name:</b> {[p.FirstName]}<br/>
  <b>Last name:</b> {[p.LastName]}<br/>
  <b>Age:</b> {[p.Age]}<br/>
  <b>Street address:</b> {[p.Address.StreetAddress]}<br/>
  <b>City:</b> {[p.Address.City]}<br/>
  <b>State:</b> {[p.Address.State]}<br/>
  <b>Postal code:</b> {[p.Address.PostalCode]}<br/>
  <b>Phone numbers:</b> {List.mapX (fn pn => <xml>{[pn.Type_]} => {[pn.Number]}; </xml>) p.PhoneNumber}<br/>
</xml>

fun parse r = return <xml><body>
  {renderPerson (fromJson r.Text)}
</body></xml>

fun main () = return <xml><body>
  <h1>Json parsing adventure!</h1>

  <hr/>
  <h2>Free sample</h2>

  {[toJson sample]}
  <hr/>

  <h2>Parse your own</h2>
  <form>
    <textarea{#Text} rows={10} cols={80}/><br/>
    <submit value="Parse" action={parse}/>
  </form>
</body></xml>