package io.vertx.lang.ruby;

import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

A map that wrap/unwrap the entries of a delegate map. The function are provided by Ruby under the form of Proc that takes care of the conversion.
Author:Julien Viet
/** * A map that wrap/unwrap the entries of a delegate map. The function are provided by Ruby under the form * of Proc that takes care of the conversion. * * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */
class AdaptingMap extends AbstractMap { final Map delegate; final Function toRuby; final Function toJava; AdaptingMap(Map delegate, Function toRuby, Function toJava) { this.delegate = delegate; this.toRuby = toRuby; this.toJava = toJava; } @Override public Object put(Object key, Object value) { return delegate.put(key, toJava.apply(value)); } @Override public Object get(Object key) { return toRuby.apply(delegate.get(key)); } @Override public Object remove(Object key) { return toRuby.apply(delegate.remove(key)); } @Override public void clear() { delegate.clear(); } final Set<Entry> entrySet = new AbstractSet<Entry>() { @Override public Iterator<Entry> iterator() { Iterator<? extends Entry<String, ?>> it = AdaptingMap.this.delegate.entrySet().iterator(); return new Iterator<Entry>() { @Override public boolean hasNext() { return it.hasNext(); } @Override public Entry next() { Entry entry = it.next(); return new Entry() { @Override public Object getKey() { return entry.getKey(); } @Override public Object getValue() { return toRuby.apply(entry.getValue()); } @Override public Object setValue(Object value) { return toRuby.apply(entry.setValue(toJava.apply(value))); } }; } }; } @Override public int size() { return delegate.size(); } }; @Override public Set<Entry> entrySet() { return entrySet; } }