|
| 1 | +import assert from 'assert'; |
| 2 | + |
| 3 | +import {One} from '../../1-digit/1-One.js'; |
| 4 | +import {Two} from '../../1-digit/2-Two.js'; |
| 5 | +import {Three} from '../../1-digit/3-Three.js'; |
| 6 | +import {Four} from '../../1-digit/4-Four.js'; |
| 7 | +import {node3} from '../../2-node/node3.js'; |
| 8 | +import {Empty} from '../../3-tree/implementations/0-Empty.js'; |
| 9 | +import {Single} from '../../3-tree/implementations/1-Single.js'; |
| 10 | +import {Deep} from '../../3-tree/implementations/2-Deep.js'; |
| 11 | +import {Lazy} from '../../4-lazy/0-Lazy.js'; |
| 12 | + |
| 13 | +/** |
| 14 | + * _fill_right. |
| 15 | + * |
| 16 | + * @param {any} M |
| 17 | + * @param {One|Two|Three|Four} left |
| 18 | + * @param {Empty|Single|Deep|Lazy} middle |
| 19 | + * @param {any} x1 |
| 20 | + * @param {Iterator} iterator |
| 21 | + * @return {Deep} |
| 22 | + */ |
| 23 | +export default function _fill_right(M, left, middle, x1, iterator) { |
| 24 | + assert( |
| 25 | + left instanceof One || |
| 26 | + left instanceof Two || |
| 27 | + left instanceof Three || |
| 28 | + left instanceof Four, |
| 29 | + ); |
| 30 | + assert( |
| 31 | + middle instanceof Empty || |
| 32 | + middle instanceof Single || |
| 33 | + middle instanceof Deep || |
| 34 | + middle instanceof Lazy, |
| 35 | + ); |
| 36 | + let event; |
| 37 | + let x2; |
| 38 | + let x3; |
| 39 | + let y1; |
| 40 | + let y2; |
| 41 | + let y3; |
| 42 | + for (;;) { |
| 43 | + event = iterator.next(); |
| 44 | + if (event.done) return new Deep(M, left, middle, new One(x1)); |
| 45 | + x2 = event.value; |
| 46 | + |
| 47 | + event = iterator.next(); |
| 48 | + if (event.done) return new Deep(M, left, middle, new Two(x1, x2)); |
| 49 | + x3 = event.value; |
| 50 | + |
| 51 | + event = iterator.next(); |
| 52 | + if (event.done) return new Deep(M, left, middle, new Three(x1, x2, x3)); |
| 53 | + y1 = event.value; |
| 54 | + |
| 55 | + middle = middle.push(node3(M, x1, x2, x3)); |
| 56 | + |
| 57 | + event = iterator.next(); |
| 58 | + if (event.done) return new Deep(M, left, middle, new One(y1)); |
| 59 | + y2 = event.value; |
| 60 | + |
| 61 | + event = iterator.next(); |
| 62 | + if (event.done) return new Deep(M, left, middle, new Two(y1, y2)); |
| 63 | + y3 = event.value; |
| 64 | + |
| 65 | + event = iterator.next(); |
| 66 | + if (event.done) return new Deep(M, left, middle, new Three(y1, y2, y3)); |
| 67 | + x1 = event.value; |
| 68 | + |
| 69 | + middle = middle.push(node3(M, y1, y2, y3)); |
| 70 | + } |
| 71 | +} |
0 commit comments