From f373334f775c70b4a3667d7a0d43193e8beb19e7 Mon Sep 17 00:00:00 2001 From: Orion Kindel Date: Fri, 10 May 2024 18:14:05 -0500 Subject: [PATCH] feat: Pipes.Collect --- spago.yaml | 1 - src/Pipes.Collect.purs | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/Pipes.Collect.purs diff --git a/spago.yaml b/spago.yaml index 0851cd4..a744d99 100644 --- a/spago.yaml +++ b/spago.yaml @@ -32,7 +32,6 @@ package: - strings: ">=6.0.1 <7.0.0" - tailrec: ">=6.1.0 <7.0.0" - transformers: ">=6.0.0 <7.0.0" - - tuples: ">=7.0.0 <8.0.0" - unsafe-coerce: ">=6.0.0 <7.0.0" test: main: Test.Main diff --git a/src/Pipes.Collect.purs b/src/Pipes.Collect.purs new file mode 100644 index 0000000..9bbd964 --- /dev/null +++ b/src/Pipes.Collect.purs @@ -0,0 +1,18 @@ +module Pipes.Collect where + +import Prelude + +import Control.Monad.Rec.Class (class MonadRec) +import Control.Monad.ST.Class (liftST) +import Data.Array.ST as Array.ST +import Effect.Class (class MonadEffect, liftEffect) +import Pipes (for) as Pipes +import Pipes.Core (Producer) +import Pipes.Core (runEffect) as Pipes + +-- | Traverse a pipe, collecting into a mutable array with constant stack usage +collectArray :: forall a m. MonadRec m => MonadEffect m => Producer a m Unit -> m (Array a) +collectArray p = do + st <- liftEffect $ liftST $ Array.ST.new + Pipes.runEffect $ Pipes.for p \a -> void $ liftEffect $ liftST $ Array.ST.push a st + liftEffect $ liftST $ Array.ST.unsafeFreeze st