All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 a4) { return operationApply(a1, a2, a3, a4); } public static DataResult> operationApply5( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5) { return operationApply(a1, a2, a3, a4, a5); } public static DataResult> operationApply6( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6) { return operationApply(a1, a2, a3, a4, a5, a6); } public static DataResult> operationApply7( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6, UnaryOperator a7) { return operationApply(a1, a2, a3, a4, a5, a6, a7); } public static DataResult> operationApply8( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6, UnaryOperator a7, UnaryOperator a8) { return operationApply(a1, a2, a3, a4, a5, a6, a7, a8); } public static DataResult> operationApply9( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6, UnaryOperator a7, UnaryOperator a8, UnaryOperator a9) { return operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9); } public static DataResult> operationApply10( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6, UnaryOperator a7, UnaryOperator a8, UnaryOperator a9, UnaryOperator a10) { return operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); } public static DataResult> operationApply11( UnaryOperator a1, UnaryOperator a2, UnaryOperator a3, UnaryOperator a4, UnaryOperator a5, UnaryOperator a6, UnaryOperator a7, UnaryOperator a8, UnaryOperator a9, UnaryOperator a10, UnaryOperator a11) { return operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); } public static DataResult> operationApply12( 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 operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); } public static DataResult> operationApply13( 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 operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); } public static DataResult> operationApply14( 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 operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } public static DataResult> operationApply15( 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 operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); } public static DataResult> operationApply16( 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 operationApply(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); } } }