Вот решение, чтобы заставить мою проблему работать, надеюсь, вы сможете абстрагировать ее от любой ситуации.
Суть в том, что вам нужны и implicit def
, и implicit
в начале параметров.
/*
Note:
implicit def
implicit b1: ...
*/
implicit def tuple2Bytable[T1, T2](implicit b1: Bytable[T1], b2: Bytable[T2]): Bytable[(T1, T2)] =
Bytable[(T1, T2)](
b1.size + b2.size,
bb => {
val v1: T1 = b1.fromBytes(bb)
val v2: T2 = b2.fromBytes(bb)
(v1, v2)
},
(t, bb) => {
b1.toBytes(t._1, bb)
b2.toBytes(t._2, bb)
}
)
implicit def tuple3Bytable[T1, T2, T3](implicit b1: Bytable[T1], b2: Bytable[T2], b3: Bytable[T3]): Bytable[(T1, T2, T3)] =
Bytable[(T1, T2, T3)](
b1.size + b2.size + b3.size,
bb => {
val v1: T1 = b1.fromBytes(bb)
val v2: T2 = b2.fromBytes(bb)
val v3: T3 = b3.fromBytes(bb)
(v1, v2, v3)
},
(t, bb) => {
b1.toBytes(t._1, bb)
b2.toBytes(t._2, bb)
b3.toBytes(t._3, bb)
}
)