From 4e27e6ce5659717ec1ac1e9e23801cc1819177df Mon Sep 17 00:00:00 2001 From: tueem Date: Sun, 16 Mar 2025 01:36:23 +0100 Subject: [PATCH] feat(struct): introduce ObjectAggregator --- .../registry/InteractionRegistry.java | 29 +++++++---------- .../marinara/util/ObjectAggregator.java | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 lib/src/main/java/net/tomatentum/marinara/util/ObjectAggregator.java diff --git a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java index 08677c9..bf54dad 100644 --- a/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java +++ b/lib/src/main/java/net/tomatentum/marinara/registry/InteractionRegistry.java @@ -1,7 +1,6 @@ package net.tomatentum.marinara.registry; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -13,9 +12,10 @@ import net.tomatentum.marinara.Marinara; import net.tomatentum.marinara.interaction.InteractionHandler; import net.tomatentum.marinara.interaction.InteractionType; import net.tomatentum.marinara.interaction.commands.SlashCommandDefinition; +import net.tomatentum.marinara.interaction.ident.InteractionIdentifier; import net.tomatentum.marinara.interaction.ident.RootCommandIdentifier; -import net.tomatentum.marinara.interaction.ident.SlashCommandIdentifier; import net.tomatentum.marinara.util.LoggerUtil; +import net.tomatentum.marinara.util.ObjectAggregator; import net.tomatentum.marinara.wrapper.IdentifierProvider; import net.tomatentum.marinara.interaction.methods.InteractionMethod; @@ -51,26 +51,19 @@ public class InteractionRegistry { } public void registerCommands() { - List defs = new ArrayList<>(); - List slashIdentifiers = interactions.stream() + List slashIdentifiers = interactions.stream() .filter((x) -> x.type().equals(InteractionType.COMMAND)) - .map((x) -> (SlashCommandIdentifier)x.identifier()) + .map((x) -> x.identifier()) .toList(); - slashIdentifiers.forEach((ident) -> { - Optional appDef = defs.stream() - .filter((x) -> x.rootIdentifier().equals(ident.rootNode())) - .findFirst(); + SlashCommandDefinition[] defs = new ObjectAggregator( + i -> (RootCommandIdentifier)i.rootNode(), + SlashCommandDefinition::addIdentifier, + SlashCommandDefinition::new) + .aggregate(slashIdentifiers) + .toArray(SlashCommandDefinition[]::new); - if (appDef.isPresent()) - appDef.get().addIdentifier(ident); - else - defs.add( - new SlashCommandDefinition((RootCommandIdentifier) ident.rootNode()) - .addIdentifier(ident)); - }); - - marinara.getWrapper().registerSlashCommands(defs.toArray(SlashCommandDefinition[]::new)); + marinara.getWrapper().registerSlashCommands(defs); logger.info("Registered all SlashCommands"); } diff --git a/lib/src/main/java/net/tomatentum/marinara/util/ObjectAggregator.java b/lib/src/main/java/net/tomatentum/marinara/util/ObjectAggregator.java new file mode 100644 index 0000000..e16b88a --- /dev/null +++ b/lib/src/main/java/net/tomatentum/marinara/util/ObjectAggregator.java @@ -0,0 +1,31 @@ +package net.tomatentum.marinara.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public class ObjectAggregator { + private Function keySupplier; + private BiConsumer valueConsumer; + private Function defaultGenerator; + + public ObjectAggregator(Function keySupplier, BiConsumer valueConsumer, Function defaultGenerator) { + this.keySupplier = keySupplier; + this.valueConsumer = valueConsumer; + this.defaultGenerator = defaultGenerator; + } + + public Collection aggregate(Iterable iterator) { + Map map = new HashMap<>(); + for (O element : iterator) { + K key = this.keySupplier.apply(element); + V value = map.getOrDefault(key, this.defaultGenerator.apply(key)); + this.valueConsumer.accept(value, element); + map.putIfAbsent(key, value); + } + return map.values(); + } + +}