package xapi.collect.api;
import xapi.fu.Do;
import xapi.fu.In1Out1;
import xapi.fu.MapLike;
/**
* @author James X. Nelson (james@wetheinter.net)
* Created on 5/3/16.
*/
public interface HasMany <K, V> extends HasValues<K, IntTo<V>>, MapLike<K, IntTo<V>> {
IntTo<V> newList();
default HasMany <K, V> add(K key, V value) {
get(key).add(value);
return this;
}
default HasMany <K, V> addMany(K key, Iterable<V> value) {
get(key).addAll(value);
return this;
}
default HasMany <K, V> addMapped(V v, In1Out1<V, K> mapper) {
K key = mapper.io(v);
get(key).add(v);
return this;
}
default HasMany <K, V> addManyMapped(Iterable<V> values, In1Out1<V, K> mapper) {
// for each v in value,
Do.forEachMapped1(values,
// take the IntTo<V> result of this.get(mapper.io(v))
mapper.mapOut(this::get),
// and apply IntTo::add
IntTo::add
);
return this;
}
default IntTo<V> flatten() {
final IntTo<V> flat = newList();
values().forEach(flat::addAll);
return flat;
}
}