package jetbrains.mps.internal.collections.runtime;
/*Generated by MPS */
import java.util.Map;
import java.io.Serializable;
import java.util.HashMap;
import jetbrains.mps.internal.collections.runtime.impl.NullMapSequence;
public class MapSequence<U, V> extends AbstractMapSequence<U, V> implements IMapSequence<U, V>, Map<U, V>, Serializable {
private static final long serialVersionUID = -3900727585622019317L;
protected MapSequence(Map<U, V> map) {
super(map);
}
public static <P, Q> MapSequence.MapSequenceInitializer<P, Q> fromKeysArray(P... keys) {
Map<P, Q> map = new HashMap<P, Q>();
return new MapSequence.MapSequenceInitializer<P, Q>(new MapSequence<P, Q>(map), keys);
}
public static <P, Q> MapSequence.MapSequenceInitializer<P, Q> fromMapAndKeysArray(Map<P, Q> map, P... keys) {
return new MapSequence.MapSequenceInitializer<P, Q>(new MapSequence<P, Q>(map), keys);
}
public static <P, Q> IMapSequence<P, Q> fromArray(IMapping<P, Q>... mappings) {
Map<P, Q> map = new HashMap<P, Q>();
for (IMapping<P, Q> mp : mappings) {
map.put(mp.key(), mp.value());
}
return new MapSequence<P, Q>(map);
}
@SuppressWarnings(value = "unchecked")
public static <P, Q> IMapSequence<P, Q> fromIterable(Iterable<IMapping<P, Q>> iterable) {
if (iterable instanceof IMapSequence) {
return (IMapSequence<P, Q>) iterable;
}
Map<P, Q> map = new HashMap<P, Q>();
for (IMapping<P, Q> mpng : iterable) {
map.put(mpng.key(), mpng.value());
}
return new MapSequence<P, Q>(map);
}
public static <P, Q> IMapSequence<P, Q> fromMap(Map<P, Q> map) {
if (Sequence.USE_NULL_SEQUENCE) {
if (map == null) {
return NullMapSequence.<P,Q>instance();
}
}
if (map instanceof IMapSequence) {
return (IMapSequence<P, Q>) map;
}
return new MapSequence<P, Q>(map);
}
public static class MapSequenceInitializer<P, Q> {
private final P[] keys;
private final IMapSequence<P, Q> mapSeq;
protected MapSequenceInitializer(IMapSequence<P, Q> mapSeq, P... keys) {
this.mapSeq = mapSeq;
this.keys = keys;
}
public IMapSequence<P, Q> withValues(Q... values) {
for (int i = 0; i < keys.length && i < values.length; i++) {
mapSeq.put(keys[i], values[i]);
}
return mapSeq;
}
}
}