package net.minecraft.network.codec; import com.google.common.base.Suppliers; import com.mojang.datafixers.util.Function3; import com.mojang.datafixers.util.Function4; import com.mojang.datafixers.util.Function5; import com.mojang.datafixers.util.Function6; import io.netty.buffer.ByteBuf; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; import java.util.function.UnaryOperator; public interface StreamCodec extends StreamDecoder, StreamEncoder { static StreamCodec of(StreamEncoder encoder, StreamDecoder decoder) { return new StreamCodec() { @Override public V decode(B object) { return decoder.decode(object); } @Override public void encode(B object, V object2) { encoder.encode(object, object2); } }; } static StreamCodec ofMember(StreamMemberEncoder encoder, StreamDecoder decoder) { return new StreamCodec() { @Override public V decode(B object) { return decoder.decode(object); } @Override public void encode(B object, V object2) { encoder.encode(object2, object); } }; } static StreamCodec unit(V expectedValue) { return new StreamCodec() { @Override public V decode(B object) { return expectedValue; } @Override public void encode(B object, V object2) { if (!object2.equals(expectedValue)) { throw new IllegalStateException("Can't encode '" + object2 + "', expected '" + expectedValue + "'"); } } }; } default StreamCodec apply(StreamCodec.CodecOperation operation) { return operation.apply(this); } default StreamCodec map(Function factory, Function getter) { return new StreamCodec() { @Override public O decode(B object) { return (O)factory.apply(StreamCodec.this.decode(object)); } @Override public void encode(B object, O object2) { StreamCodec.this.encode(object, (V)getter.apply(object2)); } }; } default StreamCodec mapStream(Function bufferFactory) { return new StreamCodec() { public V decode(O byteBuf) { B object = (B)bufferFactory.apply(byteBuf); return StreamCodec.this.decode(object); } public void encode(O byteBuf, V object) { B object2 = (B)bufferFactory.apply(byteBuf); StreamCodec.this.encode(object2, object); } }; } default StreamCodec dispatch( Function keyGetter, Function> codecGetter ) { return new StreamCodec() { @Override public U decode(B object) { V object2 = StreamCodec.this.decode(object); StreamCodec streamCodec = (StreamCodec)codecGetter.apply(object2); return (U)streamCodec.decode(object); } @Override public void encode(B object, U object2) { V object3 = (V)keyGetter.apply(object2); StreamCodec streamCodec = (StreamCodec)codecGetter.apply(object3); StreamCodec.this.encode(object, object3); streamCodec.encode(object, object2); } }; } static StreamCodec composite(StreamCodec codec, Function getter, Function factory) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec.decode(object); return (C)factory.apply(object2); } @Override public void encode(B object, C object2) { codec.encode(object, (T1)getter.apply(object2)); } }; } static StreamCodec composite( StreamCodec codec1, Function getter1, StreamCodec codec2, Function getter2, BiFunction factory ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec1.decode(object); T2 object3 = codec2.decode(object); return (C)factory.apply(object2, object3); } @Override public void encode(B object, C object2) { codec1.encode(object, (T1)getter1.apply(object2)); codec2.encode(object, (T2)getter2.apply(object2)); } }; } static StreamCodec composite( StreamCodec codec1, Function getter1, StreamCodec codec2, Function getter2, StreamCodec codec3, Function getter3, Function3 factory ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec1.decode(object); T2 object3 = codec2.decode(object); T3 object4 = codec3.decode(object); return factory.apply(object2, object3, object4); } @Override public void encode(B object, C object2) { codec1.encode(object, (T1)getter1.apply(object2)); codec2.encode(object, (T2)getter2.apply(object2)); codec3.encode(object, (T3)getter3.apply(object2)); } }; } static StreamCodec composite( StreamCodec codec1, Function getter1, StreamCodec codec2, Function getter2, StreamCodec codec3, Function getter3, StreamCodec codec4, Function getter4, Function4 factory ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec1.decode(object); T2 object3 = codec2.decode(object); T3 object4 = codec3.decode(object); T4 object5 = codec4.decode(object); return factory.apply(object2, object3, object4, object5); } @Override public void encode(B object, C object2) { codec1.encode(object, (T1)getter1.apply(object2)); codec2.encode(object, (T2)getter2.apply(object2)); codec3.encode(object, (T3)getter3.apply(object2)); codec4.encode(object, (T4)getter4.apply(object2)); } }; } static StreamCodec composite( StreamCodec codec1, Function getter1, StreamCodec codec2, Function getter2, StreamCodec codec3, Function getter3, StreamCodec codec4, Function getter4, StreamCodec codec5, Function getter5, Function5 factory ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec1.decode(object); T2 object3 = codec2.decode(object); T3 object4 = codec3.decode(object); T4 object5 = codec4.decode(object); T5 object6 = codec5.decode(object); return factory.apply(object2, object3, object4, object5, object6); } @Override public void encode(B object, C object2) { codec1.encode(object, (T1)getter1.apply(object2)); codec2.encode(object, (T2)getter2.apply(object2)); codec3.encode(object, (T3)getter3.apply(object2)); codec4.encode(object, (T4)getter4.apply(object2)); codec5.encode(object, (T5)getter5.apply(object2)); } }; } static StreamCodec composite( StreamCodec codec1, Function getter1, StreamCodec codec2, Function getter2, StreamCodec codec3, Function getter3, StreamCodec codec4, Function getter4, StreamCodec codec5, Function getter5, StreamCodec codec6, Function getter6, Function6 factory ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = codec1.decode(object); T2 object3 = codec2.decode(object); T3 object4 = codec3.decode(object); T4 object5 = codec4.decode(object); T5 object6 = codec5.decode(object); T6 object7 = codec6.decode(object); return factory.apply(object2, object3, object4, object5, object6, object7); } @Override public void encode(B object, C object2) { codec1.encode(object, (T1)getter1.apply(object2)); codec2.encode(object, (T2)getter2.apply(object2)); codec3.encode(object, (T3)getter3.apply(object2)); codec4.encode(object, (T4)getter4.apply(object2)); codec5.encode(object, (T5)getter5.apply(object2)); codec6.encode(object, (T6)getter6.apply(object2)); } }; } static StreamCodec recursive(UnaryOperator> modifier) { return new StreamCodec() { private final Supplier> inner = Suppliers.memoize(() -> (StreamCodec)modifier.apply(this)); @Override public T decode(B object) { return (T)((StreamCodec)this.inner.get()).decode(object); } @Override public void encode(B object, T object2) { ((StreamCodec)this.inner.get()).encode(object, (V)object2); } }; } default StreamCodec cast() { return this; } @FunctionalInterface public interface CodecOperation { StreamCodec apply(StreamCodec streamCodec); } }