aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/recipe/RecipeMapBackendPropertiesBuilder.java
blob: aad0748fa914c49dd769af70b45d3433aedb9e33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package gregtech.api.recipe;

import static gregtech.api.util.GTRecipeMapUtil.buildOrEmpty;

import java.util.function.Function;

import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;

import com.google.common.collect.Iterables;

import gregtech.api.util.GTRecipe;
import gregtech.api.util.GTRecipeBuilder;
import gregtech.api.util.MethodsReturnNonnullByDefault;

/**
 * Builder class for {@link RecipeMapBackendProperties}.
 */
@SuppressWarnings({ "unused", "UnusedReturnValue" })
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public final class RecipeMapBackendPropertiesBuilder {

    private int minItemInputs;
    private int minFluidInputs;

    private boolean specialSlotSensitive;

    private boolean disableOptimize;

    private Function<? super GTRecipeBuilder, ? extends Iterable<? extends GTRecipe>> recipeEmitter = this::defaultBuildRecipe;

    @Nullable
    private Function<? super GTRecipe, ? extends GTRecipe> recipeTransformer;

    RecipeMapBackendPropertiesBuilder() {}

    RecipeMapBackendProperties build() {
        return new RecipeMapBackendProperties(
            minItemInputs,
            minFluidInputs,
            specialSlotSensitive,
            disableOptimize,
            recipeEmitter,
            recipeTransformer);
    }

    public RecipeMapBackendPropertiesBuilder minItemInputs(int minItemInputs) {
        this.minItemInputs = minItemInputs;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder minFluidInputs(int minFluidInputs) {
        this.minFluidInputs = minFluidInputs;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder specialSlotSensitive() {
        this.specialSlotSensitive = true;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder disableOptimize() {
        this.disableOptimize = true;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder recipeEmitter(
        Function<? super GTRecipeBuilder, ? extends Iterable<? extends GTRecipe>> recipeEmitter) {
        this.recipeEmitter = recipeEmitter;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder combineRecipeEmitter(
        Function<? super GTRecipeBuilder, ? extends Iterable<? extends GTRecipe>> func) {
        // move recipeEmitter to local variable, so lambda capture the function itself instead of this
        Function<? super GTRecipeBuilder, ? extends Iterable<? extends GTRecipe>> cur = this.recipeEmitter;
        return recipeEmitter(b -> Iterables.concat(cur.apply(b), func.apply(b)));
    }

    public RecipeMapBackendPropertiesBuilder recipeTransformer(
        Function<? super GTRecipe, ? extends GTRecipe> recipeTransformer) {
        this.recipeTransformer = recipeTransformer;
        return this;
    }

    public RecipeMapBackendPropertiesBuilder chainRecipeTransformer(
        Function<? super GTRecipe, ? extends GTRecipe> func) {
        this.recipeTransformer = this.recipeTransformer == null ? func : this.recipeTransformer.andThen(func);
        return this;
    }

    private Iterable<? extends GTRecipe> defaultBuildRecipe(GTRecipeBuilder builder) {
        // TODO sensible validation
        GTRecipeBuilder b = builder;
        if (disableOptimize && builder.isOptimize()) {
            b = copy(builder, b).noOptimize();
        }
        return buildOrEmpty(b);
    }

    private static GTRecipeBuilder copy(GTRecipeBuilder original, GTRecipeBuilder b) {
        return b == original ? b.copy() : b;
    }
}