Skip to content

Commit 9e8d029

Browse files
moving terminateProcess to Eff
1 parent 9cbd859 commit 9e8d029

File tree

4 files changed

+57
-37
lines changed

4 files changed

+57
-37
lines changed

app/Main.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import Effectful.Process (Process, runProcess)
2828
import Effectful.Reader.Static (Reader, runReader)
2929
import Effectful.State.Static.Shared (State, evalState)
3030
import Effectful.Time (Time, runTime)
31+
import Effectful.Concurrent (Concurrent, runConcurrent)
3132
import GHRB.Core (buildEmptyState)
3233
import GHRB.Core.Types (Args, Running (Running), St,
3334
getAllPackages, getPquery,
@@ -43,6 +44,7 @@ builder ::
4344
, State St :> es
4445
, Reader Args :> es
4546
, Time :> es
47+
, Concurrent :> es
4648
, IOE :> es
4749
)
4850
=> Eff es ()
@@ -68,4 +70,4 @@ main =
6870
Right set -> do
6971
untried' <- liftIO . shuffleIO . toList $ set
7072
let state = initialState {untried = untried'}
71-
runTime . evalState state $ finally builder terminate
73+
runConcurrent . runTime . evalState state $ finally builder terminate

eff/Data/Conduit/Process/Effectful.hs

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,47 @@ module Data.Conduit.Process.Effectful
55
( sourceProcessWithStreams
66
) where
77

8-
import Control.Concurrent.Async (Concurrently (..), runConcurrently)
9-
import Control.Exception (finally, onException)
10-
import Data.ByteString (ByteString)
11-
import Data.Conduit (ConduitT, runConduit, (.|))
12-
import Data.Conduit.Process (StreamingProcessHandle,
13-
streamingProcess,
14-
streamingProcessHandleRaw,
15-
waitForStreamingProcess)
16-
import Data.Void (Void)
17-
import Effectful (Eff, IOE, Limit (Unlimited),
18-
Persistence (Ephemeral),
19-
UnliftStrategy (ConcUnlift),
20-
withEffToIO, (:>))
21-
import System.Exit (ExitCode)
22-
import System.Process (CreateProcess, terminateProcess)
8+
import Data.ByteString (ByteString)
9+
import Data.Conduit (ConduitT, runConduit, (.|))
10+
import Data.Conduit.Process (StreamingProcessHandle,
11+
streamingProcess,
12+
streamingProcessHandleRaw,
13+
waitForStreamingProcess)
14+
import Data.Void (Void)
15+
import Effectful (Eff, IOE, Limit (Unlimited),
16+
Persistence (Ephemeral),
17+
UnliftStrategy (ConcUnlift),
18+
liftIO, withEffToIO, (:>))
19+
import Effectful.Concurrent.Async (Concurrent, Concurrently (..),
20+
runConcurrently)
21+
import Effectful.Exception (finally, onException)
22+
import Effectful.Process (CreateProcess, Process,
23+
terminateProcess)
24+
import System.Exit (ExitCode)
2325

2426
sourceProcessWithStreams ::
25-
(IOE :> es)
27+
(Process :> es, Concurrent :> es, IOE :> es)
2628
=> CreateProcess
2729
-> ConduitT () ByteString (Eff es) ()
2830
-> ConduitT ByteString Void (Eff es) a
2931
-> ConduitT ByteString Void (Eff es) b
3032
-> Eff es (ExitCode, a, b)
31-
sourceProcessWithStreams cp producerStdin consumerStdout consumerStderr =
32-
withEffToIO (ConcUnlift Ephemeral Unlimited) $ \u -> do
33-
((sinkStdin, closeStdin), (sourceStdout, closeStdout), (sourceStderr, closeStderr), sph) <-
34-
streamingProcess cp
35-
(_, resStdout, resStderr) <-
36-
runConcurrently
37-
((,,)
38-
<$> Concurrently
39-
(u (runConduit $ producerStdin .| sinkStdin)
40-
`finally` closeStdin)
41-
<*> Concurrently (u $ runConduit $ sourceStdout .| consumerStdout)
42-
<*> Concurrently (u $ runConduit $ sourceStderr .| consumerStderr))
43-
`finally` (closeStdout >> closeStderr)
44-
`onException` terminateStreamingProcess sph
45-
ec <- waitForStreamingProcess sph
46-
return (ec, resStdout, resStderr)
33+
sourceProcessWithStreams cp producerStdin consumerStdout consumerStderr = do
34+
((sinkStdin, closeStdin), (sourceStdout, closeStdout), (sourceStderr, closeStderr), sph) <-
35+
streamingProcess cp
36+
(_, resStdout, resStderr) <-
37+
runConcurrently
38+
((,,)
39+
<$> Concurrently
40+
(runConduit (producerStdin .| sinkStdin) `finally` closeStdin)
41+
<*> Concurrently (runConduit (sourceStdout .| consumerStdout))
42+
<*> Concurrently
43+
(runConduit (sourceStderr .| consumerStderr)
44+
`finally` (closeStdout >> closeStderr)))
45+
`onException` terminateStreamingProcess sph
46+
ec <- waitForStreamingProcess sph
47+
return (ec, resStdout, resStderr)
4748

48-
terminateStreamingProcess :: StreamingProcessHandle -> IO ()
49+
terminateStreamingProcess ::
50+
(Process :> es) => StreamingProcessHandle -> Eff es ()
4951
terminateStreamingProcess = terminateProcess . streamingProcessHandleRaw

src/GHRB/IO.hs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import qualified Data.Text as T (unpack)
1616
import Data.Time.Clock (UTCTime)
1717
import Distribution.Portage.Types (Package)
1818
import Effectful (Eff, IOE, (:>))
19+
import Effectful.Concurrent (Concurrent)
1920
import Effectful.FileSystem (FileSystem)
2021
import Effectful.Process (Process,
2122
readProcessWithExitCode)
@@ -86,7 +87,12 @@ runEmerge args pkg =
8687
""
8788

8889
runHaskellUpdater ::
89-
(IOE :> es, FileSystem :> es, Process :> es, Reader Args :> es)
90+
( IOE :> es
91+
, FileSystem :> es
92+
, Process :> es
93+
, Reader Args :> es
94+
, Concurrent :> es
95+
)
9096
=> Eff es (ExitCode, Stdout, Stderr)
9197
runHaskellUpdater =
9298
asks getHU >>= \haskellUpdater -> runTransparent haskellUpdater defaultHUArgs
@@ -166,6 +172,7 @@ install ::
166172
, Reader Args :> es
167173
, Process :> es
168174
, Time :> es
175+
, Concurrent :> es
169176
)
170177
=> Eff es (EmergeResult, Running)
171178
install = do
@@ -255,7 +262,8 @@ capturePortageOutput ::
255262
-> Eff es (ExitCode, String)
256263
capturePortageOutput pkg = do
257264
emerge <- asks getEmerge
258-
stderr (emerge ++ " " ++ unwords defaultEmergeArgs ++ " " ++ "--pretend --color=y")
265+
stderr
266+
(emerge ++ " " ++ unwords defaultEmergeArgs ++ " " ++ "--pretend --color=y")
259267
(exitCode, stdOut, stdErr) <- runEmerge ["--pretend", "--color=y"] pkg
260268
let output = stdOut ++ stdErr
261269
stderr ("pretend_return: " ++ output)
@@ -283,6 +291,7 @@ randomBuild ::
283291
, Reader Args :> es
284292
, Process :> es
285293
, Time :> es
294+
, Concurrent :> es
286295
, IOE :> es
287296
)
288297
=> Eff es Running

src/GHRB/IO/Cmd.hs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ import Data.Conduit (ConduitT, (.|))
1717
import Data.Conduit.Process.Effectful (sourceProcessWithStreams)
1818
import Data.Void (Void)
1919
import Effectful (Eff, IOE, (:>))
20+
import Effectful.Concurrent (Concurrent)
2021
import Effectful.FileSystem (FileSystem)
2122
import Effectful.FileSystem.IO.ByteString as BS (hPut)
23+
import Effectful.Process (Process)
2224
import Effectful.Reader.Static (Reader)
2325
import GHRB.Core.Types (Args, Stderr, Stdout)
2426
import GHRB.Core.Utils (prettyMessage)
@@ -65,7 +67,12 @@ installedArgs = ["-I"]
6567
-- | Run a command and dump stdout to @stdout@, stderr to @stderr@, also
6668
-- capturing both streams.
6769
runTransparent ::
68-
(IOE :> es, FileSystem :> es, Reader Args :> es)
70+
( IOE :> es
71+
, FileSystem :> es
72+
, Reader Args :> es
73+
, Concurrent :> es
74+
, Process :> es
75+
)
6976
=> FilePath -- ^ executable path
7077
-> [String] -- ^ arguments
7178
-- | Exit code, stdout, stderr

0 commit comments

Comments
 (0)