From b4194e7de3ebe64499f317f0ebceda3aa333a004 Mon Sep 17 00:00:00 2001 From: Daniil Zao Date: Mon, 12 Feb 2024 03:23:15 +0300 Subject: [PATCH] Refactor variables getting --- .../events/listeners/BukkitListener.java | 62 +++++++------- .../events/listeners/RaListener.java | 7 +- .../model/activators/ActivationContext.java | 2 +- .../reactions/model/environment/Variable.java | 10 +-- .../model/environment/Variables.java | 52 +++++++++--- .../basic/activators/BlockClickActivator.java | 4 +- .../basic/activators/DoorActivator.java | 2 +- .../basic/activators/FlightActivator.java | 2 +- .../basic/activators/JoinActivator.java | 2 +- .../basic/activators/LeverActivator.java | 2 +- .../basic/activators/SneakActivator.java | 2 +- .../module/basic/external/RaProtocolLib.java | 2 +- .../reactions/util/bool/OptionalBoolean.java | 81 +++++++++++++++++++ .../util/{enums => bool}/TriBoolean.java | 14 +++- .../reactions/util/parameter/Parameters.java | 2 +- 15 files changed, 181 insertions(+), 65 deletions(-) create mode 100644 reactions/src/main/java/fun/reactions/util/bool/OptionalBoolean.java rename reactions/src/main/java/fun/reactions/util/{enums => bool}/TriBoolean.java (95%) diff --git a/reactions/src/main/java/fun/reactions/events/listeners/BukkitListener.java b/reactions/src/main/java/fun/reactions/events/listeners/BukkitListener.java index f49a6835..068a27e6 100644 --- a/reactions/src/main/java/fun/reactions/events/listeners/BukkitListener.java +++ b/reactions/src/main/java/fun/reactions/events/listeners/BukkitListener.java @@ -20,7 +20,6 @@ import fun.reactions.util.message.RaDebug; import fun.reactions.util.mob.EntityUtils; import fun.reactions.util.mob.MobSpawn; -import fun.reactions.util.num.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.block.Sign; @@ -46,7 +45,6 @@ import org.bukkit.metadata.FixedMetadataValue; import java.util.List; -import java.util.Optional; import static fun.reactions.module.basic.ContextManager.*; import static fun.reactions.module.basic.ItemContextManager.triggerItemHold; @@ -78,14 +76,14 @@ public void onAttackEvent(EntityDamageByEntityEvent event) { @EventHandler(ignoreCancelled = true) public void onTeleport(PlayerTeleportEvent event) { - Optional optVars = triggerTeleport( + var optVars = triggerTeleport( event.getPlayer(), event.getCause(), event.getTo()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); - vars.getChanged(TeleportActivator.Context.LOCATION_TO, LocationUtils::parseLocation).ifPresent(event::setTo); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); + vars.changed(TeleportActivator.Context.LOCATION_TO, LocationUtils::parseLocation).ifPresent(event::setTo); } @EventHandler @@ -100,13 +98,13 @@ public void onInteractAtEntity(PlayerInteractAtEntityEvent event) { public void onChat(AsyncPlayerChatEvent event) { // TODO: That's not really good solution try { - Optional optVars = triggerMessage(event.getPlayer(), + var optVars = triggerMessage(event.getPlayer(), MessageActivator.Source.CHAT_INPUT, event.getMessage()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); - vars.getChanged(MessageActivator.Context.MESSAGE).ifPresent(event::setMessage); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); + vars.changedString(MessageActivator.Context.MESSAGE).ifPresent(event::setMessage); // TODO: setFormat } catch (IllegalStateException ignore) { Msg.logOnce("asyncchaterror", "Chat is in async thread. Because of that you should use " + @@ -230,11 +228,11 @@ public void onMobGrowl(PlayerAttacksEntityEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onMobDamageByPlayer(PlayerAttacksEntityEvent event) { - Optional optVars = triggerMobDamage(event.getPlayer(), event.getEntity(), event.getDamage(), event.getFinalDamage(), event.getCause()); + var optVars = triggerMobDamage(event.getPlayer(), event.getEntity(), event.getDamage(), event.getFinalDamage(), event.getCause()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); - vars.getChanged(MobDamageActivator.MobDamageContext.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); + vars.changedDouble(MobDamageActivator.MobDamageContext.DAMAGE).ifPresent(event::setDamage); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) @@ -253,32 +251,32 @@ public void onPlayerDamage(EntityDamageEvent event) { String source; if (event instanceof EntityDamageByEntityEvent evdmg) { source = "ENTITY"; - Optional optVars = triggerDamageByMob(evdmg);; + var optVars = triggerDamageByMob(evdmg);; if (optVars.isPresent()) { Variables vars = optVars.get(); - vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); + vars.changedDouble(DamageActivator.Context.DAMAGE).ifPresent(event::setDamage); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } } else if (event instanceof EntityDamageByBlockEvent evdmg) { source = "BLOCK"; Block blockDamager = evdmg.getDamager(); if (blockDamager != null) { - Optional optVars = triggerDamageByBlock(evdmg, blockDamager); + var optVars = triggerDamageByBlock(evdmg, blockDamager); if (optVars.isPresent()) { Variables vars = optVars.get(); - vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); + vars.changedDouble(DamageActivator.Context.DAMAGE).ifPresent(event::setDamage); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } } } else { source = "OTHER"; } - Optional optVars = triggerDamage(event, source); + var optVars = triggerDamage(event, source); if (optVars.isPresent()) { Variables vars = optVars.get(); - vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); + vars.changedDouble(DamageActivator.Context.DAMAGE).ifPresent(event::setDamage); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } } @@ -361,21 +359,21 @@ public void onPlayerTeleport(PlayerTeleportEvent event) { @EventHandler(ignoreCancelled = true) public void onInventoryClick(InventoryClickEvent event) { - Optional optVars = triggerInventoryClick(event); + var optVars = triggerInventoryClick(event); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(InventoryClickActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent(event::setCurrentItem); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); + vars.changed(InventoryClickActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent(event::setCurrentItem); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } @EventHandler(ignoreCancelled = true) public void onDrop(PlayerDropItemEvent event) { - Optional optVars = triggerDrop(event.getPlayer(), event.getItemDrop(), event.getItemDrop().getPickupDelay()); + var optVars = triggerDrop(event.getPlayer(), event.getItemDrop(), event.getItemDrop().getPickupDelay()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); - vars.getChanged(DropActivator.Context.PICKUP_DELAY, NumberUtils::asInteger).ifPresent((d) -> event.getItemDrop().setPickupDelay(d)); - vars.getChanged(DropActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent((i) -> event.getItemDrop().setItemStack(i)); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); + vars.changedInt(DropActivator.Context.PICKUP_DELAY).ifPresent((d) -> event.getItemDrop().setPickupDelay(d)); + vars.changed(DropActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent((i) -> event.getItemDrop().setItemStack(i)); } @EventHandler(ignoreCancelled = true) @@ -392,11 +390,11 @@ public void onEntityClick(PlayerInteractEntityEvent event) { @EventHandler(ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { - Optional optVars = triggerBlockBreak(event.getPlayer(), event.getBlock(), event.isDropItems()); + var optVars = triggerBlockBreak(event.getPlayer(), event.getBlock(), event.isDropItems()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(BlockBreakActivator.Context.DO_DROP, Boolean::parseBoolean).ifPresent(event::setDropItems); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::parseBoolean).ifPresent(event::setCancelled); + vars.changedBoolean(BlockBreakActivator.Context.DO_DROP).ifPresent(event::setDropItems); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } @EventHandler(ignoreCancelled = true) @@ -407,8 +405,8 @@ public void onSneak(PlayerToggleSneakEvent event) { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { TemporaryOp.removeOp(event.getPlayer()); - Optional optVars = triggerQuit(event); - optVars.flatMap(variables -> variables.getChanged(QuitActivator.Context.QUIT_MESSAGE)).ifPresent(event::setQuitMessage); + var optVars = triggerQuit(event); + optVars.flatMap(variables -> variables.changedString(QuitActivator.Context.QUIT_MESSAGE)).ifPresent(event::setQuitMessage); MoveListener.removeLocation(event.getPlayer()); } diff --git a/reactions/src/main/java/fun/reactions/events/listeners/RaListener.java b/reactions/src/main/java/fun/reactions/events/listeners/RaListener.java index a4815fe8..f33b59e0 100644 --- a/reactions/src/main/java/fun/reactions/events/listeners/RaListener.java +++ b/reactions/src/main/java/fun/reactions/events/listeners/RaListener.java @@ -9,7 +9,6 @@ import fun.reactions.module.basic.ItemContextManager; import fun.reactions.module.basic.activators.DropActivator; import fun.reactions.util.item.VirtualItem; -import fun.reactions.util.num.NumberUtils; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -33,9 +32,9 @@ public void onPickup(PlayerPickupItemEvent event) { Optional optVars = ContextManager.triggerPickupItem(event.getPlayer(), event.getItem(), event.getItem().getPickupDelay()); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); - vars.getChanged(DropActivator.Context.PICKUP_DELAY, NumberUtils::asInteger).ifPresent((d) -> event.getItem().setPickupDelay(d)); - vars.getChanged(DropActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent((i) -> event.getItem().setItemStack(i)); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); + vars.changedInt(DropActivator.Context.PICKUP_DELAY).ifPresent((d) -> event.getItem().setPickupDelay(d)); + vars.changed(DropActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent((i) -> event.getItem().setItemStack(i)); if (event.isCancelled()) return; ItemContextManager.triggerItemHold(event.getPlayer()); ItemContextManager.triggerItemWear(event.getPlayer()); diff --git a/reactions/src/main/java/fun/reactions/model/activators/ActivationContext.java b/reactions/src/main/java/fun/reactions/model/activators/ActivationContext.java index aaebb3f8..342e240b 100644 --- a/reactions/src/main/java/fun/reactions/model/activators/ActivationContext.java +++ b/reactions/src/main/java/fun/reactions/model/activators/ActivationContext.java @@ -100,6 +100,6 @@ public final boolean isAsync() { } public boolean isCancelled() { - return variables != null && variables.getChanged(CANCEL_EVENT, Boolean::valueOf).orElse(false); + return variables != null && variables.changedBoolean(CANCEL_EVENT).orElse(false); } } diff --git a/reactions/src/main/java/fun/reactions/model/environment/Variable.java b/reactions/src/main/java/fun/reactions/model/environment/Variable.java index 96b1067a..401a8a8e 100644 --- a/reactions/src/main/java/fun/reactions/model/environment/Variable.java +++ b/reactions/src/main/java/fun/reactions/model/environment/Variable.java @@ -19,7 +19,7 @@ public interface Variable { } @Override - public @NotNull Optional getChanged() { + public @NotNull Optional changed() { return Optional.empty(); } @@ -33,7 +33,7 @@ public interface Variable { @NotNull Variable set(@NotNull String value); - @NotNull Optional getChanged(); + @NotNull Optional changed(); @NotNull Variable fork(); @@ -86,7 +86,7 @@ public Simple(@NotNull String value) { } @Override - public @NotNull Optional getChanged() { + public @NotNull Optional changed() { return Optional.of(value); } @@ -119,7 +119,7 @@ public Property(@NotNull String value) { } @Override - public @NotNull Optional getChanged() { + public @NotNull Optional changed() { return optional; } @@ -147,7 +147,7 @@ public Lazy(@NotNull SafeSupplier getter) { } @Override - public @NotNull Optional getChanged() { + public @NotNull Optional changed() { return Optional.empty(); } diff --git a/reactions/src/main/java/fun/reactions/model/environment/Variables.java b/reactions/src/main/java/fun/reactions/model/environment/Variables.java index 03ee861d..0d1add75 100644 --- a/reactions/src/main/java/fun/reactions/model/environment/Variables.java +++ b/reactions/src/main/java/fun/reactions/model/environment/Variables.java @@ -1,5 +1,8 @@ package fun.reactions.model.environment; +import fun.reactions.util.bool.OptionalBoolean; +import fun.reactions.util.bool.TriBoolean; +import fun.reactions.util.num.NumberUtils; import fun.reactions.util.parameter.Parameters; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.ApiStatus; @@ -7,13 +10,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; -import java.util.Collections; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.Function; +import java.util.*; +import java.util.function.*; public class Variables { private final Map variables; @@ -78,12 +76,44 @@ public Variables() { return vari == null ? null : vari.get(); } - public @NotNull Optional getChanged(@NotNull String key) { - return variables.getOrDefault(key.toLowerCase(Locale.ROOT), Variable.EMPTY).getChanged(); + public @NotNull Optional changed(@NotNull String key, @NotNull Function funct) { + return changedString(key).map(funct); } - public @NotNull Optional getChanged(@NotNull String key, @NotNull Function funct) { - return getChanged(key).map(funct); + public @NotNull Optional changedString(@NotNull String key) { + return variables.getOrDefault(key.toLowerCase(Locale.ROOT), Variable.EMPTY).changed(); + } + + public @NotNull OptionalBoolean changedBoolean(@NotNull String key) { + return changedString(key).map(s -> TriBoolean.byString(s).asOptional()).orElse(OptionalBoolean.EMPTY); + } + + public @NotNull OptionalBoolean changedBoolean(@NotNull String key, @NotNull Predicate<@NotNull String> funct) { + return changedString(key).map(s -> OptionalBoolean.of(funct.test(s))).orElse(OptionalBoolean.EMPTY); + } + + public @NotNull OptionalInt changedInt(@NotNull String key) { + return changedString(key).map(NumberUtils::parseInteger).orElse(OptionalInt.empty()); + } + + public @NotNull OptionalInt changedInt(@NotNull String key, @NotNull ToIntFunction<@NotNull String> funct) { + return changedString(key).map(s -> OptionalInt.of(funct.applyAsInt(s))).orElse(OptionalInt.empty()); + } + + public @NotNull OptionalLong changedLong(@NotNull String key) { + return changedString(key).map(NumberUtils::parseLong).orElse(OptionalLong.empty()); + } + + public @NotNull OptionalLong changedLong(@NotNull String key, @NotNull ToLongFunction<@NotNull String> funct) { + return changedString(key).map(s -> OptionalLong.of(funct.applyAsLong(s))).orElse(OptionalLong.empty()); + } + + public @NotNull OptionalDouble changedDouble(@NotNull String key) { + return changedString(key).map(NumberUtils::parseDouble).orElse(OptionalDouble.empty()); + } + + public @NotNull OptionalDouble changedDouble(@NotNull String key, @NotNull ToDoubleFunction<@NotNull String> funct) { + return changedString(key).map(s -> OptionalDouble.of(funct.applyAsDouble(s))).orElse(OptionalDouble.empty()); } public void set(@NotNull String key, @Nullable String value) { diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/BlockClickActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/BlockClickActivator.java index 6d2d7db0..777f6f4c 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/BlockClickActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/BlockClickActivator.java @@ -147,8 +147,8 @@ public Context(Player p, Block block, boolean leftClick) { return Map.of( CANCEL_EVENT, Variable.property(false), "blocklocation", simple(LocationUtils.locationToString(block.getLocation())), - "blocktype", Variable.simple(block.getType()), - "block", Variable.simple(block.getType()) // FIXME Why there is a copy? + "blocktype", simple(block.getType()), + "block", simple(block.getType()) // FIXME Why there is a copy? ); } } diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/DoorActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/DoorActivator.java index 3fcf9f3f..b40f8402 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/DoorActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/DoorActivator.java @@ -28,7 +28,7 @@ import fun.reactions.model.activators.Locatable; import fun.reactions.model.environment.Variable; import fun.reactions.util.BlockUtils; -import fun.reactions.util.enums.TriBoolean; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.location.LocationUtils; import fun.reactions.util.location.position.ImplicitPosition; import fun.reactions.util.parameter.BlockParameters; diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/FlightActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/FlightActivator.java index bc29e508..a885d739 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/FlightActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/FlightActivator.java @@ -4,7 +4,7 @@ import fun.reactions.model.activators.ActivationContext; import fun.reactions.model.activators.Activator; import fun.reactions.model.environment.Variable; -import fun.reactions.util.enums.TriBoolean; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.parameter.Parameters; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/JoinActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/JoinActivator.java index eefb8805..48963288 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/JoinActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/JoinActivator.java @@ -25,7 +25,7 @@ import fun.reactions.model.Logic; import fun.reactions.model.activators.ActivationContext; import fun.reactions.model.activators.Activator; -import fun.reactions.util.enums.TriBoolean; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.parameter.Parameters; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/LeverActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/LeverActivator.java index ca5a5122..99c20945 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/LeverActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/LeverActivator.java @@ -27,7 +27,7 @@ import fun.reactions.model.activators.Activator; import fun.reactions.model.activators.Locatable; import fun.reactions.model.environment.Variable; -import fun.reactions.util.enums.TriBoolean; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.location.position.ImplicitPosition; import fun.reactions.util.parameter.BlockParameters; import fun.reactions.util.parameter.Parameters; diff --git a/reactions/src/main/java/fun/reactions/module/basic/activators/SneakActivator.java b/reactions/src/main/java/fun/reactions/module/basic/activators/SneakActivator.java index f44c7303..7686c308 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/activators/SneakActivator.java +++ b/reactions/src/main/java/fun/reactions/module/basic/activators/SneakActivator.java @@ -4,7 +4,7 @@ import fun.reactions.model.activators.ActivationContext; import fun.reactions.model.activators.Activator; import fun.reactions.model.environment.Variable; -import fun.reactions.util.enums.TriBoolean; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.parameter.Parameters; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; diff --git a/reactions/src/main/java/fun/reactions/module/basic/external/RaProtocolLib.java b/reactions/src/main/java/fun/reactions/module/basic/external/RaProtocolLib.java index 37731807..f5f4a43d 100644 --- a/reactions/src/main/java/fun/reactions/module/basic/external/RaProtocolLib.java +++ b/reactions/src/main/java/fun/reactions/module/basic/external/RaProtocolLib.java @@ -131,7 +131,7 @@ public void onPacketSending(PacketEvent event) { Optional optVars = ContextManager.triggerMessage(event.getPlayer(), MessageActivator.Source.CHAT_OUTPUT, message); if (optVars.isEmpty()) return; Variables vars = optVars.get(); - vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled); + vars.changedBoolean(ActivationContext.CANCEL_EVENT).ifPresent(event::setCancelled); } } } diff --git a/reactions/src/main/java/fun/reactions/util/bool/OptionalBoolean.java b/reactions/src/main/java/fun/reactions/util/bool/OptionalBoolean.java new file mode 100644 index 00000000..ed7d749b --- /dev/null +++ b/reactions/src/main/java/fun/reactions/util/bool/OptionalBoolean.java @@ -0,0 +1,81 @@ +package fun.reactions.util.bool; + +import it.unimi.dsi.fastutil.booleans.BooleanConsumer; +import org.jetbrains.annotations.NotNull; + +import java.util.NoSuchElementException; +import java.util.function.BooleanSupplier; +import java.util.function.Supplier; + +public enum OptionalBoolean { + TRUE(true), FALSE(false), EMPTY(false); + + private final boolean value; + + OptionalBoolean(boolean value) { + this.value = value; + } + + public static OptionalBoolean empty() { + return EMPTY; + } + + public static OptionalBoolean of(boolean value) { + return value ? TRUE : FALSE; + } + + public boolean getAsBoolean() { + if (isPresent()) { + return value; + } else { + throw new NoSuchElementException("No value present"); + } + } + + public boolean isPresent() { + return this != EMPTY; + } + + public boolean isEmpty() { + return this == EMPTY; + } + + public void ifPresent(@NotNull BooleanConsumer action) { + if (isPresent()) { + action.accept(this.value); + } + + } + + public void ifPresentOrElse(@NotNull BooleanConsumer action, @NotNull Runnable emptyAction) { + if (isPresent()) { + action.accept(this.value); + } else { + emptyAction.run(); + } + } + + public boolean orElse(boolean other) { + return isPresent() ? this.value : other; + } + + public boolean orElseGet(@NotNull BooleanSupplier supplier) { + return isPresent() ? this.value : supplier.getAsBoolean(); + } + + public boolean orElseThrow() { + if (isPresent()) { + return this.value; + } else { + throw new NoSuchElementException("No value present"); + } + } + + public boolean orElseThrow(@NotNull Supplier exceptionSupplier) throws X { + if (isPresent()) { + return this.value; + } else { + throw exceptionSupplier.get(); + } + } +} diff --git a/reactions/src/main/java/fun/reactions/util/enums/TriBoolean.java b/reactions/src/main/java/fun/reactions/util/bool/TriBoolean.java similarity index 95% rename from reactions/src/main/java/fun/reactions/util/enums/TriBoolean.java rename to reactions/src/main/java/fun/reactions/util/bool/TriBoolean.java index 0624c3b1..e674fa69 100644 --- a/reactions/src/main/java/fun/reactions/util/enums/TriBoolean.java +++ b/reactions/src/main/java/fun/reactions/util/bool/TriBoolean.java @@ -1,4 +1,4 @@ -package fun.reactions.util.enums; +package fun.reactions.util.bool; import net.kyori.adventure.util.TriState; import org.jetbrains.annotations.Contract; @@ -19,6 +19,14 @@ public enum TriBoolean { this.triState = triState; } + public @NotNull OptionalBoolean asOptional() { + return switch (this) { + case TRUE -> OptionalBoolean.TRUE; + case FALSE -> OptionalBoolean.FALSE; + case ANY -> OptionalBoolean.EMPTY; + }; + } + public @Nullable Boolean asBoolean() { return triState.toBoolean(); } @@ -35,7 +43,7 @@ public boolean isValidFor(boolean bool) { return switch (this) { case TRUE -> bool; case FALSE -> !bool; - default -> true; + case ANY -> true; }; } @@ -43,7 +51,7 @@ public boolean isValidFor(@Nullable Boolean bool) { return switch (this) { case TRUE -> bool != null && bool; case FALSE -> bool != null && !bool; - default -> true; + case ANY -> true; }; } diff --git a/reactions/src/main/java/fun/reactions/util/parameter/Parameters.java b/reactions/src/main/java/fun/reactions/util/parameter/Parameters.java index 67fca7cd..4102d907 100644 --- a/reactions/src/main/java/fun/reactions/util/parameter/Parameters.java +++ b/reactions/src/main/java/fun/reactions/util/parameter/Parameters.java @@ -3,8 +3,8 @@ import fun.reactions.util.RichOptional; import fun.reactions.util.TimeUtils; import fun.reactions.util.Utils; +import fun.reactions.util.bool.TriBoolean; import fun.reactions.util.collections.CaseInsensitiveMap; -import fun.reactions.util.enums.TriBoolean; import fun.reactions.util.function.SafeFunction; import fun.reactions.util.function.SafeSupplier; import fun.reactions.util.item.VirtualItem;