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

net.hamnaberg.json.Codecs Maven / Gradle / Ivy

There is a newer version: 8.0.0
Show newest version
package net.hamnaberg.json;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class Codecs {
    public static final JsonCodec StringCodec = new JsonCodec() {
        @Override
        public Optional toJson(String value) {
            return Optional.of(Json.jString(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asString();
        }
    };

    public static final JsonCodec numberCodec = new JsonCodec() {
        @Override
        public Optional toJson(Number value) {
            return Optional.of(Json.jNumber(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asBigDecimal().map(v -> (Number) v);
        }
    };

    public static final JsonCodec longCodec = new JsonCodec() {
        @Override
        public Optional toJson(Long value) {
            return Optional.of(Json.jNumber(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asJsonNumber().map(Json.JNumber::asLong);
        }
    };

    public static final JsonCodec doubleCodec = new JsonCodec() {
        @Override
        public Optional toJson(Double value) {
            return Optional.of(Json.jNumber(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asJsonNumber().map(Json.JNumber::asDouble);
        }
    };

    public static final JsonCodec intCodec = new JsonCodec() {
        @Override
        public Optional toJson(Integer value) {
            return Optional.of(Json.jNumber(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asJsonNumber().map(Json.JNumber::asInt);
        }
    };

    public static final JsonCodec booleanCodec = new JsonCodec() {
        @Override
        public Optional toJson(Boolean value) {
            return Optional.of(Json.jBoolean(value));
        }

        @Override
        public Optional fromJson(Json.JValue value) {
            return value.asBoolean();
        }
    };

    public static  JsonCodec nullCodec() {
        return new JsonCodec() {
            @Override
            public Optional toJson(A value) {
                return Optional.of(Json.jNull());
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                return Optional.empty();
            }
        };
    }

    public static  JsonCodec> listCodec(JsonCodec codec) {
        return new JsonCodec>() {
            @Override
            public Optional> fromJson(Json.JValue value) {
                return value.asJsonArray().map(j -> j.mapOpt(codec::fromJson));
            }

            @Override
            public Optional toJson(List value) {
                return Optional.of(Json.jArray(value.stream().flatMap(a -> {
                    Optional jv = codec.toJson(a);
                    return jv.isPresent() ? Stream.of(jv.get()) : Stream.empty();
                }).collect(Collectors.toList())));
            }
        };
    }

    public static  JsonCodec> optionalCodec(JsonCodec codec) {
        return new JsonCodec>() {
            @Override
            public Optional> fromJson(Json.JValue value) {
                return Optional.of(codec.fromJson(value));
            }

            @Override
            public Optional toJson(Optional value) {
                return value.flatMap(v -> codec.toJson(v));
            }
        };
    }


    public static  javaslang.Function1> codec1(Iso> iso, JsonCodec c1) {
        return (n1) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple1 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> Optional.of(Json.jObject(Json.entry(n1, j1))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                return oa.flatMap(a -> Optional.of(iso.reverseGet(new javaslang.Tuple1<>(a))));
            }
        };
    }


    public static  javaslang.Function2> codec2(Iso> iso, JsonCodec c1, JsonCodec c2) {
        return (n1, n2) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple2 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2)))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> Optional.of(iso.reverseGet(new javaslang.Tuple2<>(a, b)))));
            }
        };
    }


    public static  javaslang.Function3> codec3(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3) {
        return (n1, n2, n3) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple3 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> Optional.of(iso.reverseGet(new javaslang.Tuple3<>(a, b, c))))));
            }
        };
    }


    public static  javaslang.Function4> codec4(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4) {
        return (n1, n2, n3, n4) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple4 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4)))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> Optional.of(iso.reverseGet(new javaslang.Tuple4<>(a, b, c, d)))))));
            }
        };
    }


    public static  javaslang.Function5> codec5(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5) {
        return (n1, n2, n3, n4, n5) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple5 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> Optional.of(iso.reverseGet(new javaslang.Tuple5<>(a, b, c, d, e))))))));
            }
        };
    }


    public static  javaslang.Function6> codec6(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6) {
        return (n1, n2, n3, n4, n5, n6) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple6 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6)))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> Optional.of(iso.reverseGet(new javaslang.Tuple6<>(a, b, c, d, e, f)))))))));
            }
        };
    }


    public static  javaslang.Function7> codec7(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7) {
        return (n1, n2, n3, n4, n5, n6, n7) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple7 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> Optional.of(iso.reverseGet(new javaslang.Tuple7<>(a, b, c, d, e, f, g))))))))));
            }
        };
    }


    public static  javaslang.Function8> codec8(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8) {
        return (n1, n2, n3, n4, n5, n6, n7, n8) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple8 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8)))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> Optional.of(iso.reverseGet(new javaslang.Tuple8<>(a, b, c, d, e, f, g, h)))))))))));
            }
        };
    }


    public static  javaslang.Function9> codec9(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple9 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> Optional.of(iso.reverseGet(new javaslang.Tuple9<>(a, b, c, d, e, f, g, h, i))))))))))));
            }
        };
    }


    public static  javaslang.Function10> codec10(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple10 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10)))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> Optional.of(iso.reverseGet(new javaslang.Tuple10<>(a, b, c, d, e, f, g, h, i, j)))))))))))));
            }
        };
    }


    public static  javaslang.Function11> codec11(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple11 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11))))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                Optional ok = object.getAs(n11, c11::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> Optional.of(iso.reverseGet(new javaslang.Tuple11<>(a, b, c, d, e, f, g, h, i, j, k))))))))))))));
            }
        };
    }


    public static  javaslang.Function12> codec12(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple12 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12)))))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                Optional ok = object.getAs(n11, c11::fromJson);
                Optional ol = object.getAs(n12, c12::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> Optional.of(iso.reverseGet(new javaslang.Tuple12<>(a, b, c, d, e, f, g, h, i, j, k, l)))))))))))))));
            }
        };
    }


    public static  javaslang.Function13> codec13(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple13 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13))))))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                Optional ok = object.getAs(n11, c11::fromJson);
                Optional ol = object.getAs(n12, c12::fromJson);
                Optional om = object.getAs(n13, c13::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> Optional.of(iso.reverseGet(new javaslang.Tuple13<>(a, b, c, d, e, f, g, h, i, j, k, l, m))))))))))))))));
            }
        };
    }


    public static  javaslang.Function14> codec14(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple14 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14)))))))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                Optional ok = object.getAs(n11, c11::fromJson);
                Optional ol = object.getAs(n12, c12::fromJson);
                Optional om = object.getAs(n13, c13::fromJson);
                Optional on = object.getAs(n14, c14::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> Optional.of(iso.reverseGet(new javaslang.Tuple14<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n)))))))))))))))));
            }
        };
    }


    public static  javaslang.Function15> codec15(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15) {
        return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15) -> new JsonCodec() {
            @Override
            public Optional toJson(TT value) {
                javaslang.Tuple15 tuple = iso.get(value);
                return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15))))))))))))))))));
            }

            @Override
            public Optional fromJson(Json.JValue value) {
                Json.JObject object = value.asJsonObjectOrEmpty();
                Optional oa = object.getAs(n1, c1::fromJson);
                Optional ob = object.getAs(n2, c2::fromJson);
                Optional oc = object.getAs(n3, c3::fromJson);
                Optional od = object.getAs(n4, c4::fromJson);
                Optional oe = object.getAs(n5, c5::fromJson);
                Optional of = object.getAs(n6, c6::fromJson);
                Optional og = object.getAs(n7, c7::fromJson);
                Optional oh = object.getAs(n8, c8::fromJson);
                Optional oi = object.getAs(n9, c9::fromJson);
                Optional oj = object.getAs(n10, c10::fromJson);
                Optional ok = object.getAs(n11, c11::fromJson);
                Optional ol = object.getAs(n12, c12::fromJson);
                Optional om = object.getAs(n13, c13::fromJson);
                Optional on = object.getAs(n14, c14::fromJson);
                Optional oo = object.getAs(n15, c15::fromJson);
                return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> Optional.of(iso.reverseGet(new javaslang.Tuple15<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o))))))))))))))))));
            }
        };
    }


    public static  javaslang.Function16> codec16(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

op = object.getAs(n16, c16::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> Optional.of(iso.reverseGet(new javaslang.Tuple16<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p))))))))))))))))))); } }; } public static javaslang.Function17> codec17(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple17 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17)))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> Optional.of(iso.reverseGet(new javaslang.Tuple17<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)))))))))))))))))))); } }; } public static javaslang.Function18> codec18(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17, JsonCodec c18) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple18 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> c18.toJson(tuple._18).flatMap(j18 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17), Json.entry(n18, j18))))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); Optional or = object.getAs(n18, c18::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> or.flatMap(r -> Optional.of(iso.reverseGet(new javaslang.Tuple18<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r))))))))))))))))))))); } }; } public static javaslang.Function19> codec19(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17, JsonCodec c18, JsonCodec c19) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple19 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> c18.toJson(tuple._18).flatMap(j18 -> c19.toJson(tuple._19).flatMap(j19 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17), Json.entry(n18, j18), Json.entry(n19, j19)))))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); Optional or = object.getAs(n18, c18::fromJson); Optional os = object.getAs(n19, c19::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> or.flatMap(r -> os.flatMap(s -> Optional.of(iso.reverseGet(new javaslang.Tuple19<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)))))))))))))))))))))); } }; } public static javaslang.Function20> codec20(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17, JsonCodec c18, JsonCodec c19, JsonCodec c20) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple20 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> c18.toJson(tuple._18).flatMap(j18 -> c19.toJson(tuple._19).flatMap(j19 -> c20.toJson(tuple._20).flatMap(j20 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17), Json.entry(n18, j18), Json.entry(n19, j19), Json.entry(n20, j20))))))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); Optional or = object.getAs(n18, c18::fromJson); Optional os = object.getAs(n19, c19::fromJson); Optional ot = object.getAs(n20, c20::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> or.flatMap(r -> os.flatMap(s -> ot.flatMap(t -> Optional.of(iso.reverseGet(new javaslang.Tuple20<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t))))))))))))))))))))))); } }; } public static javaslang.Function21> codec21(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17, JsonCodec c18, JsonCodec c19, JsonCodec c20, JsonCodec c21) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20, n21) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple21 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> c18.toJson(tuple._18).flatMap(j18 -> c19.toJson(tuple._19).flatMap(j19 -> c20.toJson(tuple._20).flatMap(j20 -> c21.toJson(tuple._21).flatMap(j21 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17), Json.entry(n18, j18), Json.entry(n19, j19), Json.entry(n20, j20), Json.entry(n21, j21)))))))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); Optional or = object.getAs(n18, c18::fromJson); Optional os = object.getAs(n19, c19::fromJson); Optional ot = object.getAs(n20, c20::fromJson); Optional ou = object.getAs(n21, c21::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> or.flatMap(r -> os.flatMap(s -> ot.flatMap(t -> ou.flatMap(u -> Optional.of(iso.reverseGet(new javaslang.Tuple21<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)))))))))))))))))))))))); } }; } public static javaslang.Function22> codec22(Iso> iso, JsonCodec c1, JsonCodec c2, JsonCodec c3, JsonCodec c4, JsonCodec c5, JsonCodec c6, JsonCodec c7, JsonCodec c8, JsonCodec c9, JsonCodec c10, JsonCodec c11, JsonCodec c12, JsonCodec c13, JsonCodec c14, JsonCodec c15, JsonCodec

c16, JsonCodec c17, JsonCodec c18, JsonCodec c19, JsonCodec c20, JsonCodec c21, JsonCodec c22) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20, n21, n22) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple22 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> c17.toJson(tuple._17).flatMap(j17 -> c18.toJson(tuple._18).flatMap(j18 -> c19.toJson(tuple._19).flatMap(j19 -> c20.toJson(tuple._20).flatMap(j20 -> c21.toJson(tuple._21).flatMap(j21 -> c22.toJson(tuple._22).flatMap(j22 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16), Json.entry(n17, j17), Json.entry(n18, j18), Json.entry(n19, j19), Json.entry(n20, j20), Json.entry(n21, j21), Json.entry(n22, j22))))))))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

c16) { return (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16) -> new JsonCodec() { @Override public Optional toJson(TT value) { javaslang.Tuple16 tuple = iso.get(value); return c1.toJson(tuple._1).flatMap(j1 -> c2.toJson(tuple._2).flatMap(j2 -> c3.toJson(tuple._3).flatMap(j3 -> c4.toJson(tuple._4).flatMap(j4 -> c5.toJson(tuple._5).flatMap(j5 -> c6.toJson(tuple._6).flatMap(j6 -> c7.toJson(tuple._7).flatMap(j7 -> c8.toJson(tuple._8).flatMap(j8 -> c9.toJson(tuple._9).flatMap(j9 -> c10.toJson(tuple._10).flatMap(j10 -> c11.toJson(tuple._11).flatMap(j11 -> c12.toJson(tuple._12).flatMap(j12 -> c13.toJson(tuple._13).flatMap(j13 -> c14.toJson(tuple._14).flatMap(j14 -> c15.toJson(tuple._15).flatMap(j15 -> c16.toJson(tuple._16).flatMap(j16 -> Optional.of(Json.jObject(Json.entry(n1, j1), Json.entry(n2, j2), Json.entry(n3, j3), Json.entry(n4, j4), Json.entry(n5, j5), Json.entry(n6, j6), Json.entry(n7, j7), Json.entry(n8, j8), Json.entry(n9, j9), Json.entry(n10, j10), Json.entry(n11, j11), Json.entry(n12, j12), Json.entry(n13, j13), Json.entry(n14, j14), Json.entry(n15, j15), Json.entry(n16, j16))))))))))))))))))); } @Override public Optional fromJson(Json.JValue value) { Json.JObject object = value.asJsonObjectOrEmpty(); Optional oa = object.getAs(n1, c1::fromJson); Optional ob = object.getAs(n2, c2::fromJson); Optional oc = object.getAs(n3, c3::fromJson); Optional od = object.getAs(n4, c4::fromJson); Optional oe = object.getAs(n5, c5::fromJson); Optional of = object.getAs(n6, c6::fromJson); Optional og = object.getAs(n7, c7::fromJson); Optional oh = object.getAs(n8, c8::fromJson); Optional oi = object.getAs(n9, c9::fromJson); Optional oj = object.getAs(n10, c10::fromJson); Optional ok = object.getAs(n11, c11::fromJson); Optional ol = object.getAs(n12, c12::fromJson); Optional om = object.getAs(n13, c13::fromJson); Optional on = object.getAs(n14, c14::fromJson); Optional oo = object.getAs(n15, c15::fromJson); Optional

op = object.getAs(n16, c16::fromJson); Optional oq = object.getAs(n17, c17::fromJson); Optional or = object.getAs(n18, c18::fromJson); Optional os = object.getAs(n19, c19::fromJson); Optional ot = object.getAs(n20, c20::fromJson); Optional ou = object.getAs(n21, c21::fromJson); Optional ov = object.getAs(n22, c22::fromJson); return oa.flatMap(a -> ob.flatMap(b -> oc.flatMap(c -> od.flatMap(d -> oe.flatMap(e -> of.flatMap(f -> og.flatMap(g -> oh.flatMap(h -> oi.flatMap(i -> oj.flatMap(j -> ok.flatMap(k -> ol.flatMap(l -> om.flatMap(m -> on.flatMap(n -> oo.flatMap(o -> op.flatMap(p -> oq.flatMap(q -> or.flatMap(r -> os.flatMap(s -> ot.flatMap(t -> ou.flatMap(u -> ov.flatMap(v -> Optional.of(iso.reverseGet(new javaslang.Tuple22<>(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v))))))))))))))))))))))))); } }; } }