package com.codepoetics.octarine.records; import java.util.*; final class WrappingMutableRecord implements MutableRecord { public static MutableRecord wrap(Record record) { return new WrappingMutableRecord(record.with()); } private Record current; private Record added; private final Set<Key<?>> removed = new HashSet<>(); private WrappingMutableRecord(Record current) { this.current = current; added = Record.empty(); } @Override public void set(Value... values) { set(Record.of(values)); } @Override public void set(Record values) { added = added.with(values); removed.removeAll(values.keys()); current = current.with(values); } @Override public void unset(Collection<Key<?>> keys) { added = added.without(keys); current = current.without(keys); removed.addAll(keys); } @Override public Record added() { return added; } @Override public Set<Key<?>> removed() { return new HashSet<>(removed); } @Override public <T> Optional<T> get(Key<? extends T> key) { return current.get(key); } @Override public Set<Key<?>> keys() { return current.keys(); } @Override public Map<Key<?>, Object> values() { return current.values(); } @Override public boolean containsKey(Key<?> key) { return current.containsKey(key); } @Override public Record with(Value... values) { return current.with(values); } @Override public Record with(Record other) { return current.with(other); } @Override public Record without(Collection<Key<?>> keys) { return current.without(keys); } @Override public Record immutable() { return current; } @Override public Record select(Collection<Key<?>> selectedKeys) { return current.select(selectedKeys); } @Override public MutableRecord mutable() { return this; } @Override public String toString() { return current.toString(); } @Override public int hashCode() { return current.hashCode(); } @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object other) { return current.equals(other); } }