summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/pcj/json/MapCodec.java
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-16 17:20:52 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-16 17:20:52 +0100
commitaad6ebad69685abd4b7711039d91d5c19dfbf61f (patch)
tree27eb2b806ac01db251b08ed5794ac81a50603327 /src/main/java/moe/nea/pcj/json/MapCodec.java
parent63cb7a0e19e7afd06637dddb848d0254cbff5795 (diff)
downloadprofunctor-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.java64
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);
- }
-}