
dev.lukebemish.codecextras.polymorphic.BuilderCodecs Maven / Gradle / Ivy
package dev.lukebemish.codecextras.polymorphic;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import dev.lukebemish.codecextras.Asymmetry;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
// TODO: document this class...
public final class BuilderCodecs {
private BuilderCodecs() {}
public static RecordCodecBuilder, O>, Asymmetry, F>> operationWrap(MapCodec fieldCodec, BiFunction fieldSetter, Function fieldGetter) {
return Asymmetry., F>split(fieldCodec, f -> o -> fieldSetter.apply(o, f), Function.identity())
.forGetter(Asymmetry.wrapGetter(fieldGetter));
}
public static RecordCodecBuilder, Asymmetry, F>> wrap(MapCodec fieldCodec, BiFunction fieldSetter, Function fieldGetter) {
return Asymmetry., F>split(fieldCodec, f -> o -> fieldSetter.apply(o, f), Function.identity())
.forGetter(Asymmetry.wrapGetter(fieldGetter));
}
public static Resolver resolver(Supplier initial) {
return new Resolver<>(initial);
}
public static Codec pair(Codec codec, Codec parent, Function parentGetter, BiFunction parentSetter) {
return Codec.pair(codec, parent).xmap(p -> {
O builder = p.getFirst();
return parentSetter.apply(builder, p.getSecond());
}, builder -> Pair.of(builder, parentGetter.apply(builder)));
}
public static MapCodec mapPair(MapCodec codec, MapCodec parent, Function parentGetter, BiFunction parentSetter) {
return Codec.mapPair(codec, parent).xmap(p -> {
O builder = p.getFirst();
return parentSetter.apply(builder, p.getSecond());
}, builder -> Pair.of(builder, parentGetter.apply(builder)));
}
public static Codec flatPair(Codec codec, Codec parent, Function> parentGetter, BiFunction> parentSetter) {
return Codec.pair(codec, parent).flatXmap(p -> {
O builder = p.getFirst();
return parentSetter.apply(builder, p.getSecond());
}, builder -> parentGetter.apply(builder).map(p->Pair.of(builder, p)));
}
public static MapCodec flatMapPair(MapCodec codec, MapCodec parent, Function> parentGetter, BiFunction> parentSetter) {
return Codec.mapPair(codec, parent).flatXmap(p -> {
O builder = p.getFirst();
return parentSetter.apply(builder, p.getSecond());
}, builder -> parentGetter.apply(builder).map(p->Pair.of(builder, p)));
}
public static > Codec codec(Codec builderCodec, Function deBuilder) {
return builderCodec.flatXmap(DataBuilder::buildResult, o -> {
B builder = deBuilder.apply(o);
return DataResult.success(builder);
});
}
public static > MapCodec mapCodec(MapCodec builderCodec, Function deBuilder) {
return builderCodec.flatXmap(DataBuilder::buildResult, o -> {
B builder = deBuilder.apply(o);
return DataResult.success(builder);
});
}
public static Codec codec(Codec builderCodec, Function deBuilder, Function> buildFunction) {
return builderCodec.flatXmap(b -> buildFunction.apply(b).buildResult(), o -> {
B builder = deBuilder.apply(o);
return DataResult.success(builder);
});
}
public static MapCodec mapCodec(MapCodec builderCodec, Function deBuilder, Function> buildFunction) {
return builderCodec.flatXmap(b -> buildFunction.apply(b).buildResult(), o -> {
B builder = deBuilder.apply(o);
return DataResult.success(builder);
});
}
public static Codec operationCodec(Codec, B>> builderCodec, Function deBuilder, Supplier initial, Function> buildFunction) {
return Asymmetry.join(builderCodec, op -> op.apply(initial.get()), Function.identity())
.flatXmap(b -> buildFunction.apply(b).buildResult(), o -> {
B builder = deBuilder.apply(o);
return DataResult.success(builder);
});
}
public static MapCodec operationMapCodec(MapCodec, B>> builderCodec, BiFunction deBuilder, Supplier initial, Function> buildFunction) {
return Asymmetry.join(builderCodec, op -> op.apply(initial.get()), Function.identity())
.flatXmap(b -> buildFunction.apply(b).buildResult(), o -> {
B builder = deBuilder.apply(initial.get(), o);
return DataResult.success(builder);
});
}
public static final class Resolver {
private final Supplier initial;
private Resolver(Supplier initial) {
this.initial = initial;
}
@SafeVarargs
public final DataResult apply(UnaryOperator... operators) {
O instance = initial.get();
for (UnaryOperator operator : operators) {
instance = operator.apply(instance);
}
return DataResult.success(instance);
}
public DataResult apply1(
UnaryOperator a1) {
return apply(a1);
}
public DataResult apply2(
UnaryOperator a1,
UnaryOperator a2) {
return apply(a1, a2);
}
public DataResult apply3(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3) {
return apply(a1, a2, a3);
}
public DataResult apply4(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4) {
return apply(a1, a2, a3, a4);
}
public DataResult apply5(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5) {
return apply(a1, a2, a3, a4, a5);
}
public DataResult apply6(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6) {
return apply(a1, a2, a3, a4, a5, a6);
}
public DataResult apply7(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7) {
return apply(a1, a2, a3, a4, a5, a6, a7);
}
public DataResult apply8(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8);
}
public DataResult apply9(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9);
}
public DataResult apply10(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
}
public DataResult apply11(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
}
public DataResult apply12(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11,
UnaryOperator a12) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
}
public DataResult apply13(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11,
UnaryOperator a12,
UnaryOperator a13) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
}
public DataResult apply14(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11,
UnaryOperator a12,
UnaryOperator a13,
UnaryOperator a14) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
}
public DataResult apply15(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11,
UnaryOperator a12,
UnaryOperator a13,
UnaryOperator a14,
UnaryOperator a15) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
}
public DataResult apply16(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator a4,
UnaryOperator a5,
UnaryOperator a6,
UnaryOperator a7,
UnaryOperator a8,
UnaryOperator a9,
UnaryOperator a10,
UnaryOperator a11,
UnaryOperator a12,
UnaryOperator a13,
UnaryOperator a14,
UnaryOperator a15,
UnaryOperator a16) {
return apply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16);
}
@SafeVarargs
public static DataResult> operationApply(UnaryOperator... asymmetries) {
return DataResult.success(o -> {
for (UnaryOperator operator : asymmetries) {
o = operator.apply(o);
}
return o;
});
}
public static DataResult> operationApply1(UnaryOperator a1) {
return operationApply(a1);
}
public static DataResult> operationApply2(UnaryOperator a1, UnaryOperator a2) {
return operationApply(a1, a2);
}
public static DataResult> operationApply3(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3) {
return operationApply(a1, a2, a3);
}
public static DataResult> operationApply4(
UnaryOperator a1,
UnaryOperator a2,
UnaryOperator a3,
UnaryOperator