private func send<each Request: Message.Request>(_ messages: repeat each Request) async throws -> (repeat (each Request).Response) { var count = 0 for _ in repeat each messages { count += 1 } var packet = Data() var index = 0 for message in repeat each messages { let data = message.encoded() let alignment = Data(count: 8 - data.count % 8) if index < count - 1 { let body = data + alignment var header = Header(data: body[..<64]) let payload = data[64...] header.nextCommand = UInt32(body.count) packet += sign(header.encoded() + payload + alignment) } else { packet += sign(data + alignment) } index += 1 } let responseData = try await connection.send(packet) let reader = ByteReader(responseData) var responses = [Data]() var header: Header var offset = 0 repeat { responses.append(Data(responseData[offset...])) header = reader.read() offset += Int(header.nextCommand) reader.seek(to: offset) } while header.nextCommand != 0 responses.append(Data(responseData[offset...])) var iterator = responses.makeIterator() func respond<R: Message.Request>(requestType: R.Type) -> R.Response { guard let next = iterator.next() else { fatalError() } return R.Response(data: next) } return (repeat respond(requestType: (each Request).self)) }
とりあえず動くのはこう。ただ、めちゃめちゃわかりにくくなる。ここから読めるコードに改善していくとするとfor message in repeat each messages {
をforループごと別の関数にするとかかな。