{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,1,9]],"date-time":"2026-01-09T03:31:42Z","timestamp":1767929502325,"version":"3.49.0"},"reference-count":18,"publisher":"Association for Computing Machinery (ACM)","issue":"ICFP","license":[{"start":{"date-parts":[[2017,8,29]],"date-time":"2017-08-29T00:00:00Z","timestamp":1503964800000},"content-version":"vor","delay-in-days":0,"URL":"https:\/\/www.acm.org\/publications\/policies\/copyright_policy#Background"}],"content-domain":{"domain":["dl.acm.org"],"crossmark-restriction":true},"short-container-title":["Proc. ACM Program. Lang."],"published-print":{"date-parts":[[2017,8,29]]},"abstract":"<jats:p>Coroutine pipelines provide an attractive structuring mechanism for complex programs that process streams of data, with the advantage over lazy streams that both ends of a pipeline may interact with the I\/O system, as may processes in the middle. Two popular Haskell libraries, Pipes and Conduit, support such pipelines. In both libraries, pipelines are implemented in a direct style by combining a free monad of communication events with an interpreter for (pseudo-)parallel composition that interleaves the events of its argument processes. These implementations both suffer from a slow-down when processes are deeply nested in sequence or in parallel. We propose an alternative implementation of pipelines based on continuations that does not suffer from this slow-down. What is more, the implementation is significantly faster on small, communication-intensive examples even where they do not suffer from the slow-down, and comparable in speed with similar programs based on lazy streams. We also show that the continuation-based implementation may be derived from the direct-style implementation by algebraic reasoning.<\/jats:p>","DOI":"10.1145\/3110249","type":"journal-article","created":{"date-parts":[[2017,8,29]],"date-time":"2017-08-29T18:19:41Z","timestamp":1504030781000},"page":"1-23","update-policy":"https:\/\/doi.org\/10.1145\/crossmark-policy","source":"Crossref","is-referenced-by-count":5,"title":["Faster coroutine pipelines"],"prefix":"10.1145","volume":"1","author":[{"given":"Michael","family":"Spivey","sequence":"first","affiliation":[{"name":"University of Oxford, UK"}],"role":[{"role":"author","vocabulary":"crossref"}]}],"member":"320","published-online":{"date-parts":[[2017,8,29]]},"reference":[{"key":"e_1_2_2_1_1","doi-asserted-by":"publisher","DOI":"10.1145\/165180.165228"},{"key":"e_1_2_2_2_1","doi-asserted-by":"publisher","DOI":"10.1017\/S0956796804005192"},{"key":"e_1_2_2_3_1","unstructured":"Gabriel Gonzalez. 2012. Haskell Pipes library. (2012). http:\/\/hackage.haskell.org\/package\/pipes  Gabriel Gonzalez. 2012. Haskell Pipes library. (2012). http:\/\/hackage.haskell.org\/package\/pipes"},{"key":"e_1_2_2_4_1","doi-asserted-by":"publisher","DOI":"10.1145\/351240.351258"},{"key":"e_1_2_2_5_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-642-31113-0_16"},{"key":"e_1_2_2_6_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-540-44833-4_6"},{"key":"e_1_2_2_7_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-642-29822-6_15"},{"key":"e_1_2_2_8_1","doi-asserted-by":"publisher","DOI":"10.1145\/581690.581695"},{"key":"e_1_2_2_9_1","doi-asserted-by":"publisher","DOI":"10.1145\/2976002.2976010"},{"key":"e_1_2_2_10_1","unstructured":"ReactiveX. 2015. Documentation for Observable. (2015). http:\/\/reactivex.io\/documentation\/observable.html  ReactiveX. 2015. Documentation for Observable. (2015). http:\/\/reactivex.io\/documentation\/observable.html"},{"key":"e_1_2_2_11_1","doi-asserted-by":"publisher","DOI":"10.1145\/1133981.1134016"},{"key":"e_1_2_2_12_1","unstructured":"Michael Snoyman. 2011. Haskell Conduit library. (2011). http:\/\/hackage.haskell.org\/package\/conduit  Michael Snoyman. 2011. Haskell Conduit library. (2011). http:\/\/hackage.haskell.org\/package\/conduit"},{"key":"e_1_2_2_13_1","unstructured":"Ertugrul S\u00f6ylemez. 2016. Haskell Netwire library. (2016). http:\/\/hackage.haskell.org\/packages\/netwire  Ertugrul S\u00f6ylemez. 2016. Haskell Netwire library. (2016). http:\/\/hackage.haskell.org\/packages\/netwire"},{"key":"e_1_2_2_14_1","doi-asserted-by":"publisher","DOI":"10.1145\/2694344.2694368"},{"key":"e_1_2_2_15_1","doi-asserted-by":"publisher","DOI":"10.1145\/871895.871906"},{"key":"e_1_2_2_16_1","doi-asserted-by":"publisher","DOI":"10.1145\/2503778.2503783"},{"key":"e_1_2_2_17_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-540-70594-9_20"},{"key":"e_1_2_2_18_1","doi-asserted-by":"publisher","DOI":"10.1145\/1016850.1016861"}],"container-title":["Proceedings of the ACM on Programming Languages"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3110249","content-type":"unspecified","content-version":"vor","intended-application":"text-mining"},{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3110249","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2025,6,18]],"date-time":"2025-06-18T03:30:10Z","timestamp":1750217410000},"score":1,"resource":{"primary":{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3110249"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2017,8,29]]},"references-count":18,"journal-issue":{"issue":"ICFP","published-print":{"date-parts":[[2017,8,29]]}},"alternative-id":["10.1145\/3110249"],"URL":"https:\/\/doi.org\/10.1145\/3110249","relation":{},"ISSN":["2475-1421"],"issn-type":[{"value":"2475-1421","type":"electronic"}],"subject":[],"published":{"date-parts":[[2017,8,29]]},"assertion":[{"value":"2017-08-29","order":2,"name":"published","label":"Published","group":{"name":"publication_history","label":"Publication History"}}]}}