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 com.mojang.datafixers.util.Function7; import com.mojang.datafixers.util.Function8; import com.mojang.datafixers.util.Function9; 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 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, StreamCodec codec7, Function getter7, Function7 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); T7 object8 = codec7.decode(object); return factory.apply(object2, object3, object4, object5, object6, object7, object8); } @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)); codec7.encode(object, (T7)getter7.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, StreamCodec codec7, Function getter7, StreamCodec codec8, Function getter8, Function8 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); T7 object8 = codec7.decode(object); T8 object9 = codec8.decode(object); return factory.apply(object2, object3, object4, object5, object6, object7, object8, object9); } @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)); codec7.encode(object, (T7)getter7.apply(object2)); codec8.encode(object, (T8)getter8.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, StreamCodec codec7, Function getter7, StreamCodec codec8, Function getter8, StreamCodec codec9, Function getter9, Function9 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); T7 object8 = codec7.decode(object); T8 object9 = codec8.decode(object); T9 object10 = codec9.decode(object); return factory.apply(object2, object3, object4, object5, object6, object7, object8, object9, object10); } @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)); codec7.encode(object, (T7)getter7.apply(object2)); codec8.encode(object, (T8)getter8.apply(object2)); codec9.encode(object, (T9)getter9.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); } }