diff options
author | Linnea Gräf <nea@nea.moe> | 2024-11-16 17:20:52 +0100 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-11-16 17:20:52 +0100 |
commit | aad6ebad69685abd4b7711039d91d5c19dfbf61f (patch) | |
tree | 27eb2b806ac01db251b08ed5794ac81a50603327 /src/main/java/moe/nea/pcj/json/MapCodec.java | |
parent | 63cb7a0e19e7afd06637dddb848d0254cbff5795 (diff) | |
download | profunctor-codecs-java-aad6ebad69685abd4b7711039d91d5c19dfbf61f.tar.gz profunctor-codecs-java-aad6ebad69685abd4b7711039d91d5c19dfbf61f.tar.bz2 profunctor-codecs-java-aad6ebad69685abd4b7711039d91d5c19dfbf61f.zip |
chore: create subproject for core
Diffstat (limited to 'src/main/java/moe/nea/pcj/json/MapCodec.java')
-rw-r--r-- | src/main/java/moe/nea/pcj/json/MapCodec.java | 64 |
1 files changed, 0 insertions, 64 deletions
diff --git a/src/main/java/moe/nea/pcj/json/MapCodec.java b/src/main/java/moe/nea/pcj/json/MapCodec.java deleted file mode 100644 index 9f343fd..0000000 --- a/src/main/java/moe/nea/pcj/json/MapCodec.java +++ /dev/null @@ -1,64 +0,0 @@ -package moe.nea.pcj.json; - -import moe.nea.pcj.Result; - -import java.util.function.Function; - -public interface MapCodec<T, Format> { - Result<? extends T, JsonLikeError> decode( - RecordView<Format> record, - JsonLikeOperations<Format> ops); - - Result<RecordBuilder<Format>, JsonLikeError> encode(T value, JsonLikeOperations<Format> ops); - - default <O> MapCodec<? extends O, Format> dispatch( - Function<? super O, ? extends T> keyExtractor, - Function<? super T, Result<? extends MapCodec<? extends O, Format>, ? extends JsonLikeError>> codecGenerator - ) { - // TODO: the codecGenerator function is not exactly typesafe. there should be some limit on keyExtractor and codecGenerator working in tandem - return new MapCodec<>() { - @Override - public Result<O, JsonLikeError> decode(RecordView<Format> record, JsonLikeOperations<Format> ops) { // TODO: map errors - return MapCodec.this.decode(record, ops) - .flatMap(key -> codecGenerator - .apply(key) - .<JsonLikeError>mapError(DuringKeyExtraction::new) - .flatMap(codec -> codec.decode(record, ops) - .<JsonLikeError>mapError(it -> new InSubType<>(key, it)))); - } - - @Override - public Result<RecordBuilder<Format>, JsonLikeError> encode(O value, JsonLikeOperations<Format> ops) { - var key = keyExtractor.apply(value); - return Result.<MapCodec<? extends O, Format>, JsonLikeError>cast( - codecGenerator.apply(key) - .mapError(DuringKeyExtraction::new)) - .flatMap(codec -> MapCodec.this - .encode(key, ops) - .flatMap(keyEncoded -> ((MapCodec<O, Format>) codec) - .encode(value, ops) - .<JsonLikeError>mapError(it -> new InSubType<>(key, it)) - .flatMap(keyEncoded::mergeWith))); - } - }; - } - - default JsonCodec<T, Format> codec() { - return new JsonCodec<>() { - @Override - public Result<? extends T, ? extends JsonLikeError> decode(Format format, JsonLikeOperations<Format> ops) { - return Result.<RecordView<Format>, JsonLikeError>cast(ops.getObject(format)) - .flatMap(record -> MapCodec.this.decode(record, ops)); - } - - @Override - public Result<? extends Format, ? extends JsonLikeError> encode(T data, JsonLikeOperations<Format> ops) { - return Result.cast(MapCodec.this.encode(data, ops)).map(RecordBuilder::complete); - } - }; - } - - default <O> RecordCodec<O, T, Format> withGetter(Function<O, T> getter) { - return new RecordCodec<>(this, getter); - } -} |