public IValue visitMap(IMap o) throws IOException {
      append('(');
      tab();
      boolean indent = checkIndent(o);
      indent(indent);
      Iterator<IValue> mapIterator = o.iterator();
      if (mapIterator.hasNext()) {
        IValue key = mapIterator.next();
        key.accept(this);
        append(':');
        o.get(key).accept(this);

        while (mapIterator.hasNext()) {
          append(',');
          indent(indent);
          key = mapIterator.next();
          key.accept(this);
          append(':');
          o.get(key).accept(this);
        }
      }
      untab();
      indent(indent);
      append(')');

      return o;
    }
 private boolean checkIndent(ISet o) {
   if (indent && o.size() > 1) {
     for (IValue x : o) {
       Type type = x.getType();
       return indented(type);
     }
   }
   return false;
 }
 private boolean checkIndent(INode o) {
   if (indent && o.arity() > 1) {
     for (IValue x : o) {
       Type type = x.getType();
       if (indented(type)) {
         return true;
       }
     }
   }
   return false;
 }
 private boolean checkIndent(IList o) {
   if (indent && o.length() > 1) {
     for (IValue x : o) {
       Type type = x.getType();
       if (indented(type)) {
         return true;
       }
     }
   }
   return false;
 }
 private boolean checkIndent(IMap o) {
   if (indent && o.size() > 1) {
     for (IValue x : o) {
       Type type = x.getType();
       Type vType = o.get(x).getType();
       if (indented(type)) {
         return true;
       }
       if (indented(vType)) {
         return true;
       }
     }
   }
   return false;
 }
 public void write(IValue value, java.io.Writer stream) throws IOException {
   try {
     value.accept(new Writer(stream, indent, tabSize));
   } finally {
     stream.flush();
   }
 }
 protected void setAnnotation(String annoName, IValue annoValue) {
   if (this.ownValue == null) {
     return;
   }
   if (annoValue != null && ownValue.getType().declaresAnnotation(this.typeStore, annoName)) {
     ownValue = ((IConstructor) ownValue).asAnnotatable().setAnnotation(annoName, annoValue);
   }
 }
 public void insert(IListWriter listW, IValue message) {
   if (message.getType().isConstructor()
       && message.getType().getAbstractDataType().getName().equals("Message")) {
     listW.insert(message);
   }
 }