module Json { 
 
  import { ../JsonParsing; /Std; ../JsonScanning; } 
 
  // Json Exceptions 
 
  // scanner exceptions 
  pub except { 
    JsonUnexpectedChar{ch : char} 
    JsonUnexpectedEof{} 
    JsonUnexpectedName{name : string} 
  } 
 
  // parser exceptions 
  pub except { 
    JsonUnexpectedToken{token: JsonToken} 
  } 
 
  // JsonValue 
 
  pub typedef JsonObject = Map{string, JsonValue}; 
  pub typedef JsonArray = JsonValue[]; 
 
  pub union JsonValue { 
    ref JsonObject |  
    ref JsonArray | 
    none | 
    double | 
    bool 
  } 
 
  // Json 
 
  pub struct Json {} 
 
  pub Json.parse(text : string) : JsonValue => { 
    let parser = JsonParser(text); 
    return parser.parse(); 
  } 
 
  pub Json.stringify(value : JsonValue) : string => { 
    let writer = JsonWriter(); 
    writer.writeValue(value); 
    return writer.output; 
  } 
}