From d117052ca47948cf1c92c33267f2dbe0454ab02c Mon Sep 17 00:00:00 2001 From: kske Date: Fri, 11 Feb 2022 09:48:41 +0100 Subject: [PATCH] Aggregate Change The aggregate change combines multiple changes into one while implementing the Change interface. --- .../kske/undoredo/core/AggregateChange.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 core/src/main/java/dev/kske/undoredo/core/AggregateChange.java diff --git a/core/src/main/java/dev/kske/undoredo/core/AggregateChange.java b/core/src/main/java/dev/kske/undoredo/core/AggregateChange.java new file mode 100644 index 0000000..06ca427 --- /dev/null +++ b/core/src/main/java/dev/kske/undoredo/core/AggregateChange.java @@ -0,0 +1,47 @@ +package dev.kske.undoredo.core; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Kai S. K. Engelbart + * @since 0.2.0 + */ +public final class AggregateChange implements Change { + + private final List changes = new ArrayList<>(); + + @SafeVarargs + public AggregateChange(C... changes) { + this(Arrays.asList(changes)); + } + + public AggregateChange(Collection changes) { + changes.addAll(changes); + } + + @Override + public void apply() { + changes.forEach(Change::apply); + } + + @Override + public Change invert() { + List invertedChanges = + changes + .parallelStream() + .map(Change::invert) + .collect(Collectors.toList()); + Collections.reverse(invertedChanges); + return new AggregateChange<>(invertedChanges); + } + + @Override + public boolean isIdentity() { + return changes.stream().allMatch(Change::isIdentity); + } + + public List changes() { + return Collections.unmodifiableList(changes); + } +}