package org.mvel2.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

public class Make {
  public static class Map<K, V> {
    public static <K, V> Map<K, V> $() {
      return start();
    }

    public static <K, V> Map<K, V> start() {
      return new Map(new HashMap());
    }

    public static <K, V> Map<K, V> start(Class<? extends java.util.Map> mapImpl) {
      try {
        return new Map(mapImpl.newInstance());
      }
      catch (Throwable t) {
        throw new RuntimeException("error creating instance", t);
      }
    }

    private java.util.Map<K, V> mapInstance;

    private Map(java.util.Map<K, V> mapInstance) {
      this.mapInstance = mapInstance;
    }

    public Map<K, V> _(K key, V value) {
      mapInstance.put(key, value);
      return this;
    }

    public java.util.Map<K, V> _() {
      return finish();
    }

    public java.util.Map<K, V> finish() {
      return mapInstance;
    }
  }

  public static class String {
    public static String $() {
      return start();
    }

    public static String start() {
      return new String(new StringBuilder());
    }

    public java.lang.String _() {
      return finish();
    }

    public java.lang.String finish() {
      return stringAppender.toString();
    }

    private StringBuilder stringAppender;

    String(StringBuilder stringAppender) {
      this.stringAppender = stringAppender;
    }

    public String _(char c) {
      stringAppender.append(c);
      return this;
    }

    public String _(CharSequence cs) {
      stringAppender.append(cs);
      return this;
    }

    public String _(String s) {
      stringAppender.append(s);
      return this;
    }
  }

  public static class List<V> {
    public static <V> List<V> $() {
      return start();
    }

    public static <V> List<V> start() {
      return new List(new ArrayList());
    }

    public static <V> List<V> start(Class<? extends java.util.List> listImpl) {
      try {
        return new List(listImpl.newInstance());
      }
      catch (Throwable t) {
        throw new RuntimeException("error creating instance", t);
      }
    }

    private java.util.List<V> listInstance;

    List(java.util.List<V> listInstance) {
      this.listInstance = listInstance;
    }

    public List<V> _(V value) {
      listInstance.add(value);
      return this;
    }

    public java.util.List<V> _() {
      return finish();
    }

    public java.util.List<V> finish() {
      return listInstance;
    }
  }

  public static class Set<V> {
    public static <V> Set<V> $() {
      return start();
    }

    public static <V> Set<V> start() {
      return new Set(new HashSet());
    }

    public static <V> Set<V> start(Class<? extends java.util.Set> listImpl) {
      try {
        return new Set(listImpl.newInstance());
      }
      catch (Throwable t) {
        throw new RuntimeException("error creating instance", t);
      }
    }

    private java.util.Set<V> listInstance;

    Set(java.util.Set<V> listInstance) {
      this.listInstance = listInstance;
    }

    public Set<V> _(V value) {
      listInstance.add(value);
      return this;
    }

    public java.util.Set<V> _() {
      return finish();
    }

    public java.util.Set<V> finish() {
      return listInstance;
    }
  }

}
