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 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 streamCodec, Function function, StreamCodec streamCodec2, Function function2, StreamCodec streamCodec3, Function function3, StreamCodec streamCodec4, Function function4, StreamCodec streamCodec5, Function function5, StreamCodec streamCodec6, Function function6, StreamCodec streamCodec7, Function function7, Function7 function72 ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = streamCodec.decode(object); T2 object3 = streamCodec2.decode(object); T3 object4 = streamCodec3.decode(object); T4 object5 = streamCodec4.decode(object); T5 object6 = streamCodec5.decode(object); T6 object7 = streamCodec6.decode(object); T7 object8 = streamCodec7.decode(object); return function72.apply(object2, object3, object4, object5, object6, object7, object8); } @Override public void encode(B object, C object2) { streamCodec.encode(object, (T1)function.apply(object2)); streamCodec2.encode(object, (T2)function2.apply(object2)); streamCodec3.encode(object, (T3)function3.apply(object2)); streamCodec4.encode(object, (T4)function4.apply(object2)); streamCodec5.encode(object, (T5)function5.apply(object2)); streamCodec6.encode(object, (T6)function6.apply(object2)); streamCodec7.encode(object, (T7)function7.apply(object2)); } }; } static StreamCodec composite( StreamCodec streamCodec, Function function, StreamCodec streamCodec2, Function function2, StreamCodec streamCodec3, Function function3, StreamCodec streamCodec4, Function function4, StreamCodec streamCodec5, Function function5, StreamCodec streamCodec6, Function function6, StreamCodec streamCodec7, Function function7, StreamCodec streamCodec8, Function function8, Function8 function82 ) { return new StreamCodec() { @Override public C decode(B object) { T1 object2 = streamCodec.decode(object); T2 object3 = streamCodec2.decode(object); T3 object4 = streamCodec3.decode(object); T4 object5 = streamCodec4.decode(object); T5 object6 = streamCodec5.decode(object); T6 object7 = streamCodec6.decode(object); T7 object8 = streamCodec7.decode(object); T8 object9 = streamCodec8.decode(object); return function82.apply(object2, object3, object4, object5, object6, object7, object8, object9); } @Override public void encode(B object, C object2) { streamCodec.encode(object, (T1)function.apply(object2)); streamCodec2.encode(object, (T2)function2.apply(object2)); streamCodec3.encode(object, (T3)function3.apply(object2)); streamCodec4.encode(object, (T4)function4.apply(object2)); streamCodec5.encode(object, (T5)function5.apply(object2)); streamCodec6.encode(object, (T6)function6.apply(object2)); streamCodec7.encode(object, (T7)function7.apply(object2)); streamCodec8.encode(object, (T8)function8.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); } }