on master help sign in
Remove the intermediate Concurrent/Time/Exception modules
commitfd93674cec512ae0e9942e1b1e70217b2a808ad9 authorHarendra Kumar <harendra@composewell.com> dateMon 27 Nov 2023, 04:55 (3 years ago) parent58439bc
16 files changed+232−286
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentCommon.hs+2−2 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentEager.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentInterleaved.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/ConcurrentOrdered.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/Exceptions.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/Reduce.hs+1−1 benchmark/Streamly/Benchmark/Data/Stream/Transform.hs+1−1 src/Streamly/Data/Stream/Concurrent.hs−195 src/Streamly/Data/Stream/Exception.hs−23 src/Streamly/Data/Stream/Prelude.hs+197−13 src/Streamly/Data/Stream/Time.hs−36 src/Streamly/Internal/Data/Stream/Prelude.hs+19 src/Streamly/Internal/FileSystem/Event/Windows.hs+2−2 streamly.cabal+4−7 test/Streamly/Test/Data/Stream/Concurrent.hs+1−1 test/Streamly/Test/FileSystem/Event/Common.hs+1−1
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentCommon.hs+2−2
@@ -14,12 +14,12 @@ where
1414import Stream.Common
1515 (composeN, benchIO, benchIOSink, benchIOSrc, sourceUnfoldrM)
1616import Streamly.Data.Stream (Stream)
17−import Streamly.Internal.Data.Stream.Concurrent (MonadAsync, Config)
17+import Streamly.Internal.Data.Stream.Prelude (MonadAsync, Config)
1818
1919import qualified Data.List as List
2020import qualified Streamly.Data.Fold as Fold
2121import qualified Streamly.Data.Stream as Stream
22−import qualified Streamly.Internal.Data.Stream.Concurrent as Async
22+import qualified Streamly.Internal.Data.Stream.Prelude as Async
2323
2424import Test.Tasty.Bench
2525import Prelude hiding (mapM)
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentEager.hs+1−1
@@ -9,7 +9,7 @@
99import Stream.ConcurrentCommon (allBenchmarks)
1010import Streamly.Benchmark.Common (runWithCLIOpts, defaultStreamSize)
1111
12−import qualified Streamly.Internal.Data.Stream.Concurrent as Async
12+import qualified Streamly.Internal.Data.Stream.Prelude as Async
1313
1414moduleName :: String
1515moduleName = "Data.Stream.ConcurrentEager"
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentInterleaved.hs+1−1
@@ -9,7 +9,7 @@
99import Stream.ConcurrentCommon (allBenchmarks)
1010import Streamly.Benchmark.Common (runWithCLIOpts, defaultStreamSize)
1111
12−import qualified Streamly.Internal.Data.Stream.Concurrent as Async
12+import qualified Streamly.Internal.Data.Stream.Prelude as Async
1313
1414moduleName :: String
1515moduleName = "Data.Stream.ConcurrentInterleaved"
benchmark/Streamly/Benchmark/Data/Stream/ConcurrentOrdered.hs+1−1
@@ -9,7 +9,7 @@
99import Stream.ConcurrentCommon (allBenchmarks)
1010import Streamly.Benchmark.Common (runWithCLIOpts, defaultStreamSize)
1111
12−import qualified Streamly.Internal.Data.Stream.Concurrent as Async
12+import qualified Streamly.Internal.Data.Stream.Prelude as Async
1313
1414moduleName :: String
1515moduleName = "Data.Stream.ConcurrentOrdered"
benchmark/Streamly/Benchmark/Data/Stream/Exceptions.hs+1−1
@@ -42,7 +42,7 @@ import qualified Streamly.Internal.Data.Unfold.Prelude as IUF
4242import qualified Streamly.Internal.Data.Stream.IsStream as Stream
4343#else
4444import qualified Streamly.Internal.Data.Stream as Stream
45−import qualified Streamly.Internal.Data.Stream.Exception.Lifted as Stream
45+import qualified Streamly.Internal.Data.Stream.Prelude as Stream
4646#endif
4747
4848import Test.Tasty.Bench hiding (env)
benchmark/Streamly/Benchmark/Data/Stream/Reduce.hs+1−1
@@ -48,7 +48,7 @@ import Streamly.Internal.Data.Stream (Stream)
4848import qualified Streamly.Internal.Data.Stream as S
4949#ifndef USE_STREAMLY_CORE
5050import qualified Streamly.Data.Stream.Prelude as S
51−import qualified Streamly.Internal.Data.Stream.Time as S
51+import qualified Streamly.Internal.Data.Stream.Prelude as S
5252#endif
5353
5454#ifdef USE_STREAMK
benchmark/Streamly/Benchmark/Data/Stream/Transform.hs+1−1
@@ -46,7 +46,7 @@ import Streamly.Internal.Data.Time.Units
4646import Streamly.Internal.Data.Stream (Stream)
4747import qualified Streamly.Internal.Data.Stream as Stream
4848#ifndef USE_STREAMLY_CORE
49−import qualified Streamly.Internal.Data.Stream.Time as Stream
49+import qualified Streamly.Internal.Data.Stream.Prelude as Stream
5050#endif
5151#ifdef USE_STREAMK
5252import Control.DeepSeq (NFData(..))
src/Streamly/Data/Stream/Concurrent.hsdeleted−195
@@ -1,195 +0,0 @@
1−-- |
2−-- Module : Streamly.Data.Stream.Concurrent
3−-- Copyright : (c) 2022 Composewell Technologies
4−-- License : BSD-3-Clause
5−-- Maintainer : streamly@composewell.com
6−-- Stability : released
7−-- Portability : GHC
8−--
9−-- This module provides concurrent streaming abstractions.
10−--
11−-- == Programming Tips
12−--
13−-- The names in this module do not conflict with other stream modules,
14−-- therefore, you can import it in the same namespace:
15−--
16−-- >>> import qualified Streamly.Data.Stream.Concurrent as Stream
17−
18−module Streamly.Data.Stream.Concurrent
19− (
20− -- $concurrency
21−
22− -- ** Types
23− MonadAsync
24−
25− -- ** Configuration
26− , Config
27−
28− -- *** Limits
29− , maxThreads
30− , maxBuffer
31−
32− -- *** Rate Control
33− , Rate(..)
34− , rate
35− , avgRate
36− , minRate
37− , maxRate
38− , constRate
39−
40− -- *** Stop behavior
41− , StopWhen (..)
42− , stopWhen
43−
44− -- *** Scheduling behavior
45− , eager
46− , ordered
47− , interleaved
48−
49− -- *** Diagnostics
50− , inspect
51−
52− -- ** Combinators
53− -- | Stream combinators using a concurrent channel.
54−
55− -- *** Evaluate
56− -- | Evaluates a serial stream asynchronously using a concurency channel.
57−
58− , parEval
59−
60− -- *** Generate
61− -- | Uses a concurrency channel to evaluate multiple actions concurrently.
62− , parRepeatM
63− , parReplicateM
64− , fromCallback
65−
66− -- *** Map
67− -- | Uses a concurrency channel to evaluate multiple mapped actions
68− -- concurrently.
69−
70− , parMapM
71− , parSequence
72−
73− -- *** Combine two
74− -- | Use a channel for each pair.
75− , parZipWithM
76− , parZipWith
77− , parMergeByM
78− , parMergeBy
79−
80− -- *** List of streams
81− -- | Shares a single channel across many streams.
82−
83− , parList
84− -- , zipWithM
85− -- , zipWith
86−
87− -- *** Stream of streams
88− -- **** Apply
89−
90− , parApply
91−
92− -- **** Concat
93− -- | Shares a single channel across many streams.
94−
95− , parConcat
96− , parConcatMap
97−
98− -- **** ConcatIterate
99− , parConcatIterate
100−
101− -- *** Observation
102− , parTapCount
103−
104− -- ** Deprecated
105− , tapCount
106− )
107−where
108−
109−import Streamly.Internal.Data.Stream.Concurrent
110−import Prelude hiding (mapM, sequence, concat, concatMap, zipWith)
111−
112−-- $concurrency
113−--
114−-- == Channels
115−--
116−-- At a lower level, concurrency is implemented using channels that support
117−-- concurrent evaluation of streams. We create a channel, and add one or more
118−-- streams to it. The channel evaluates multiple streams concurrently and then
119−-- generates a single output stream from the results. How the streams are
120−-- combined depends on the configuration of the channel.
121−--
122−-- == Primitives
123−--
124−-- There are only a few fundamental abstractions for concurrency, 'parEval',
125−-- 'parConcatMap', and 'parConcatIterate', all concurrency combinators can be
126−-- expressed in terms of these.
127−--
128−-- 'parEval', evaluates a single stream asynchronously, a worker thread runs
129−-- the stream and buffers the results, and the consumer of the stream runs in
130−-- another thread consuming it from the buffer, thus decoupling the production
131−-- and consumption of the stream. This can be used to run different stages of a
132−-- pipeline concurrently.
133−--
134−-- 'parConcatMap' is used to evaluate multiple streams concurrently and combine
135−-- the results. A stream generator function is mapped to the input stream and
136−-- all the generated streams are then evaluated concurrently, and the results
137−-- are combined.
138−--
139−-- 'parConcatIterate' is like 'parConcatMap' but iterates a stream generator
140−-- function recursively over the stream. This can be used to traverse trees or
141−-- graphs.
142−--
143−-- == Configuration
144−--
145−-- Concurrent combinators take a 'Config' argument which controls the
146−-- concurrent behavior. For example, maximum number of threads to be used
147−-- ('maxThreads') or the maxmimum size of the buffer ('maxBuffer'), or how the
148−-- streams are scheduled with respect to each other ('interleaved'), or how the
149−-- results are consumed ('ordered').
150−--
151−-- Configuration is specified as @Config -> Config@ modifier functions that can
152−-- be composed together using function composition. For example, to specify the
153−-- maximum threads we can use @parConcatMap (maxThreads 10)@ if we also want to
154−-- specify the maximum buffer we can compose the two options @parConcatMap
155−-- (maxThreads 10 . maxBuffer 100)@. To use default configuration use 'id' as
156−-- the config modifier e.g. @parConcatMap id@.
157−--
158−-- See the @Configuration@ section and individual configuration options'
159−-- documentation for the default behavior and default values of configuration
160−-- parameters.
161−--
162−-- == Scheduling
163−--
164−-- The most important configuration option is to control whether the output of
165−-- the concurrent execution is consumed in the same order as the corresponding
166−-- actions in the input stream or as soon as they arrive. The default is the
167−-- latter, however, we can enforce the original order by using the 'ordered'
168−-- option.
169−--
170−-- Another important option controls whether the number of worker threads are
171−-- automatically increased and decreased based on the consumption rate or
172−-- threads are started as aggresively as possible until the 'maxThreads' or
173−-- 'maxBuffer' limits are hit. The default is the former. However, the 'eager'
174−-- option can be enabled to use the latter behavior. When 'eager' is on, even
175−-- if the stream consumer thread blocks it does not make any impact on the
176−-- scheduling of the available tasks.
177−--
178−-- == Combinators
179−--
180−-- Using the few fundamental concurrency primitives we can implement all the
181−-- usual streaming combinators with concurrent behavior. Combinators like
182−-- 'unfoldrM', 'iterateM' that are inherently serial can be evaluated
183−-- concurrently with respect to the consumer pipeline using 'parEval'.
184−-- Combinators like 'zipWithM', 'mergeByM' can also use 'parEval' on the input
185−-- streams to evaluate them concurrently before combining.
186−--
187−-- Combinators like 'repeatM', 'replicateM', 'fromListM', 'sequence', 'mapM' in
188−-- which all actions are independent of each other can be made concurrent using
189−-- the 'parConcatMap' operation.
190−--
191−-- A concurrent 'repeatM' repeats an action using multiple concurrent
192−-- executions of the action. Similarly, a concurrent 'mapM' performs the mapped
193−-- action in independent threads.
194−--
195−-- Some common concurrent combinators are provided in this module.
src/Streamly/Data/Stream/Exception.hsdeleted−23
@@ -1,23 +0,0 @@
1−-- |
2−-- Module : Streamly.Data.Stream.Exception
3−-- Copyright : (c) 2022 Composewell Technologies
4−-- License : BSD-3-Clause
5−-- Maintainer : streamly@composewell.com
6−-- Stability : released
7−-- Portability : GHC
8−--
9−-- This module is designed such that it does not conflict with
10−-- "Streamly.Data.Stream" module.
11−--
12−-- >>> import qualified Streamly.Data.Stream.Exception as Stream
13−--
14−module Streamly.Data.Stream.Exception
15− (
16− after
17− , bracket
18− -- , bracket3
19− , finally
20− )
21−where
22−
23−import Streamly.Internal.Data.Stream.Lifted (bracket, finally, after)
src/Streamly/Data/Stream/Prelude.hs+197−13
@@ -8,7 +8,8 @@
88--
99-- All Stream related combinators including the streamly-core
1010-- "Streamly.Data.Stream" module, concurrency, time and lifted
11−-- exception operations.
11+-- exception operations. For more pre-release operations also see
12+-- "Streamly.Internal.Data.Stream.Prelude" module.
1213--
1314module Streamly.Data.Stream.Prelude
1415 (
@@ -17,22 +18,205 @@ module Streamly.Data.Stream.Prelude
1718 -- module. For more pre-release combinators also see
1819 -- "Streamly.Internal.Data.Stream" module.
1920 module Streamly.Data.Stream
21+
2022 -- * Concurrent Operations
21− -- | Also see "Streamly.Internal.Data.Stream.Concurrent" for more
22− -- pre-release functions.
23− , module Streamly.Data.Stream.Concurrent
23+ -- $concurrency
24+
25+ -- ** Types
26+ , MonadAsync
27+
28+ -- ** Configuration
29+ , Config
30+
31+ -- *** Limits
32+ , maxThreads
33+ , maxBuffer
34+
35+ -- *** Rate Control
36+ , Rate(..)
37+ , rate
38+ , avgRate
39+ , minRate
40+ , maxRate
41+ , constRate
42+
43+ -- *** Stop behavior
44+ , StopWhen (..)
45+ , stopWhen
46+
47+ -- *** Scheduling behavior
48+ , eager
49+ , ordered
50+ , interleaved
51+
52+ -- *** Diagnostics
53+ , inspect
54+
55+ -- ** Combinators
56+ -- | Stream combinators using a concurrent channel.
57+
58+ -- *** Evaluate
59+ -- | Evaluates a serial stream asynchronously using a concurency channel.
60+
61+ , parEval
62+
63+ -- *** Generate
64+ -- | Uses a concurrency channel to evaluate multiple actions concurrently.
65+ , parRepeatM
66+ , parReplicateM
67+ , fromCallback
68+
69+ -- *** Map
70+ -- | Uses a concurrency channel to evaluate multiple mapped actions
71+ -- concurrently.
72+
73+ , parMapM
74+ , parSequence
75+
76+ -- *** Combine two
77+ -- | Use a channel for each pair.
78+ , parZipWithM
79+ , parZipWith
80+ , parMergeByM
81+ , parMergeBy
82+
83+ -- *** List of streams
84+ -- | Shares a single channel across many streams.
85+
86+ , parList
87+ -- , zipWithM
88+ -- , zipWith
89+
90+ -- *** Stream of streams
91+ -- **** Apply
92+
93+ , parApply
94+
95+ -- **** Concat
96+ -- | Shares a single channel across many streams.
97+
98+ , parConcat
99+ , parConcatMap
100+
101+ -- **** ConcatIterate
102+ , parConcatIterate
103+
104+ -- *** Observation
105+ , parTapCount
106+
24107 -- * Time Related
25− -- | Also see "Streamly.Internal.Data.Stream.Time" for more pre-release
26− -- functions.
27− , module Streamly.Data.Stream.Time
108+
109+ -- ** Timers
110+ , interject
111+
112+ -- ** Trimming
113+ , takeInterval
114+ , dropInterval
115+
116+ -- ** Chunking
117+ , intervalsOf
118+
119+ -- ** Sampling
120+ , sampleIntervalEnd
121+ , sampleIntervalStart
122+ , sampleBurstEnd
123+ , sampleBurstStart
124+
28125 -- * Lifted Exceptions
29− -- | Also see "Streamly.Internal.Data.Stream.Exception.Lifted" for more
30− -- pre-release functions.
31− , module Streamly.Data.Stream.Exception
126+ , after
127+ , bracket
128+ -- , bracket3
129+ , finally
130+
131+ -- ** Deprecated
132+ , tapCount
32133 )
33134where
34135
35136import Streamly.Data.Stream
36−import Streamly.Data.Stream.Concurrent
37−import Streamly.Data.Stream.Exception
38−import Streamly.Data.Stream.Time
137+import Streamly.Internal.Data.Stream.Prelude
138+
139+-- $concurrency
140+--
141+-- == Channels
142+--
143+-- At a lower level, concurrency is implemented using channels that support
144+-- concurrent evaluation of streams. We create a channel, and add one or more
145+-- streams to it. The channel evaluates multiple streams concurrently and then
146+-- generates a single output stream from the results. How the streams are
147+-- combined depends on the configuration of the channel.
148+--
149+-- == Primitives
150+--
151+-- There are only a few fundamental abstractions for concurrency, 'parEval',
152+-- 'parConcatMap', and 'parConcatIterate', all concurrency combinators can be
153+-- expressed in terms of these.
154+--
155+-- 'parEval', evaluates a single stream asynchronously, a worker thread runs
156+-- the stream and buffers the results, and the consumer of the stream runs in
157+-- another thread consuming it from the buffer, thus decoupling the production
158+-- and consumption of the stream. This can be used to run different stages of a
159+-- pipeline concurrently.
160+--
161+-- 'parConcatMap' is used to evaluate multiple streams concurrently and combine
162+-- the results. A stream generator function is mapped to the input stream and
163+-- all the generated streams are then evaluated concurrently, and the results
164+-- are combined.
165+--
166+-- 'parConcatIterate' is like 'parConcatMap' but iterates a stream generator
167+-- function recursively over the stream. This can be used to traverse trees or
168+-- graphs.
169+--
170+-- == Configuration
171+--
172+-- Concurrent combinators take a 'Config' argument which controls the
173+-- concurrent behavior. For example, maximum number of threads to be used
174+-- ('maxThreads') or the maxmimum size of the buffer ('maxBuffer'), or how the
175+-- streams are scheduled with respect to each other ('interleaved'), or how the
176+-- results are consumed ('ordered').
177+--
178+-- Configuration is specified as @Config -> Config@ modifier functions that can
179+-- be composed together using function composition. For example, to specify the
180+-- maximum threads we can use @parConcatMap (maxThreads 10)@ if we also want to
181+-- specify the maximum buffer we can compose the two options @parConcatMap
182+-- (maxThreads 10 . maxBuffer 100)@. To use default configuration use 'id' as
183+-- the config modifier e.g. @parConcatMap id@.
184+--
185+-- See the @Configuration@ section and individual configuration options'
186+-- documentation for the default behavior and default values of configuration
187+-- parameters.
188+--
189+-- == Scheduling
190+--
191+-- The most important configuration option is to control whether the output of
192+-- the concurrent execution is consumed in the same order as the corresponding
193+-- actions in the input stream or as soon as they arrive. The default is the
194+-- latter, however, we can enforce the original order by using the 'ordered'
195+-- option.
196+--
197+-- Another important option controls whether the number of worker threads are
198+-- automatically increased and decreased based on the consumption rate or
199+-- threads are started as aggresively as possible until the 'maxThreads' or
200+-- 'maxBuffer' limits are hit. The default is the former. However, the 'eager'
201+-- option can be enabled to use the latter behavior. When 'eager' is on, even
202+-- if the stream consumer thread blocks it does not make any impact on the
203+-- scheduling of the available tasks.
204+--
205+-- == Combinators
206+--
207+-- Using the few fundamental concurrency primitives we can implement all the
208+-- usual streaming combinators with concurrent behavior. Combinators like
209+-- 'unfoldrM', 'iterateM' that are inherently serial can be evaluated
210+-- concurrently with respect to the consumer pipeline using 'parEval'.
211+-- Combinators like 'zipWithM', 'mergeByM' can also use 'parEval' on the input
212+-- streams to evaluate them concurrently before combining.
213+--
214+-- Combinators like 'repeatM', 'replicateM', 'fromListM', 'sequence', 'mapM' in
215+-- which all actions are independent of each other can be made concurrent using
216+-- the 'parConcatMap' operation.
217+--
218+-- A concurrent 'repeatM' repeats an action using multiple concurrent
219+-- executions of the action. Similarly, a concurrent 'mapM' performs the mapped
220+-- action in independent threads.
221+--
222+-- Some common concurrent combinators are provided in this module.
src/Streamly/Data/Stream/Time.hsdeleted−36
@@ -1,36 +0,0 @@
1−-- |
2−-- Module : Streamly.Data.Stream.Time
3−-- Copyright : (c) 2022 Composewell Technologies
4−-- License : BSD-3-Clause
5−-- Maintainer : streamly@composewell.com
6−-- Stability : released
7−-- Portability : GHC
8−--
9−-- This module provides time related streaming abstractions.
10−--
11−-- The names in this module do not conflict with other stream modules,
12−-- therefore, you can import it in the same namespace:
13−--
14−-- >>> import qualified Streamly.Data.Stream.Time as Stream
15−--
16−module Streamly.Data.Stream.Time
17− (
18− -- ** Timers
19− interject
20−
21− -- ** Trimming
22− , takeInterval
23− , dropInterval
24−
25− -- ** Chunking
26− , intervalsOf
27−
28− -- ** Sampling
29− , sampleIntervalEnd
30− , sampleIntervalStart
31− , sampleBurstEnd
32− , sampleBurstStart
33− )
34−where
35−
36−import Streamly.Internal.Data.Stream.Time
src/Streamly/Internal/Data/Stream/Prelude.hsnew file+19
@@ -0,0 +1,19 @@
1+-- |
2+-- Module : Streamly.Internal.Data.Stream.Prelude
3+-- Copyright : (c) 2022 Composewell Technologies
4+-- License : BSD-3-Clause
5+-- Maintainer : streamly@composewell.com
6+-- Stability : experimental
7+-- Portability : GHC
8+--
9+module Streamly.Internal.Data.Stream.Prelude
10+ (
11+ module Streamly.Internal.Data.Stream.Concurrent
12+ , module Streamly.Internal.Data.Stream.Time
13+ , module Streamly.Internal.Data.Stream.Lifted
14+ )
15+where
16+
17+import Streamly.Internal.Data.Stream.Concurrent
18+import Streamly.Internal.Data.Stream.Time
19+import Streamly.Internal.Data.Stream.Lifted
src/Streamly/Internal/FileSystem/Event/Windows.hs+2−2
@@ -119,13 +119,13 @@ import System.Win32.Types (BOOL, DWORD, HANDLE, LPVOID, LPDWORD, failIfFalse_)
119119
120120import Streamly.Data.Array (Array)
121121import Streamly.Data.Stream (Stream)
122−import Streamly.Data.Stream.Concurrent (eager)
122+import Streamly.Data.Stream.Prelude (eager)
123123
124124import qualified Data.List.NonEmpty as NonEmpty
125125import qualified Streamly.Data.Array as A (fromList)
126126import qualified Streamly.Data.Fold as Fold
127127import qualified Streamly.Data.Stream as S
128−import qualified Streamly.Data.Stream.Concurrent as S
128+import qualified Streamly.Data.Stream.Prelude as S
129129import qualified Streamly.Unicode.Stream as U
130130import qualified Streamly.Internal.Unicode.Utf8 as UTF8 (pack, toArray)
131131import qualified Streamly.Internal.Data.Array as A (read)
streamly.cabal+4−7
@@ -375,10 +375,8 @@ library
375375 , Streamly.Internal.Data.Unfold.Prelude
376376 , Streamly.Internal.Data.Fold.Prelude
377377
378− , Streamly.Internal.Data.Stream.Concurrent
378+ , Streamly.Internal.Data.Stream.Prelude
379379 , Streamly.Internal.Data.Stream.Zip.Concurrent
380− , Streamly.Internal.Data.Stream.Time
381− , Streamly.Internal.Data.Stream.Lifted
382380
383381 -- streamly-unicode (depends on unicode-data)
384382 , Streamly.Internal.Unicode.Utf8
@@ -446,10 +444,6 @@ library
446444 , Streamly.Internal.Data.Channel.Dispatcher
447445 , Streamly.Internal.Data.Channel.Worker
448446
449− , Streamly.Data.Stream.Exception
450− , Streamly.Data.Stream.Concurrent
451− , Streamly.Data.Stream.Time
452−
453447 , Streamly.Internal.Data.Stream.Concurrent.Channel.Type
454448 , Streamly.Internal.Data.Stream.Concurrent.Channel.Dispatcher
455449 , Streamly.Internal.Data.Stream.Concurrent.Channel.Consumer
@@ -457,6 +451,9 @@ library
457451 , Streamly.Internal.Data.Stream.Concurrent.Channel.Interleave
458452 , Streamly.Internal.Data.Stream.Concurrent.Channel.Operations
459453 , Streamly.Internal.Data.Stream.Concurrent.Channel
454+ , Streamly.Internal.Data.Stream.Concurrent
455+ , Streamly.Internal.Data.Stream.Time
456+ , Streamly.Internal.Data.Stream.Lifted
460457
461458 , Streamly.Internal.Data.Fold.Async
462459 , Streamly.Internal.Data.Fold.Concurrent.Channel.Type
test/Streamly/Test/Data/Stream/Concurrent.hs+1−1
@@ -26,7 +26,7 @@ import Test.Hspec as H
2626import qualified Streamly.Data.Fold as Fold ( toList )
2727import qualified Streamly.Data.Stream as Stream
2828 ( replicate, fromEffect, fromPure, fromList, fold, take, nil )
29−import qualified Streamly.Internal.Data.Stream.Concurrent as Async
29+import qualified Streamly.Internal.Data.Stream.Prelude as Async
3030
3131import Streamly.Test.Common (listEquals)
3232
test/Streamly/Test/FileSystem/Event/Common.hs+1−1
@@ -67,7 +67,7 @@ import System.IO.Temp (withSystemTempDirectory)
6767import qualified Data.List.NonEmpty as NonEmpty
6868import qualified Streamly.Internal.Data.Array as Array
6969import qualified Streamly.Internal.Data.Stream as Stream
70−import qualified Streamly.Internal.Data.Stream.Concurrent as Stream
70+import qualified Streamly.Internal.Data.Stream.Prelude as Stream
7171import qualified Streamly.Unicode.Stream as Unicode
7272
7373#if defined(FILESYSTEM_EVENT_LINUX)