|
| 1 | +final class MBufferLong: |
| 2 | + final def +=(elem: Long): this.type = ??? |
| 3 | + |
| 4 | +type M[Tup <: Tuple] <: Tuple = Tup match |
| 5 | + case EmptyTuple => EmptyTuple |
| 6 | + case h *: t => BufferOf[h] *: M[t] |
| 7 | + |
| 8 | +type M2[T <: Tuple] <: Tuple = (T, M[T]) match |
| 9 | + case (h *: t, a *: b) => BufferOf[h] *: M2[t] |
| 10 | + case (EmptyTuple, EmptyTuple) => EmptyTuple |
| 11 | + case (_, EmptyTuple) => EmptyTuple |
| 12 | + case (EmptyTuple, _) => EmptyTuple |
| 13 | + |
| 14 | +type BufferOf[T] = T match |
| 15 | + case Long => MBufferLong |
| 16 | + |
| 17 | +inline def append[T](t: T, buffer: BufferOf[T]): BufferOf[T] = |
| 18 | + inline (t, buffer) match |
| 19 | + case (x: Long, y: BufferOf[Long]) => y.+=(x) |
| 20 | + buffer |
| 21 | + |
| 22 | +transparent inline def appendBuffers[T <: Tuple](t: T, buffers: M[T]): M2[T] = { |
| 23 | + inline (t, buffers) match |
| 24 | + case abcd: ((h *: t), bh *: bt) => |
| 25 | + val (hh *: tt, bh *: bt) = abcd |
| 26 | + val x: BufferOf[h] = append[h](hh, bh.asInstanceOf[BufferOf[h]]) |
| 27 | + x *: appendBuffers[t](tt, bt.asInstanceOf[M[t]]) |
| 28 | + case _: (EmptyTuple, EmptyTuple) => EmptyTuple |
| 29 | + case _: (_, EmptyTuple) => EmptyTuple |
| 30 | + case _: (EmptyTuple, _) => EmptyTuple |
| 31 | +} |
0 commit comments