Tôi đang cố tạo ống dẫn có thể tiêu thụ nhiều luồng đầu vào. Tôi cần có khả năng chờ đợi một hoặc các luồng đầu vào khác không theo thứ tự cụ thể (ví dụ: không xen kẽ) làm cho zip vô dụng. Không có gì song song hoặc không xác định xảy ra ở đây: Tôi đang chờ trên một dòng này hay dòng kia. Tôi muốn để có thể viết mã tương tự như sau (nơi awaitA
và awaitB
đang chờ đợi trên dòng nhập dữ liệu đầu tiên hoặc thứ hai tương ứng):Sấy ống dẫn với nhiều đầu vào
do
_ <- awaitA
x <- awaitA
y <- awaitB
yield (x,y)
_ <- awaitB
_ <- awaitB
y' <- awaitB
yield (x,y')
Giải pháp tốt nhất mà tôi có là làm cho đơn nguyên bên trong ống dẫn khác, ví dụ
foo :: Sink i1 (ConduitM i2 o m)()
Mà sau đó cho phép
awaitA = await
awaitB = lift await
Và điều này chủ yếu hoạt động. Thật không may, điều này dường như làm cho nó rất khó khăn để cầu chì vào ống dẫn bên trong trước khi ống dẫn bên ngoài được kết nối hoàn toàn. Điều đầu tiên tôi thử là:
fuseInner :: Monad m =>
Conduit i2' m i2 ->
Sink i1 (ConduitM i2 o m)() ->
Sink i1 (ConduitM i2' o m)()
fuseInner x = transPipe (x =$=)
Nhưng điều này không làm việc, ít nhất là khi x
là stateful từ (x =$=)
được chạy nhiều lần, khởi động lại hiệu quả x
mỗi lần.
Có cách nào để viết fuseInner, ngắn đột nhập vào nội bộ của ống dẫn (có vẻ như nó sẽ là khá lộn xộn)? Có cách nào tốt hơn để xử lý nhiều luồng đầu vào không? Tôi chỉ là cách để vượt xa những gì conduit được thiết kế cho?
Cảm ơn!
Tôi giả sử rằng bạn muốn nói rằng bạn muốn nhận các phần tử khi chúng được tạo ra từ hai luồng đầu vào 'IO'. Sử dụng 'stm-conduit' để làm điều này. –
Tôi đã đọc câu hỏi được cập nhật của bạn. Là [this] (http://stackoverflow.com/questions/12496654/is-there-an-iteratee-like-concept-which-pulls-data-from-multiple-sources/12497593#12497593) gần hơn với những gì bạn có trong tâm trí? Nếu vậy, tôi có thể sửa đổi nó thành phiên bản 'conduit' tương đương và gửi nó như là một câu trả lời. –
Tôi nghĩ rằng liên kết mô tả chính xác những gì tôi đã thử ('foo' là một' Sink' trên một 'ConduitM' monad). Vấn đề là, tôi không thể tìm ra cách kết hợp với ống dẫn bên trong bằng chiến lược này. – Benson