public static EndianProvider <TResult> New <TResult, T1, T2, T3, T4>(
            Func <T1, T2, T3, T4, TResult> create,
            IEndianProvider <T1> part1,
            IEndianProvider <T2> part2,
            IEndianProvider <T3> part3,
            IEndianProvider <T4> part4)
            where TResult : IEndianSpecific
            where T1 : IEndianSpecific
            where T2 : IEndianSpecific
            where T3 : IEndianSpecific
            where T4 : IEndianSpecific
        {
            Contracts.Requires.That(create != null);
            Contracts.Requires.That(part1 != null);
            Contracts.Requires.That(part2 != null);
            Contracts.Requires.That(part3 != null);
            Contracts.Requires.That(part4 != null);

            var bigEndian = create(
                part1.BigEndian,
                part2.BigEndian,
                part3.BigEndian,
                part4.BigEndian);
            var littleEndian = create(
                part1.LittleEndian,
                part2.LittleEndian,
                part3.LittleEndian,
                part4.LittleEndian);

            return(new EndianProvider <TResult>(bigEndian, littleEndian));
        }
        public static EndianProvider <TResult> New <TResult, T1, T2, T3, T4, T5, T6, T7, T8>(
            Func <T1, T2, T3, T4, T5, T6, T7, T8, TResult> create,
            IEndianProvider <T1> part1,
            IEndianProvider <T2> part2,
            IEndianProvider <T3> part3,
            IEndianProvider <T4> part4,
            IEndianProvider <T5> part5,
            IEndianProvider <T6> part6,
            IEndianProvider <T7> part7,
            IEndianProvider <T8> part8)
            where TResult : IEndianSpecific
            where T1 : IEndianSpecific
            where T2 : IEndianSpecific
            where T3 : IEndianSpecific
            where T4 : IEndianSpecific
            where T5 : IEndianSpecific
            where T6 : IEndianSpecific
            where T7 : IEndianSpecific
            where T8 : IEndianSpecific
        {
            Contracts.Requires.That(create != null);
            Contracts.Requires.That(part1 != null);
            Contracts.Requires.That(part2 != null);
            Contracts.Requires.That(part3 != null);
            Contracts.Requires.That(part4 != null);
            Contracts.Requires.That(part5 != null);
            Contracts.Requires.That(part6 != null);
            Contracts.Requires.That(part7 != null);
            Contracts.Requires.That(part8 != null);

            var bigEndian = create(
                part1.BigEndian,
                part2.BigEndian,
                part3.BigEndian,
                part4.BigEndian,
                part5.BigEndian,
                part6.BigEndian,
                part7.BigEndian,
                part8.BigEndian);
            var littleEndian = create(
                part1.LittleEndian,
                part2.LittleEndian,
                part3.LittleEndian,
                part4.LittleEndian,
                part5.LittleEndian,
                part6.LittleEndian,
                part7.LittleEndian,
                part8.LittleEndian);

            return(new EndianProvider <TResult>(bigEndian, littleEndian));
        }
 public static IEndianProvider <InferCountSerializer> InferCount <T>(IEndianProvider <T> provider)
     where T : IConstantSerializedLength =>
 EndianProvider.New(value => new InferCountSerializer(value), provider);
        public static EndianProvider <TResult> New <TResult, T>(Func <T, TResult> create, IEndianProvider <T> part)
            where TResult : IEndianSpecific
            where T : IEndianSpecific
        {
            Contracts.Requires.That(create != null);
            Contracts.Requires.That(part != null);

            var bigEndian    = create(part.BigEndian);
            var littleEndian = create(part.LittleEndian);

            return(new EndianProvider <TResult>(bigEndian, littleEndian));
        }