From 393045d4f2595a4e0291cc62e99f2365289c1445 Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Mon, 19 Jul 2021 17:45:18 +0800 Subject: [PATCH] Add utility method for lazy initialized structure elements --- .../structure/LazyStructureElement.java | 38 +++++++++++++++++++ .../structure/StructureUtility.java | 23 +++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/java/com/gtnewhorizon/structurelib/structure/LazyStructureElement.java diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/LazyStructureElement.java b/src/main/java/com/gtnewhorizon/structurelib/structure/LazyStructureElement.java new file mode 100644 index 00000000..b8c1e4a7 --- /dev/null +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/LazyStructureElement.java @@ -0,0 +1,38 @@ +package com.gtnewhorizon.structurelib.structure; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.function.Function; + +class LazyStructureElement implements IStructureElementDeferred { + private Function> to; + private IStructureElement elem; + + public LazyStructureElement(Function> to) { + this.to = to; + } + + private IStructureElement get(T t) { + if (to != null) { + elem = to.apply(t); + to = null; + } + return elem; + } + + @Override + public boolean check(T t, World world, int x, int y, int z) { + return get(t).check(t, world, x, y, z); + } + + @Override + public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { + return get(t).placeBlock(t, world, x, y, z, trigger); + } + + @Override + public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { + return get(t).spawnHint(t, world, x, y, z, trigger); + } +} diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java index c09943ad..de2fca0a 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java @@ -787,6 +787,28 @@ public class StructureUtility { //region defer + /** + * Similar to defer, but caches the first returned element returned and won't call it again. + * Initialization is not thread safe. + */ + public static IStructureElementDeferred lazy(Supplier> to) { + if (to == null) { + throw new IllegalArgumentException(); + } + return new LazyStructureElement<>(t -> to.get()); + } + + /** + * Similar to defer, but caches the first returned element returned and won't call it again. + * Initialization is not thread safe. + */ + public static IStructureElementDeferred lazy(Function> to) { + if (to == null) { + throw new IllegalArgumentException(); + } + return new LazyStructureElement<>(to); + } + public static IStructureElementDeferred defer(Supplier> to) { if (to == null) { throw new IllegalArgumentException(); @@ -1414,4 +1436,5 @@ public class StructureUtility { } return shape; } + }