Skip to main content

object_rainbow/impls/
tuple.rs

1use std::cmp::Ordering;
2
3use typenum::tarr;
4
5use crate::*;
6
7impl<A: InlineOutput, B: ToOutput> ToOutput for (A, B) {
8    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
9        self.0.to_output(output);
10        self.1.to_output(output);
11    }
12}
13
14impl<A: InlineOutput, B: InlineOutput> InlineOutput for (A, B) {}
15
16impl<A: ListHashes, B: ListHashes> ListHashes for (A, B) {
17    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
18        self.0.list_hashes(f);
19        self.1.list_hashes(f);
20    }
21}
22
23impl<A: Topological, B: Topological> Topological for (A, B) {
24    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
25        self.0.traverse(visitor);
26        self.1.traverse(visitor);
27    }
28}
29
30impl<A: Tagged, B: Tagged> Tagged for (A, B) {
31    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS]);
32}
33
34impl<A: Size, B: Size> Size for (A, B)
35where
36    tarr![A::Size, B::Size,]: typenum::FoldAdd<Output: Unsigned>,
37{
38    const SIZE: usize = A::SIZE + B::SIZE;
39
40    type Size = <tarr![A::Size, B::Size,] as typenum::FoldAdd>::Output;
41}
42
43impl<II: ParseInput, A: ParseInline<II>, B: Parse<II>> Parse<II> for (A, B) {
44    fn parse(mut input: II) -> crate::Result<Self> {
45        Ok((input.parse_inline()?, input.parse()?))
46    }
47}
48
49impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>> ParseInline<II> for (A, B) {
50    fn parse_inline(input: &mut II) -> crate::Result<Self> {
51        Ok((input.parse_inline()?, input.parse_inline()?))
52    }
53}
54
55impl<A: MaybeHasNiche, B: MaybeHasNiche> MaybeHasNiche for (A, B) {
56    type MnArray = tarr![A::MnArray, B::MnArray,];
57}
58
59impl<A: ByteOrd + InlineOutput, B: ByteOrd> ByteOrd for (A, B) {
60    fn bytes_cmp(&self, other: &Self) -> Ordering {
61        Ordering::Equal
62            .then_with(|| self.0.bytes_cmp(&other.0))
63            .then_with(|| self.1.bytes_cmp(&other.1))
64    }
65}
66
67impl<A: Monostate, B: Monostate> Monostate for (A, B) {}
68
69impl<A: InlineOutput, B: InlineOutput, C: ToOutput> ToOutput for (A, B, C) {
70    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
71        self.0.to_output(output);
72        self.1.to_output(output);
73        self.2.to_output(output);
74    }
75}
76
77impl<A: InlineOutput, B: InlineOutput, C: InlineOutput> InlineOutput for (A, B, C) {}
78
79impl<A: ListHashes, B: ListHashes, C: ListHashes> ListHashes for (A, B, C) {
80    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
81        self.0.list_hashes(f);
82        self.1.list_hashes(f);
83        self.2.list_hashes(f);
84    }
85}
86
87impl<A: Topological, B: Topological, C: Topological> Topological for (A, B, C) {
88    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
89        self.0.traverse(visitor);
90        self.1.traverse(visitor);
91        self.2.traverse(visitor);
92    }
93}
94
95impl<A: Tagged, B: Tagged, C: Tagged> Tagged for (A, B, C) {
96    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS]);
97}
98
99impl<A: Size, B: Size, C: Size> Size for (A, B, C)
100where
101    tarr![A::Size, B::Size, C::Size,]: typenum::FoldAdd<Output: Unsigned>,
102{
103    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE;
104
105    type Size = <tarr![A::Size, B::Size, C::Size,] as typenum::FoldAdd>::Output;
106}
107
108impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: Parse<II>> Parse<II> for (A, B, C) {
109    fn parse(mut input: II) -> crate::Result<Self> {
110        Ok((input.parse_inline()?, input.parse_inline()?, input.parse()?))
111    }
112}
113
114impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>> ParseInline<II>
115    for (A, B, C)
116{
117    fn parse_inline(input: &mut II) -> crate::Result<Self> {
118        Ok((
119            input.parse_inline()?,
120            input.parse_inline()?,
121            input.parse_inline()?,
122        ))
123    }
124}
125
126impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche> MaybeHasNiche for (A, B, C) {
127    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray,];
128}
129
130impl<A: ByteOrd + InlineOutput, B: ByteOrd + InlineOutput, C: ByteOrd> ByteOrd for (A, B, C) {
131    fn bytes_cmp(&self, other: &Self) -> Ordering {
132        Ordering::Equal
133            .then_with(|| self.0.bytes_cmp(&other.0))
134            .then_with(|| self.1.bytes_cmp(&other.1))
135            .then_with(|| self.2.bytes_cmp(&other.2))
136    }
137}
138
139impl<A: Monostate, B: Monostate, C: Monostate> Monostate for (A, B, C) {}
140
141impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: ToOutput> ToOutput for (A, B, C, D) {
142    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
143        self.0.to_output(output);
144        self.1.to_output(output);
145        self.2.to_output(output);
146        self.3.to_output(output);
147    }
148}
149
150impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput> InlineOutput
151    for (A, B, C, D)
152{
153}
154
155impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes> ListHashes for (A, B, C, D) {
156    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
157        self.0.list_hashes(f);
158        self.1.list_hashes(f);
159        self.2.list_hashes(f);
160        self.3.list_hashes(f);
161    }
162}
163
164impl<A: Topological, B: Topological, C: Topological, D: Topological> Topological for (A, B, C, D) {
165    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
166        self.0.traverse(visitor);
167        self.1.traverse(visitor);
168        self.2.traverse(visitor);
169        self.3.traverse(visitor);
170    }
171}
172
173impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged> Tagged for (A, B, C, D) {
174    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS]);
175}
176
177impl<A: Size, B: Size, C: Size, D: Size> Size for (A, B, C, D)
178where
179    tarr![A::Size, B::Size, C::Size, D::Size,]: typenum::FoldAdd<Output: Unsigned>,
180{
181    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE;
182
183    type Size = <tarr![A::Size, B::Size, C::Size, D::Size,] as typenum::FoldAdd>::Output;
184}
185
186impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>, D: Parse<II>>
187    Parse<II> for (A, B, C, D)
188{
189    fn parse(mut input: II) -> crate::Result<Self> {
190        Ok((
191            input.parse_inline()?,
192            input.parse_inline()?,
193            input.parse_inline()?,
194            input.parse()?,
195        ))
196    }
197}
198
199impl<II: ParseInput, A: ParseInline<II>, B: ParseInline<II>, C: ParseInline<II>, D: ParseInline<II>>
200    ParseInline<II> for (A, B, C, D)
201{
202    fn parse_inline(input: &mut II) -> crate::Result<Self> {
203        Ok((
204            input.parse_inline()?,
205            input.parse_inline()?,
206            input.parse_inline()?,
207            input.parse_inline()?,
208        ))
209    }
210}
211
212impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche, D: MaybeHasNiche> MaybeHasNiche
213    for (A, B, C, D)
214{
215    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray, D::MnArray,];
216}
217
218impl<A: ByteOrd + InlineOutput, B: ByteOrd + InlineOutput, C: ByteOrd + InlineOutput, D: ByteOrd>
219    ByteOrd for (A, B, C, D)
220{
221    fn bytes_cmp(&self, other: &Self) -> Ordering {
222        Ordering::Equal
223            .then_with(|| self.0.bytes_cmp(&other.0))
224            .then_with(|| self.1.bytes_cmp(&other.1))
225            .then_with(|| self.2.bytes_cmp(&other.2))
226            .then_with(|| self.3.bytes_cmp(&other.3))
227    }
228}
229
230impl<A: Monostate, B: Monostate, C: Monostate, D: Monostate> Monostate for (A, B, C, D) {}
231
232impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput, E: ToOutput> ToOutput
233    for (A, B, C, D, E)
234{
235    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
236        self.0.to_output(output);
237        self.1.to_output(output);
238        self.2.to_output(output);
239        self.3.to_output(output);
240        self.4.to_output(output);
241    }
242}
243
244impl<A: InlineOutput, B: InlineOutput, C: InlineOutput, D: InlineOutput, E: InlineOutput>
245    InlineOutput for (A, B, C, D, E)
246{
247}
248
249impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes, E: ListHashes> ListHashes
250    for (A, B, C, D, E)
251{
252    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
253        self.0.list_hashes(f);
254        self.1.list_hashes(f);
255        self.2.list_hashes(f);
256        self.3.list_hashes(f);
257        self.4.list_hashes(f);
258    }
259}
260
261impl<A: Topological, B: Topological, C: Topological, D: Topological, E: Topological> Topological
262    for (A, B, C, D, E)
263{
264    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
265        self.0.traverse(visitor);
266        self.1.traverse(visitor);
267        self.2.traverse(visitor);
268        self.3.traverse(visitor);
269        self.4.traverse(visitor);
270    }
271}
272
273impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged> Tagged for (A, B, C, D, E) {
274    const TAGS: Tags = Tags(&[], &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS, &E::TAGS]);
275}
276
277impl<A: Size, B: Size, C: Size, D: Size, E: Size> Size for (A, B, C, D, E)
278where
279    tarr![A::Size, B::Size, C::Size, D::Size, E::Size,]: typenum::FoldAdd<Output: Unsigned>,
280{
281    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE;
282
283    type Size = <tarr![A::Size, B::Size, C::Size, D::Size, E::Size,] as typenum::FoldAdd>::Output;
284}
285
286impl<
287    II: ParseInput,
288    A: ParseInline<II>,
289    B: ParseInline<II>,
290    C: ParseInline<II>,
291    D: ParseInline<II>,
292    E: Parse<II>,
293> Parse<II> for (A, B, C, D, E)
294{
295    fn parse(mut input: II) -> crate::Result<Self> {
296        Ok((
297            input.parse_inline()?,
298            input.parse_inline()?,
299            input.parse_inline()?,
300            input.parse_inline()?,
301            input.parse()?,
302        ))
303    }
304}
305
306impl<
307    II: ParseInput,
308    A: ParseInline<II>,
309    B: ParseInline<II>,
310    C: ParseInline<II>,
311    D: ParseInline<II>,
312    E: ParseInline<II>,
313> ParseInline<II> for (A, B, C, D, E)
314{
315    fn parse_inline(input: &mut II) -> crate::Result<Self> {
316        Ok((
317            input.parse_inline()?,
318            input.parse_inline()?,
319            input.parse_inline()?,
320            input.parse_inline()?,
321            input.parse_inline()?,
322        ))
323    }
324}
325
326impl<A: MaybeHasNiche, B: MaybeHasNiche, C: MaybeHasNiche, D: MaybeHasNiche, E: MaybeHasNiche>
327    MaybeHasNiche for (A, B, C, D, E)
328{
329    type MnArray = tarr![A::MnArray, B::MnArray, C::MnArray, D::MnArray, E::MnArray,];
330}
331
332impl<
333    A: ByteOrd + InlineOutput,
334    B: ByteOrd + InlineOutput,
335    C: ByteOrd + InlineOutput,
336    D: ByteOrd + InlineOutput,
337    E: ByteOrd,
338> ByteOrd for (A, B, C, D, E)
339{
340    fn bytes_cmp(&self, other: &Self) -> Ordering {
341        Ordering::Equal
342            .then_with(|| self.0.bytes_cmp(&other.0))
343            .then_with(|| self.1.bytes_cmp(&other.1))
344            .then_with(|| self.2.bytes_cmp(&other.2))
345            .then_with(|| self.3.bytes_cmp(&other.3))
346            .then_with(|| self.4.bytes_cmp(&other.4))
347    }
348}
349
350impl<A: Monostate, B: Monostate, C: Monostate, D: Monostate, E: Monostate> Monostate
351    for (A, B, C, D, E)
352{
353}
354
355impl<
356    A: InlineOutput,
357    B: InlineOutput,
358    C: InlineOutput,
359    D: InlineOutput,
360    E: InlineOutput,
361    F: ToOutput,
362> ToOutput for (A, B, C, D, E, F)
363{
364    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
365        self.0.to_output(output);
366        self.1.to_output(output);
367        self.2.to_output(output);
368        self.3.to_output(output);
369        self.4.to_output(output);
370        self.5.to_output(output);
371    }
372}
373
374impl<
375    A: InlineOutput,
376    B: InlineOutput,
377    C: InlineOutput,
378    D: InlineOutput,
379    E: InlineOutput,
380    F: InlineOutput,
381> InlineOutput for (A, B, C, D, E, F)
382{
383}
384
385impl<A: ListHashes, B: ListHashes, C: ListHashes, D: ListHashes, E: ListHashes, F: ListHashes>
386    ListHashes for (A, B, C, D, E, F)
387{
388    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
389        self.0.list_hashes(f);
390        self.1.list_hashes(f);
391        self.2.list_hashes(f);
392        self.3.list_hashes(f);
393        self.4.list_hashes(f);
394        self.5.list_hashes(f);
395    }
396}
397
398impl<A: Topological, B: Topological, C: Topological, D: Topological, E: Topological, F: Topological>
399    Topological for (A, B, C, D, E, F)
400{
401    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
402        self.0.traverse(visitor);
403        self.1.traverse(visitor);
404        self.2.traverse(visitor);
405        self.3.traverse(visitor);
406        self.4.traverse(visitor);
407        self.5.traverse(visitor);
408    }
409}
410
411impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged> Tagged
412    for (A, B, C, D, E, F)
413{
414    const TAGS: Tags = Tags(
415        &[],
416        &[&A::TAGS, &B::TAGS, &C::TAGS, &D::TAGS, &E::TAGS, &F::TAGS],
417    );
418}
419
420impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size> Size for (A, B, C, D, E, F)
421where
422    tarr![A::Size, B::Size, C::Size, D::Size, E::Size, F::Size,]:
423        typenum::FoldAdd<Output: Unsigned>,
424{
425    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE;
426
427    type Size =
428        <tarr![A::Size, B::Size, C::Size, D::Size, E::Size, F::Size,] as typenum::FoldAdd>::Output;
429}
430
431impl<
432    II: ParseInput,
433    A: ParseInline<II>,
434    B: ParseInline<II>,
435    C: ParseInline<II>,
436    D: ParseInline<II>,
437    E: ParseInline<II>,
438    F: Parse<II>,
439> Parse<II> for (A, B, C, D, E, F)
440{
441    fn parse(mut input: II) -> crate::Result<Self> {
442        Ok((
443            input.parse_inline()?,
444            input.parse_inline()?,
445            input.parse_inline()?,
446            input.parse_inline()?,
447            input.parse_inline()?,
448            input.parse()?,
449        ))
450    }
451}
452
453impl<
454    II: ParseInput,
455    A: ParseInline<II>,
456    B: ParseInline<II>,
457    C: ParseInline<II>,
458    D: ParseInline<II>,
459    E: ParseInline<II>,
460    F: ParseInline<II>,
461> ParseInline<II> for (A, B, C, D, E, F)
462{
463    fn parse_inline(input: &mut II) -> crate::Result<Self> {
464        Ok((
465            input.parse_inline()?,
466            input.parse_inline()?,
467            input.parse_inline()?,
468            input.parse_inline()?,
469            input.parse_inline()?,
470            input.parse_inline()?,
471        ))
472    }
473}
474
475impl<
476    A: MaybeHasNiche,
477    B: MaybeHasNiche,
478    C: MaybeHasNiche,
479    D: MaybeHasNiche,
480    E: MaybeHasNiche,
481    F: MaybeHasNiche,
482> MaybeHasNiche for (A, B, C, D, E, F)
483{
484    type MnArray = tarr![
485        A::MnArray,
486        B::MnArray,
487        C::MnArray,
488        D::MnArray,
489        E::MnArray,
490        F::MnArray,
491    ];
492}
493
494impl<
495    A: ByteOrd + InlineOutput,
496    B: ByteOrd + InlineOutput,
497    C: ByteOrd + InlineOutput,
498    D: ByteOrd + InlineOutput,
499    E: ByteOrd + InlineOutput,
500    F: ByteOrd,
501> ByteOrd for (A, B, C, D, E, F)
502{
503    fn bytes_cmp(&self, other: &Self) -> Ordering {
504        Ordering::Equal
505            .then_with(|| self.0.bytes_cmp(&other.0))
506            .then_with(|| self.1.bytes_cmp(&other.1))
507            .then_with(|| self.2.bytes_cmp(&other.2))
508            .then_with(|| self.3.bytes_cmp(&other.3))
509            .then_with(|| self.4.bytes_cmp(&other.4))
510            .then_with(|| self.5.bytes_cmp(&other.5))
511    }
512}
513
514impl<A: Monostate, B: Monostate, C: Monostate, D: Monostate, E: Monostate, F: Monostate> Monostate
515    for (A, B, C, D, E, F)
516{
517}
518
519impl<
520    A: InlineOutput,
521    B: InlineOutput,
522    C: InlineOutput,
523    D: InlineOutput,
524    E: InlineOutput,
525    F: InlineOutput,
526    G: ToOutput,
527> ToOutput for (A, B, C, D, E, F, G)
528{
529    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
530        self.0.to_output(output);
531        self.1.to_output(output);
532        self.2.to_output(output);
533        self.3.to_output(output);
534        self.4.to_output(output);
535        self.5.to_output(output);
536        self.6.to_output(output);
537    }
538}
539
540impl<
541    A: InlineOutput,
542    B: InlineOutput,
543    C: InlineOutput,
544    D: InlineOutput,
545    E: InlineOutput,
546    F: InlineOutput,
547    G: InlineOutput,
548> InlineOutput for (A, B, C, D, E, F, G)
549{
550}
551
552impl<
553    A: ListHashes,
554    B: ListHashes,
555    C: ListHashes,
556    D: ListHashes,
557    E: ListHashes,
558    F: ListHashes,
559    G: ListHashes,
560> ListHashes for (A, B, C, D, E, F, G)
561{
562    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
563        self.0.list_hashes(f);
564        self.1.list_hashes(f);
565        self.2.list_hashes(f);
566        self.3.list_hashes(f);
567        self.4.list_hashes(f);
568        self.5.list_hashes(f);
569        self.6.list_hashes(f);
570    }
571}
572
573impl<
574    A: Topological,
575    B: Topological,
576    C: Topological,
577    D: Topological,
578    E: Topological,
579    F: Topological,
580    G: Topological,
581> Topological for (A, B, C, D, E, F, G)
582{
583    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
584        self.0.traverse(visitor);
585        self.1.traverse(visitor);
586        self.2.traverse(visitor);
587        self.3.traverse(visitor);
588        self.4.traverse(visitor);
589        self.5.traverse(visitor);
590        self.6.traverse(visitor);
591    }
592}
593
594impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged, G: Tagged> Tagged
595    for (A, B, C, D, E, F, G)
596{
597    const TAGS: Tags = Tags(
598        &[],
599        &[
600            &A::TAGS,
601            &B::TAGS,
602            &C::TAGS,
603            &D::TAGS,
604            &E::TAGS,
605            &F::TAGS,
606            &G::TAGS,
607        ],
608    );
609}
610
611impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size> Size for (A, B, C, D, E, F, G)
612where
613    tarr![
614        A::Size,
615        B::Size,
616        C::Size,
617        D::Size,
618        E::Size,
619        F::Size,
620        G::Size,
621    ]: typenum::FoldAdd<Output: Unsigned>,
622{
623    const SIZE: usize = A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE;
624
625    type Size = <tarr![
626        A::Size,
627        B::Size,
628        C::Size,
629        D::Size,
630        E::Size,
631        F::Size,
632        G::Size,
633    ] as typenum::FoldAdd>::Output;
634}
635
636impl<
637    II: ParseInput,
638    A: ParseInline<II>,
639    B: ParseInline<II>,
640    C: ParseInline<II>,
641    D: ParseInline<II>,
642    E: ParseInline<II>,
643    F: ParseInline<II>,
644    G: Parse<II>,
645> Parse<II> for (A, B, C, D, E, F, G)
646{
647    fn parse(mut input: II) -> crate::Result<Self> {
648        Ok((
649            input.parse_inline()?,
650            input.parse_inline()?,
651            input.parse_inline()?,
652            input.parse_inline()?,
653            input.parse_inline()?,
654            input.parse_inline()?,
655            input.parse()?,
656        ))
657    }
658}
659
660impl<
661    II: ParseInput,
662    A: ParseInline<II>,
663    B: ParseInline<II>,
664    C: ParseInline<II>,
665    D: ParseInline<II>,
666    E: ParseInline<II>,
667    F: ParseInline<II>,
668    G: ParseInline<II>,
669> ParseInline<II> for (A, B, C, D, E, F, G)
670{
671    fn parse_inline(input: &mut II) -> crate::Result<Self> {
672        Ok((
673            input.parse_inline()?,
674            input.parse_inline()?,
675            input.parse_inline()?,
676            input.parse_inline()?,
677            input.parse_inline()?,
678            input.parse_inline()?,
679            input.parse_inline()?,
680        ))
681    }
682}
683
684impl<
685    A: MaybeHasNiche,
686    B: MaybeHasNiche,
687    C: MaybeHasNiche,
688    D: MaybeHasNiche,
689    E: MaybeHasNiche,
690    F: MaybeHasNiche,
691    G: MaybeHasNiche,
692> MaybeHasNiche for (A, B, C, D, E, F, G)
693{
694    type MnArray = tarr![
695        A::MnArray,
696        B::MnArray,
697        C::MnArray,
698        D::MnArray,
699        E::MnArray,
700        F::MnArray,
701        G::MnArray,
702    ];
703}
704
705impl<
706    A: ByteOrd + InlineOutput,
707    B: ByteOrd + InlineOutput,
708    C: ByteOrd + InlineOutput,
709    D: ByteOrd + InlineOutput,
710    E: ByteOrd + InlineOutput,
711    F: ByteOrd + InlineOutput,
712    G: ByteOrd,
713> ByteOrd for (A, B, C, D, E, F, G)
714{
715    fn bytes_cmp(&self, other: &Self) -> Ordering {
716        Ordering::Equal
717            .then_with(|| self.0.bytes_cmp(&other.0))
718            .then_with(|| self.1.bytes_cmp(&other.1))
719            .then_with(|| self.2.bytes_cmp(&other.2))
720            .then_with(|| self.3.bytes_cmp(&other.3))
721            .then_with(|| self.4.bytes_cmp(&other.4))
722            .then_with(|| self.5.bytes_cmp(&other.5))
723            .then_with(|| self.6.bytes_cmp(&other.6))
724    }
725}
726
727impl<
728    A: Monostate,
729    B: Monostate,
730    C: Monostate,
731    D: Monostate,
732    E: Monostate,
733    F: Monostate,
734    G: Monostate,
735> Monostate for (A, B, C, D, E, F, G)
736{
737}
738
739impl<
740    A: InlineOutput,
741    B: InlineOutput,
742    C: InlineOutput,
743    D: InlineOutput,
744    E: InlineOutput,
745    F: InlineOutput,
746    G: InlineOutput,
747    H: ToOutput,
748> ToOutput for (A, B, C, D, E, F, G, H)
749{
750    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
751        self.0.to_output(output);
752        self.1.to_output(output);
753        self.2.to_output(output);
754        self.3.to_output(output);
755        self.4.to_output(output);
756        self.5.to_output(output);
757        self.6.to_output(output);
758        self.7.to_output(output);
759    }
760}
761
762impl<
763    A: InlineOutput,
764    B: InlineOutput,
765    C: InlineOutput,
766    D: InlineOutput,
767    E: InlineOutput,
768    F: InlineOutput,
769    G: InlineOutput,
770    H: InlineOutput,
771> InlineOutput for (A, B, C, D, E, F, G, H)
772{
773}
774
775impl<
776    A: ListHashes,
777    B: ListHashes,
778    C: ListHashes,
779    D: ListHashes,
780    E: ListHashes,
781    F: ListHashes,
782    G: ListHashes,
783    H: ListHashes,
784> ListHashes for (A, B, C, D, E, F, G, H)
785{
786    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
787        self.0.list_hashes(f);
788        self.1.list_hashes(f);
789        self.2.list_hashes(f);
790        self.3.list_hashes(f);
791        self.4.list_hashes(f);
792        self.5.list_hashes(f);
793        self.6.list_hashes(f);
794        self.7.list_hashes(f);
795    }
796}
797
798impl<
799    A: Topological,
800    B: Topological,
801    C: Topological,
802    D: Topological,
803    E: Topological,
804    F: Topological,
805    G: Topological,
806    H: Topological,
807> Topological for (A, B, C, D, E, F, G, H)
808{
809    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
810        self.0.traverse(visitor);
811        self.1.traverse(visitor);
812        self.2.traverse(visitor);
813        self.3.traverse(visitor);
814        self.4.traverse(visitor);
815        self.5.traverse(visitor);
816        self.6.traverse(visitor);
817        self.7.traverse(visitor);
818    }
819}
820
821impl<A: Tagged, B: Tagged, C: Tagged, D: Tagged, E: Tagged, F: Tagged, G: Tagged, H: Tagged> Tagged
822    for (A, B, C, D, E, F, G, H)
823{
824    const TAGS: Tags = Tags(
825        &[],
826        &[
827            &A::TAGS,
828            &B::TAGS,
829            &C::TAGS,
830            &D::TAGS,
831            &E::TAGS,
832            &F::TAGS,
833            &G::TAGS,
834            &H::TAGS,
835        ],
836    );
837}
838
839impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size> Size
840    for (A, B, C, D, E, F, G, H)
841where
842    tarr![
843        A::Size,
844        B::Size,
845        C::Size,
846        D::Size,
847        E::Size,
848        F::Size,
849        G::Size,
850        H::Size,
851    ]: typenum::FoldAdd<Output: Unsigned>,
852{
853    const SIZE: usize =
854        A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE + H::SIZE;
855
856    type Size = <tarr![
857        A::Size,
858        B::Size,
859        C::Size,
860        D::Size,
861        E::Size,
862        F::Size,
863        G::Size,
864        H::Size,
865    ] as typenum::FoldAdd>::Output;
866}
867
868impl<
869    II: ParseInput,
870    A: ParseInline<II>,
871    B: ParseInline<II>,
872    C: ParseInline<II>,
873    D: ParseInline<II>,
874    E: ParseInline<II>,
875    F: ParseInline<II>,
876    G: ParseInline<II>,
877    H: Parse<II>,
878> Parse<II> for (A, B, C, D, E, F, G, H)
879{
880    fn parse(mut input: II) -> crate::Result<Self> {
881        Ok((
882            input.parse_inline()?,
883            input.parse_inline()?,
884            input.parse_inline()?,
885            input.parse_inline()?,
886            input.parse_inline()?,
887            input.parse_inline()?,
888            input.parse_inline()?,
889            input.parse()?,
890        ))
891    }
892}
893
894impl<
895    II: ParseInput,
896    A: ParseInline<II>,
897    B: ParseInline<II>,
898    C: ParseInline<II>,
899    D: ParseInline<II>,
900    E: ParseInline<II>,
901    F: ParseInline<II>,
902    G: ParseInline<II>,
903    H: ParseInline<II>,
904> ParseInline<II> for (A, B, C, D, E, F, G, H)
905{
906    fn parse_inline(input: &mut II) -> crate::Result<Self> {
907        Ok((
908            input.parse_inline()?,
909            input.parse_inline()?,
910            input.parse_inline()?,
911            input.parse_inline()?,
912            input.parse_inline()?,
913            input.parse_inline()?,
914            input.parse_inline()?,
915            input.parse_inline()?,
916        ))
917    }
918}
919
920impl<
921    A: MaybeHasNiche,
922    B: MaybeHasNiche,
923    C: MaybeHasNiche,
924    D: MaybeHasNiche,
925    E: MaybeHasNiche,
926    F: MaybeHasNiche,
927    G: MaybeHasNiche,
928    H: MaybeHasNiche,
929> MaybeHasNiche for (A, B, C, D, E, F, G, H)
930{
931    type MnArray = tarr![
932        A::MnArray,
933        B::MnArray,
934        C::MnArray,
935        D::MnArray,
936        E::MnArray,
937        F::MnArray,
938        G::MnArray,
939        H::MnArray,
940    ];
941}
942
943impl<
944    A: ByteOrd + InlineOutput,
945    B: ByteOrd + InlineOutput,
946    C: ByteOrd + InlineOutput,
947    D: ByteOrd + InlineOutput,
948    E: ByteOrd + InlineOutput,
949    F: ByteOrd + InlineOutput,
950    G: ByteOrd + InlineOutput,
951    H: ByteOrd,
952> ByteOrd for (A, B, C, D, E, F, G, H)
953{
954    fn bytes_cmp(&self, other: &Self) -> Ordering {
955        Ordering::Equal
956            .then_with(|| self.0.bytes_cmp(&other.0))
957            .then_with(|| self.1.bytes_cmp(&other.1))
958            .then_with(|| self.2.bytes_cmp(&other.2))
959            .then_with(|| self.3.bytes_cmp(&other.3))
960            .then_with(|| self.4.bytes_cmp(&other.4))
961            .then_with(|| self.5.bytes_cmp(&other.5))
962            .then_with(|| self.6.bytes_cmp(&other.6))
963            .then_with(|| self.7.bytes_cmp(&other.7))
964    }
965}
966
967impl<
968    A: Monostate,
969    B: Monostate,
970    C: Monostate,
971    D: Monostate,
972    E: Monostate,
973    F: Monostate,
974    G: Monostate,
975    H: Monostate,
976> Monostate for (A, B, C, D, E, F, G, H)
977{
978}
979
980impl<
981    A: InlineOutput,
982    B: InlineOutput,
983    C: InlineOutput,
984    D: InlineOutput,
985    E: InlineOutput,
986    F: InlineOutput,
987    G: InlineOutput,
988    H: InlineOutput,
989    I: ToOutput,
990> ToOutput for (A, B, C, D, E, F, G, H, I)
991{
992    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
993        self.0.to_output(output);
994        self.1.to_output(output);
995        self.2.to_output(output);
996        self.3.to_output(output);
997        self.4.to_output(output);
998        self.5.to_output(output);
999        self.6.to_output(output);
1000        self.7.to_output(output);
1001        self.8.to_output(output);
1002    }
1003}
1004
1005impl<
1006    A: InlineOutput,
1007    B: InlineOutput,
1008    C: InlineOutput,
1009    D: InlineOutput,
1010    E: InlineOutput,
1011    F: InlineOutput,
1012    G: InlineOutput,
1013    H: InlineOutput,
1014    I: InlineOutput,
1015> InlineOutput for (A, B, C, D, E, F, G, H, I)
1016{
1017}
1018
1019impl<
1020    A: ListHashes,
1021    B: ListHashes,
1022    C: ListHashes,
1023    D: ListHashes,
1024    E: ListHashes,
1025    F: ListHashes,
1026    G: ListHashes,
1027    H: ListHashes,
1028    I: ListHashes,
1029> ListHashes for (A, B, C, D, E, F, G, H, I)
1030{
1031    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
1032        self.0.list_hashes(f);
1033        self.1.list_hashes(f);
1034        self.2.list_hashes(f);
1035        self.3.list_hashes(f);
1036        self.4.list_hashes(f);
1037        self.5.list_hashes(f);
1038        self.6.list_hashes(f);
1039        self.7.list_hashes(f);
1040        self.8.list_hashes(f);
1041    }
1042}
1043
1044impl<
1045    A: Topological,
1046    B: Topological,
1047    C: Topological,
1048    D: Topological,
1049    E: Topological,
1050    F: Topological,
1051    G: Topological,
1052    H: Topological,
1053    I: Topological,
1054> Topological for (A, B, C, D, E, F, G, H, I)
1055{
1056    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
1057        self.0.traverse(visitor);
1058        self.1.traverse(visitor);
1059        self.2.traverse(visitor);
1060        self.3.traverse(visitor);
1061        self.4.traverse(visitor);
1062        self.5.traverse(visitor);
1063        self.6.traverse(visitor);
1064        self.7.traverse(visitor);
1065        self.8.traverse(visitor);
1066    }
1067}
1068
1069impl<
1070    A: Tagged,
1071    B: Tagged,
1072    C: Tagged,
1073    D: Tagged,
1074    E: Tagged,
1075    F: Tagged,
1076    G: Tagged,
1077    H: Tagged,
1078    I: Tagged,
1079> Tagged for (A, B, C, D, E, F, G, H, I)
1080{
1081    const TAGS: Tags = Tags(
1082        &[],
1083        &[
1084            &A::TAGS,
1085            &B::TAGS,
1086            &C::TAGS,
1087            &D::TAGS,
1088            &E::TAGS,
1089            &F::TAGS,
1090            &G::TAGS,
1091            &H::TAGS,
1092            &I::TAGS,
1093        ],
1094    );
1095}
1096
1097impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size, I: Size> Size
1098    for (A, B, C, D, E, F, G, H, I)
1099where
1100    tarr![
1101        A::Size,
1102        B::Size,
1103        C::Size,
1104        D::Size,
1105        E::Size,
1106        F::Size,
1107        G::Size,
1108        H::Size,
1109        I::Size,
1110    ]: typenum::FoldAdd<Output: Unsigned>,
1111{
1112    const SIZE: usize =
1113        A::SIZE + B::SIZE + C::SIZE + D::SIZE + E::SIZE + F::SIZE + G::SIZE + H::SIZE + I::SIZE;
1114
1115    type Size = <tarr![
1116        A::Size,
1117        B::Size,
1118        C::Size,
1119        D::Size,
1120        E::Size,
1121        F::Size,
1122        G::Size,
1123        H::Size,
1124        I::Size,
1125    ] as typenum::FoldAdd>::Output;
1126}
1127
1128impl<
1129    II: ParseInput,
1130    A: ParseInline<II>,
1131    B: ParseInline<II>,
1132    C: ParseInline<II>,
1133    D: ParseInline<II>,
1134    E: ParseInline<II>,
1135    F: ParseInline<II>,
1136    G: ParseInline<II>,
1137    H: ParseInline<II>,
1138    I: Parse<II>,
1139> Parse<II> for (A, B, C, D, E, F, G, H, I)
1140{
1141    fn parse(mut input: II) -> crate::Result<Self> {
1142        Ok((
1143            input.parse_inline()?,
1144            input.parse_inline()?,
1145            input.parse_inline()?,
1146            input.parse_inline()?,
1147            input.parse_inline()?,
1148            input.parse_inline()?,
1149            input.parse_inline()?,
1150            input.parse_inline()?,
1151            input.parse()?,
1152        ))
1153    }
1154}
1155
1156impl<
1157    II: ParseInput,
1158    A: ParseInline<II>,
1159    B: ParseInline<II>,
1160    C: ParseInline<II>,
1161    D: ParseInline<II>,
1162    E: ParseInline<II>,
1163    F: ParseInline<II>,
1164    G: ParseInline<II>,
1165    H: ParseInline<II>,
1166    I: ParseInline<II>,
1167> ParseInline<II> for (A, B, C, D, E, F, G, H, I)
1168{
1169    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1170        Ok((
1171            input.parse_inline()?,
1172            input.parse_inline()?,
1173            input.parse_inline()?,
1174            input.parse_inline()?,
1175            input.parse_inline()?,
1176            input.parse_inline()?,
1177            input.parse_inline()?,
1178            input.parse_inline()?,
1179            input.parse_inline()?,
1180        ))
1181    }
1182}
1183
1184impl<
1185    A: MaybeHasNiche,
1186    B: MaybeHasNiche,
1187    C: MaybeHasNiche,
1188    D: MaybeHasNiche,
1189    E: MaybeHasNiche,
1190    F: MaybeHasNiche,
1191    G: MaybeHasNiche,
1192    H: MaybeHasNiche,
1193    I: MaybeHasNiche,
1194> MaybeHasNiche for (A, B, C, D, E, F, G, H, I)
1195{
1196    type MnArray = tarr![
1197        A::MnArray,
1198        B::MnArray,
1199        C::MnArray,
1200        D::MnArray,
1201        E::MnArray,
1202        F::MnArray,
1203        G::MnArray,
1204        H::MnArray,
1205        I::MnArray,
1206    ];
1207}
1208
1209impl<
1210    A: ByteOrd + InlineOutput,
1211    B: ByteOrd + InlineOutput,
1212    C: ByteOrd + InlineOutput,
1213    D: ByteOrd + InlineOutput,
1214    E: ByteOrd + InlineOutput,
1215    F: ByteOrd + InlineOutput,
1216    G: ByteOrd + InlineOutput,
1217    H: ByteOrd + InlineOutput,
1218    I: ByteOrd,
1219> ByteOrd for (A, B, C, D, E, F, G, H, I)
1220{
1221    fn bytes_cmp(&self, other: &Self) -> Ordering {
1222        Ordering::Equal
1223            .then_with(|| self.0.bytes_cmp(&other.0))
1224            .then_with(|| self.1.bytes_cmp(&other.1))
1225            .then_with(|| self.2.bytes_cmp(&other.2))
1226            .then_with(|| self.3.bytes_cmp(&other.3))
1227            .then_with(|| self.4.bytes_cmp(&other.4))
1228            .then_with(|| self.5.bytes_cmp(&other.5))
1229            .then_with(|| self.6.bytes_cmp(&other.6))
1230            .then_with(|| self.7.bytes_cmp(&other.7))
1231            .then_with(|| self.8.bytes_cmp(&other.8))
1232    }
1233}
1234
1235impl<
1236    A: Monostate,
1237    B: Monostate,
1238    C: Monostate,
1239    D: Monostate,
1240    E: Monostate,
1241    F: Monostate,
1242    G: Monostate,
1243    H: Monostate,
1244    I: Monostate,
1245> Monostate for (A, B, C, D, E, F, G, H, I)
1246{
1247}
1248
1249impl<
1250    A: InlineOutput,
1251    B: InlineOutput,
1252    C: InlineOutput,
1253    D: InlineOutput,
1254    E: InlineOutput,
1255    F: InlineOutput,
1256    G: InlineOutput,
1257    H: InlineOutput,
1258    I: InlineOutput,
1259    J: ToOutput,
1260> ToOutput for (A, B, C, D, E, F, G, H, I, J)
1261{
1262    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
1263        self.0.to_output(output);
1264        self.1.to_output(output);
1265        self.2.to_output(output);
1266        self.3.to_output(output);
1267        self.4.to_output(output);
1268        self.5.to_output(output);
1269        self.6.to_output(output);
1270        self.7.to_output(output);
1271        self.8.to_output(output);
1272        self.9.to_output(output);
1273    }
1274}
1275
1276impl<
1277    A: InlineOutput,
1278    B: InlineOutput,
1279    C: InlineOutput,
1280    D: InlineOutput,
1281    E: InlineOutput,
1282    F: InlineOutput,
1283    G: InlineOutput,
1284    H: InlineOutput,
1285    I: InlineOutput,
1286    J: InlineOutput,
1287> InlineOutput for (A, B, C, D, E, F, G, H, I, J)
1288{
1289}
1290
1291impl<
1292    A: ListHashes,
1293    B: ListHashes,
1294    C: ListHashes,
1295    D: ListHashes,
1296    E: ListHashes,
1297    F: ListHashes,
1298    G: ListHashes,
1299    H: ListHashes,
1300    I: ListHashes,
1301    J: ListHashes,
1302> ListHashes for (A, B, C, D, E, F, G, H, I, J)
1303{
1304    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
1305        self.0.list_hashes(f);
1306        self.1.list_hashes(f);
1307        self.2.list_hashes(f);
1308        self.3.list_hashes(f);
1309        self.4.list_hashes(f);
1310        self.5.list_hashes(f);
1311        self.6.list_hashes(f);
1312        self.7.list_hashes(f);
1313        self.8.list_hashes(f);
1314        self.9.list_hashes(f);
1315    }
1316}
1317
1318impl<
1319    A: Topological,
1320    B: Topological,
1321    C: Topological,
1322    D: Topological,
1323    E: Topological,
1324    F: Topological,
1325    G: Topological,
1326    H: Topological,
1327    I: Topological,
1328    J: Topological,
1329> Topological for (A, B, C, D, E, F, G, H, I, J)
1330{
1331    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
1332        self.0.traverse(visitor);
1333        self.1.traverse(visitor);
1334        self.2.traverse(visitor);
1335        self.3.traverse(visitor);
1336        self.4.traverse(visitor);
1337        self.5.traverse(visitor);
1338        self.6.traverse(visitor);
1339        self.7.traverse(visitor);
1340        self.8.traverse(visitor);
1341        self.9.traverse(visitor);
1342    }
1343}
1344
1345impl<
1346    A: Tagged,
1347    B: Tagged,
1348    C: Tagged,
1349    D: Tagged,
1350    E: Tagged,
1351    F: Tagged,
1352    G: Tagged,
1353    H: Tagged,
1354    I: Tagged,
1355    J: Tagged,
1356> Tagged for (A, B, C, D, E, F, G, H, I, J)
1357{
1358    const TAGS: Tags = Tags(
1359        &[],
1360        &[
1361            &A::TAGS,
1362            &B::TAGS,
1363            &C::TAGS,
1364            &D::TAGS,
1365            &E::TAGS,
1366            &F::TAGS,
1367            &G::TAGS,
1368            &H::TAGS,
1369            &I::TAGS,
1370            &J::TAGS,
1371        ],
1372    );
1373}
1374
1375impl<A: Size, B: Size, C: Size, D: Size, E: Size, F: Size, G: Size, H: Size, I: Size, J: Size> Size
1376    for (A, B, C, D, E, F, G, H, I, J)
1377where
1378    tarr![
1379        A::Size,
1380        B::Size,
1381        C::Size,
1382        D::Size,
1383        E::Size,
1384        F::Size,
1385        G::Size,
1386        H::Size,
1387        I::Size,
1388        J::Size,
1389    ]: typenum::FoldAdd<Output: Unsigned>,
1390{
1391    const SIZE: usize = A::SIZE
1392        + B::SIZE
1393        + C::SIZE
1394        + D::SIZE
1395        + E::SIZE
1396        + F::SIZE
1397        + G::SIZE
1398        + H::SIZE
1399        + I::SIZE
1400        + J::SIZE;
1401
1402    type Size = <tarr![
1403        A::Size,
1404        B::Size,
1405        C::Size,
1406        D::Size,
1407        E::Size,
1408        F::Size,
1409        G::Size,
1410        H::Size,
1411        I::Size,
1412        J::Size,
1413    ] as typenum::FoldAdd>::Output;
1414}
1415
1416impl<
1417    II: ParseInput,
1418    A: ParseInline<II>,
1419    B: ParseInline<II>,
1420    C: ParseInline<II>,
1421    D: ParseInline<II>,
1422    E: ParseInline<II>,
1423    F: ParseInline<II>,
1424    G: ParseInline<II>,
1425    H: ParseInline<II>,
1426    I: ParseInline<II>,
1427    J: Parse<II>,
1428> Parse<II> for (A, B, C, D, E, F, G, H, I, J)
1429{
1430    fn parse(mut input: II) -> crate::Result<Self> {
1431        Ok((
1432            input.parse_inline()?,
1433            input.parse_inline()?,
1434            input.parse_inline()?,
1435            input.parse_inline()?,
1436            input.parse_inline()?,
1437            input.parse_inline()?,
1438            input.parse_inline()?,
1439            input.parse_inline()?,
1440            input.parse_inline()?,
1441            input.parse()?,
1442        ))
1443    }
1444}
1445
1446impl<
1447    II: ParseInput,
1448    A: ParseInline<II>,
1449    B: ParseInline<II>,
1450    C: ParseInline<II>,
1451    D: ParseInline<II>,
1452    E: ParseInline<II>,
1453    F: ParseInline<II>,
1454    G: ParseInline<II>,
1455    H: ParseInline<II>,
1456    I: ParseInline<II>,
1457    J: ParseInline<II>,
1458> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J)
1459{
1460    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1461        Ok((
1462            input.parse_inline()?,
1463            input.parse_inline()?,
1464            input.parse_inline()?,
1465            input.parse_inline()?,
1466            input.parse_inline()?,
1467            input.parse_inline()?,
1468            input.parse_inline()?,
1469            input.parse_inline()?,
1470            input.parse_inline()?,
1471            input.parse_inline()?,
1472        ))
1473    }
1474}
1475
1476impl<
1477    A: MaybeHasNiche,
1478    B: MaybeHasNiche,
1479    C: MaybeHasNiche,
1480    D: MaybeHasNiche,
1481    E: MaybeHasNiche,
1482    F: MaybeHasNiche,
1483    G: MaybeHasNiche,
1484    H: MaybeHasNiche,
1485    I: MaybeHasNiche,
1486    J: MaybeHasNiche,
1487> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J)
1488{
1489    type MnArray = tarr![
1490        A::MnArray,
1491        B::MnArray,
1492        C::MnArray,
1493        D::MnArray,
1494        E::MnArray,
1495        F::MnArray,
1496        G::MnArray,
1497        H::MnArray,
1498        I::MnArray,
1499        J::MnArray,
1500    ];
1501}
1502
1503impl<
1504    A: ByteOrd + InlineOutput,
1505    B: ByteOrd + InlineOutput,
1506    C: ByteOrd + InlineOutput,
1507    D: ByteOrd + InlineOutput,
1508    E: ByteOrd + InlineOutput,
1509    F: ByteOrd + InlineOutput,
1510    G: ByteOrd + InlineOutput,
1511    H: ByteOrd + InlineOutput,
1512    I: ByteOrd + InlineOutput,
1513    J: ByteOrd,
1514> ByteOrd for (A, B, C, D, E, F, G, H, I, J)
1515{
1516    fn bytes_cmp(&self, other: &Self) -> Ordering {
1517        Ordering::Equal
1518            .then_with(|| self.0.bytes_cmp(&other.0))
1519            .then_with(|| self.1.bytes_cmp(&other.1))
1520            .then_with(|| self.2.bytes_cmp(&other.2))
1521            .then_with(|| self.3.bytes_cmp(&other.3))
1522            .then_with(|| self.4.bytes_cmp(&other.4))
1523            .then_with(|| self.5.bytes_cmp(&other.5))
1524            .then_with(|| self.6.bytes_cmp(&other.6))
1525            .then_with(|| self.7.bytes_cmp(&other.7))
1526            .then_with(|| self.8.bytes_cmp(&other.8))
1527            .then_with(|| self.9.bytes_cmp(&other.9))
1528    }
1529}
1530
1531impl<
1532    A: Monostate,
1533    B: Monostate,
1534    C: Monostate,
1535    D: Monostate,
1536    E: Monostate,
1537    F: Monostate,
1538    G: Monostate,
1539    H: Monostate,
1540    I: Monostate,
1541    J: Monostate,
1542> Monostate for (A, B, C, D, E, F, G, H, I, J)
1543{
1544}
1545
1546impl<
1547    A: InlineOutput,
1548    B: InlineOutput,
1549    C: InlineOutput,
1550    D: InlineOutput,
1551    E: InlineOutput,
1552    F: InlineOutput,
1553    G: InlineOutput,
1554    H: InlineOutput,
1555    I: InlineOutput,
1556    J: InlineOutput,
1557    K: ToOutput,
1558> ToOutput for (A, B, C, D, E, F, G, H, I, J, K)
1559{
1560    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
1561        self.0.to_output(output);
1562        self.1.to_output(output);
1563        self.2.to_output(output);
1564        self.3.to_output(output);
1565        self.4.to_output(output);
1566        self.5.to_output(output);
1567        self.6.to_output(output);
1568        self.7.to_output(output);
1569        self.8.to_output(output);
1570        self.9.to_output(output);
1571        self.10.to_output(output);
1572    }
1573}
1574
1575impl<
1576    A: InlineOutput,
1577    B: InlineOutput,
1578    C: InlineOutput,
1579    D: InlineOutput,
1580    E: InlineOutput,
1581    F: InlineOutput,
1582    G: InlineOutput,
1583    H: InlineOutput,
1584    I: InlineOutput,
1585    J: InlineOutput,
1586    K: InlineOutput,
1587> InlineOutput for (A, B, C, D, E, F, G, H, I, J, K)
1588{
1589}
1590
1591impl<
1592    A: ListHashes,
1593    B: ListHashes,
1594    C: ListHashes,
1595    D: ListHashes,
1596    E: ListHashes,
1597    F: ListHashes,
1598    G: ListHashes,
1599    H: ListHashes,
1600    I: ListHashes,
1601    J: ListHashes,
1602    K: ListHashes,
1603> ListHashes for (A, B, C, D, E, F, G, H, I, J, K)
1604{
1605    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
1606        self.0.list_hashes(f);
1607        self.1.list_hashes(f);
1608        self.2.list_hashes(f);
1609        self.3.list_hashes(f);
1610        self.4.list_hashes(f);
1611        self.5.list_hashes(f);
1612        self.6.list_hashes(f);
1613        self.7.list_hashes(f);
1614        self.8.list_hashes(f);
1615        self.9.list_hashes(f);
1616        self.10.list_hashes(f);
1617    }
1618}
1619
1620impl<
1621    A: Topological,
1622    B: Topological,
1623    C: Topological,
1624    D: Topological,
1625    E: Topological,
1626    F: Topological,
1627    G: Topological,
1628    H: Topological,
1629    I: Topological,
1630    J: Topological,
1631    K: Topological,
1632> Topological for (A, B, C, D, E, F, G, H, I, J, K)
1633{
1634    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
1635        self.0.traverse(visitor);
1636        self.1.traverse(visitor);
1637        self.2.traverse(visitor);
1638        self.3.traverse(visitor);
1639        self.4.traverse(visitor);
1640        self.5.traverse(visitor);
1641        self.6.traverse(visitor);
1642        self.7.traverse(visitor);
1643        self.8.traverse(visitor);
1644        self.9.traverse(visitor);
1645        self.10.traverse(visitor);
1646    }
1647}
1648
1649impl<
1650    A: Tagged,
1651    B: Tagged,
1652    C: Tagged,
1653    D: Tagged,
1654    E: Tagged,
1655    F: Tagged,
1656    G: Tagged,
1657    H: Tagged,
1658    I: Tagged,
1659    J: Tagged,
1660    K: Tagged,
1661> Tagged for (A, B, C, D, E, F, G, H, I, J, K)
1662{
1663    const TAGS: Tags = Tags(
1664        &[],
1665        &[
1666            &A::TAGS,
1667            &B::TAGS,
1668            &C::TAGS,
1669            &D::TAGS,
1670            &E::TAGS,
1671            &F::TAGS,
1672            &G::TAGS,
1673            &H::TAGS,
1674            &I::TAGS,
1675            &J::TAGS,
1676            &K::TAGS,
1677        ],
1678    );
1679}
1680
1681impl<
1682    A: Size,
1683    B: Size,
1684    C: Size,
1685    D: Size,
1686    E: Size,
1687    F: Size,
1688    G: Size,
1689    H: Size,
1690    I: Size,
1691    J: Size,
1692    K: Size,
1693> Size for (A, B, C, D, E, F, G, H, I, J, K)
1694where
1695    tarr![
1696        A::Size,
1697        B::Size,
1698        C::Size,
1699        D::Size,
1700        E::Size,
1701        F::Size,
1702        G::Size,
1703        H::Size,
1704        I::Size,
1705        J::Size,
1706        K::Size,
1707    ]: typenum::FoldAdd<Output: Unsigned>,
1708{
1709    const SIZE: usize = A::SIZE
1710        + B::SIZE
1711        + C::SIZE
1712        + D::SIZE
1713        + E::SIZE
1714        + F::SIZE
1715        + G::SIZE
1716        + H::SIZE
1717        + I::SIZE
1718        + J::SIZE
1719        + K::SIZE;
1720
1721    type Size = <tarr![
1722        A::Size,
1723        B::Size,
1724        C::Size,
1725        D::Size,
1726        E::Size,
1727        F::Size,
1728        G::Size,
1729        H::Size,
1730        I::Size,
1731        J::Size,
1732        K::Size,
1733    ] as typenum::FoldAdd>::Output;
1734}
1735
1736impl<
1737    II: ParseInput,
1738    A: ParseInline<II>,
1739    B: ParseInline<II>,
1740    C: ParseInline<II>,
1741    D: ParseInline<II>,
1742    E: ParseInline<II>,
1743    F: ParseInline<II>,
1744    G: ParseInline<II>,
1745    H: ParseInline<II>,
1746    I: ParseInline<II>,
1747    J: ParseInline<II>,
1748    K: Parse<II>,
1749> Parse<II> for (A, B, C, D, E, F, G, H, I, J, K)
1750{
1751    fn parse(mut input: II) -> crate::Result<Self> {
1752        Ok((
1753            input.parse_inline()?,
1754            input.parse_inline()?,
1755            input.parse_inline()?,
1756            input.parse_inline()?,
1757            input.parse_inline()?,
1758            input.parse_inline()?,
1759            input.parse_inline()?,
1760            input.parse_inline()?,
1761            input.parse_inline()?,
1762            input.parse_inline()?,
1763            input.parse()?,
1764        ))
1765    }
1766}
1767
1768impl<
1769    II: ParseInput,
1770    A: ParseInline<II>,
1771    B: ParseInline<II>,
1772    C: ParseInline<II>,
1773    D: ParseInline<II>,
1774    E: ParseInline<II>,
1775    F: ParseInline<II>,
1776    G: ParseInline<II>,
1777    H: ParseInline<II>,
1778    I: ParseInline<II>,
1779    J: ParseInline<II>,
1780    K: ParseInline<II>,
1781> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J, K)
1782{
1783    fn parse_inline(input: &mut II) -> crate::Result<Self> {
1784        Ok((
1785            input.parse_inline()?,
1786            input.parse_inline()?,
1787            input.parse_inline()?,
1788            input.parse_inline()?,
1789            input.parse_inline()?,
1790            input.parse_inline()?,
1791            input.parse_inline()?,
1792            input.parse_inline()?,
1793            input.parse_inline()?,
1794            input.parse_inline()?,
1795            input.parse_inline()?,
1796        ))
1797    }
1798}
1799
1800impl<
1801    A: MaybeHasNiche,
1802    B: MaybeHasNiche,
1803    C: MaybeHasNiche,
1804    D: MaybeHasNiche,
1805    E: MaybeHasNiche,
1806    F: MaybeHasNiche,
1807    G: MaybeHasNiche,
1808    H: MaybeHasNiche,
1809    I: MaybeHasNiche,
1810    J: MaybeHasNiche,
1811    K: MaybeHasNiche,
1812> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J, K)
1813{
1814    type MnArray = tarr![
1815        A::MnArray,
1816        B::MnArray,
1817        C::MnArray,
1818        D::MnArray,
1819        E::MnArray,
1820        F::MnArray,
1821        G::MnArray,
1822        H::MnArray,
1823        I::MnArray,
1824        J::MnArray,
1825        K::MnArray,
1826    ];
1827}
1828
1829impl<
1830    A: ByteOrd + InlineOutput,
1831    B: ByteOrd + InlineOutput,
1832    C: ByteOrd + InlineOutput,
1833    D: ByteOrd + InlineOutput,
1834    E: ByteOrd + InlineOutput,
1835    F: ByteOrd + InlineOutput,
1836    G: ByteOrd + InlineOutput,
1837    H: ByteOrd + InlineOutput,
1838    I: ByteOrd + InlineOutput,
1839    J: ByteOrd + InlineOutput,
1840    K: ByteOrd,
1841> ByteOrd for (A, B, C, D, E, F, G, H, I, J, K)
1842{
1843    fn bytes_cmp(&self, other: &Self) -> Ordering {
1844        Ordering::Equal
1845            .then_with(|| self.0.bytes_cmp(&other.0))
1846            .then_with(|| self.1.bytes_cmp(&other.1))
1847            .then_with(|| self.2.bytes_cmp(&other.2))
1848            .then_with(|| self.3.bytes_cmp(&other.3))
1849            .then_with(|| self.4.bytes_cmp(&other.4))
1850            .then_with(|| self.5.bytes_cmp(&other.5))
1851            .then_with(|| self.6.bytes_cmp(&other.6))
1852            .then_with(|| self.7.bytes_cmp(&other.7))
1853            .then_with(|| self.8.bytes_cmp(&other.8))
1854            .then_with(|| self.9.bytes_cmp(&other.9))
1855            .then_with(|| self.10.bytes_cmp(&other.10))
1856    }
1857}
1858
1859impl<
1860    A: Monostate,
1861    B: Monostate,
1862    C: Monostate,
1863    D: Monostate,
1864    E: Monostate,
1865    F: Monostate,
1866    G: Monostate,
1867    H: Monostate,
1868    I: Monostate,
1869    J: Monostate,
1870    K: Monostate,
1871> Monostate for (A, B, C, D, E, F, G, H, I, J, K)
1872{
1873}
1874
1875impl<
1876    A: InlineOutput,
1877    B: InlineOutput,
1878    C: InlineOutput,
1879    D: InlineOutput,
1880    E: InlineOutput,
1881    F: InlineOutput,
1882    G: InlineOutput,
1883    H: InlineOutput,
1884    I: InlineOutput,
1885    J: InlineOutput,
1886    K: InlineOutput,
1887    L: ToOutput,
1888> ToOutput for (A, B, C, D, E, F, G, H, I, J, K, L)
1889{
1890    fn to_output(&self, output: &mut (impl ?Sized + Output)) {
1891        self.0.to_output(output);
1892        self.1.to_output(output);
1893        self.2.to_output(output);
1894        self.3.to_output(output);
1895        self.4.to_output(output);
1896        self.5.to_output(output);
1897        self.6.to_output(output);
1898        self.7.to_output(output);
1899        self.8.to_output(output);
1900        self.9.to_output(output);
1901        self.10.to_output(output);
1902        self.11.to_output(output);
1903    }
1904}
1905
1906impl<
1907    A: InlineOutput,
1908    B: InlineOutput,
1909    C: InlineOutput,
1910    D: InlineOutput,
1911    E: InlineOutput,
1912    F: InlineOutput,
1913    G: InlineOutput,
1914    H: InlineOutput,
1915    I: InlineOutput,
1916    J: InlineOutput,
1917    K: InlineOutput,
1918    L: InlineOutput,
1919> InlineOutput for (A, B, C, D, E, F, G, H, I, J, K, L)
1920{
1921}
1922
1923impl<
1924    A: ListHashes,
1925    B: ListHashes,
1926    C: ListHashes,
1927    D: ListHashes,
1928    E: ListHashes,
1929    F: ListHashes,
1930    G: ListHashes,
1931    H: ListHashes,
1932    I: ListHashes,
1933    J: ListHashes,
1934    K: ListHashes,
1935    L: ListHashes,
1936> ListHashes for (A, B, C, D, E, F, G, H, I, J, K, L)
1937{
1938    fn list_hashes(&self, f: &mut (impl ?Sized + FnMut(Hash))) {
1939        self.0.list_hashes(f);
1940        self.1.list_hashes(f);
1941        self.2.list_hashes(f);
1942        self.3.list_hashes(f);
1943        self.4.list_hashes(f);
1944        self.5.list_hashes(f);
1945        self.6.list_hashes(f);
1946        self.7.list_hashes(f);
1947        self.8.list_hashes(f);
1948        self.9.list_hashes(f);
1949        self.10.list_hashes(f);
1950        self.11.list_hashes(f);
1951    }
1952}
1953
1954impl<
1955    A: Topological,
1956    B: Topological,
1957    C: Topological,
1958    D: Topological,
1959    E: Topological,
1960    F: Topological,
1961    G: Topological,
1962    H: Topological,
1963    I: Topological,
1964    J: Topological,
1965    K: Topological,
1966    L: Topological,
1967> Topological for (A, B, C, D, E, F, G, H, I, J, K, L)
1968{
1969    fn traverse(&self, visitor: &mut (impl ?Sized + PointVisitor)) {
1970        self.0.traverse(visitor);
1971        self.1.traverse(visitor);
1972        self.2.traverse(visitor);
1973        self.3.traverse(visitor);
1974        self.4.traverse(visitor);
1975        self.5.traverse(visitor);
1976        self.6.traverse(visitor);
1977        self.7.traverse(visitor);
1978        self.8.traverse(visitor);
1979        self.9.traverse(visitor);
1980        self.10.traverse(visitor);
1981        self.11.traverse(visitor);
1982    }
1983}
1984
1985impl<
1986    A: Tagged,
1987    B: Tagged,
1988    C: Tagged,
1989    D: Tagged,
1990    E: Tagged,
1991    F: Tagged,
1992    G: Tagged,
1993    H: Tagged,
1994    I: Tagged,
1995    J: Tagged,
1996    K: Tagged,
1997    L: Tagged,
1998> Tagged for (A, B, C, D, E, F, G, H, I, J, K, L)
1999{
2000    const TAGS: Tags = Tags(
2001        &[],
2002        &[
2003            &A::TAGS,
2004            &B::TAGS,
2005            &C::TAGS,
2006            &D::TAGS,
2007            &E::TAGS,
2008            &F::TAGS,
2009            &G::TAGS,
2010            &H::TAGS,
2011            &I::TAGS,
2012            &J::TAGS,
2013            &K::TAGS,
2014            &L::TAGS,
2015        ],
2016    );
2017}
2018
2019impl<
2020    A: Size,
2021    B: Size,
2022    C: Size,
2023    D: Size,
2024    E: Size,
2025    F: Size,
2026    G: Size,
2027    H: Size,
2028    I: Size,
2029    J: Size,
2030    K: Size,
2031    L: Size,
2032> Size for (A, B, C, D, E, F, G, H, I, J, K, L)
2033where
2034    tarr![
2035        A::Size,
2036        B::Size,
2037        C::Size,
2038        D::Size,
2039        E::Size,
2040        F::Size,
2041        G::Size,
2042        H::Size,
2043        I::Size,
2044        J::Size,
2045        K::Size,
2046        L::Size,
2047    ]: typenum::FoldAdd<Output: Unsigned>,
2048{
2049    const SIZE: usize = A::SIZE
2050        + B::SIZE
2051        + C::SIZE
2052        + D::SIZE
2053        + E::SIZE
2054        + F::SIZE
2055        + G::SIZE
2056        + H::SIZE
2057        + I::SIZE
2058        + J::SIZE
2059        + K::SIZE
2060        + L::SIZE;
2061
2062    type Size = <tarr![
2063        A::Size,
2064        B::Size,
2065        C::Size,
2066        D::Size,
2067        E::Size,
2068        F::Size,
2069        G::Size,
2070        H::Size,
2071        I::Size,
2072        J::Size,
2073        K::Size,
2074        L::Size,
2075    ] as typenum::FoldAdd>::Output;
2076}
2077
2078impl<
2079    II: ParseInput,
2080    A: ParseInline<II>,
2081    B: ParseInline<II>,
2082    C: ParseInline<II>,
2083    D: ParseInline<II>,
2084    E: ParseInline<II>,
2085    F: ParseInline<II>,
2086    G: ParseInline<II>,
2087    H: ParseInline<II>,
2088    I: ParseInline<II>,
2089    J: ParseInline<II>,
2090    K: ParseInline<II>,
2091    L: Parse<II>,
2092> Parse<II> for (A, B, C, D, E, F, G, H, I, J, K, L)
2093{
2094    fn parse(mut input: II) -> crate::Result<Self> {
2095        Ok((
2096            input.parse_inline()?,
2097            input.parse_inline()?,
2098            input.parse_inline()?,
2099            input.parse_inline()?,
2100            input.parse_inline()?,
2101            input.parse_inline()?,
2102            input.parse_inline()?,
2103            input.parse_inline()?,
2104            input.parse_inline()?,
2105            input.parse_inline()?,
2106            input.parse_inline()?,
2107            input.parse()?,
2108        ))
2109    }
2110}
2111
2112impl<
2113    II: ParseInput,
2114    A: ParseInline<II>,
2115    B: ParseInline<II>,
2116    C: ParseInline<II>,
2117    D: ParseInline<II>,
2118    E: ParseInline<II>,
2119    F: ParseInline<II>,
2120    G: ParseInline<II>,
2121    H: ParseInline<II>,
2122    I: ParseInline<II>,
2123    J: ParseInline<II>,
2124    K: ParseInline<II>,
2125    L: ParseInline<II>,
2126> ParseInline<II> for (A, B, C, D, E, F, G, H, I, J, K, L)
2127{
2128    fn parse_inline(input: &mut II) -> crate::Result<Self> {
2129        Ok((
2130            input.parse_inline()?,
2131            input.parse_inline()?,
2132            input.parse_inline()?,
2133            input.parse_inline()?,
2134            input.parse_inline()?,
2135            input.parse_inline()?,
2136            input.parse_inline()?,
2137            input.parse_inline()?,
2138            input.parse_inline()?,
2139            input.parse_inline()?,
2140            input.parse_inline()?,
2141            input.parse_inline()?,
2142        ))
2143    }
2144}
2145
2146impl<
2147    A: MaybeHasNiche,
2148    B: MaybeHasNiche,
2149    C: MaybeHasNiche,
2150    D: MaybeHasNiche,
2151    E: MaybeHasNiche,
2152    F: MaybeHasNiche,
2153    G: MaybeHasNiche,
2154    H: MaybeHasNiche,
2155    I: MaybeHasNiche,
2156    J: MaybeHasNiche,
2157    K: MaybeHasNiche,
2158    L: MaybeHasNiche,
2159> MaybeHasNiche for (A, B, C, D, E, F, G, H, I, J, K, L)
2160{
2161    type MnArray = tarr![
2162        A::MnArray,
2163        B::MnArray,
2164        C::MnArray,
2165        D::MnArray,
2166        E::MnArray,
2167        F::MnArray,
2168        G::MnArray,
2169        H::MnArray,
2170        I::MnArray,
2171        J::MnArray,
2172        K::MnArray,
2173        L::MnArray,
2174    ];
2175}
2176
2177impl<
2178    A: ByteOrd + InlineOutput,
2179    B: ByteOrd + InlineOutput,
2180    C: ByteOrd + InlineOutput,
2181    D: ByteOrd + InlineOutput,
2182    E: ByteOrd + InlineOutput,
2183    F: ByteOrd + InlineOutput,
2184    G: ByteOrd + InlineOutput,
2185    H: ByteOrd + InlineOutput,
2186    I: ByteOrd + InlineOutput,
2187    J: ByteOrd + InlineOutput,
2188    K: ByteOrd + InlineOutput,
2189    L: ByteOrd,
2190> ByteOrd for (A, B, C, D, E, F, G, H, I, J, K, L)
2191{
2192    fn bytes_cmp(&self, other: &Self) -> Ordering {
2193        Ordering::Equal
2194            .then_with(|| self.0.bytes_cmp(&other.0))
2195            .then_with(|| self.1.bytes_cmp(&other.1))
2196            .then_with(|| self.2.bytes_cmp(&other.2))
2197            .then_with(|| self.3.bytes_cmp(&other.3))
2198            .then_with(|| self.4.bytes_cmp(&other.4))
2199            .then_with(|| self.5.bytes_cmp(&other.5))
2200            .then_with(|| self.6.bytes_cmp(&other.6))
2201            .then_with(|| self.7.bytes_cmp(&other.7))
2202            .then_with(|| self.8.bytes_cmp(&other.8))
2203            .then_with(|| self.9.bytes_cmp(&other.9))
2204            .then_with(|| self.10.bytes_cmp(&other.10))
2205            .then_with(|| self.11.bytes_cmp(&other.11))
2206    }
2207}
2208
2209impl<
2210    A: Monostate,
2211    B: Monostate,
2212    C: Monostate,
2213    D: Monostate,
2214    E: Monostate,
2215    F: Monostate,
2216    G: Monostate,
2217    H: Monostate,
2218    I: Monostate,
2219    J: Monostate,
2220    K: Monostate,
2221    L: Monostate,
2222> Monostate for (A, B, C, D, E, F, G, H, I, J, K, L)
2223{
2224}