on master help sign in
Simplify implementations of Reporting.Progress.{Json,Repl}
4d8ad5cEvan Czaplicki
builder/src/Reporting/Progress/Json.hs+15−28
@@ -1,44 +1,31 @@
1module Reporting.Progress.Json
1module Reporting.Progress.Json
2− ( create
2+ ( reporter
3 )
3 )
4 where
4 where
5
5
6
6
7−import Control.Concurrent (forkIO)
7+import qualified Data.ByteString.Builder as B
8−import Control.Concurrent.Chan (Chan, newChan, readChan)
8+import System.IO (stderr)
9−import Control.Concurrent.MVar (newEmptyMVar, putMVar)
10
9
11import qualified Reporting.Exit as Exit
10import qualified Reporting.Exit as Exit
12import qualified Reporting.Progress as Progress
11import qualified Reporting.Progress as Progress
12+import qualified Json.Encode as Encode
13
13
14
14
15
15
16−-- CREATE
16+-- REPORTER
17
17
18
18
19−create :: IO Progress.Reporter
19+reporter :: Progress.Reporter
20−create =
20+reporter =
21− do chan <- newChan
21+ Progress.Reporter (\_ -> return ()) end
22− mvar <- newEmptyMVar
23− _ <- forkIO (loop chan >>= putMVar mvar)
24− return (Progress.makeReporter chan mvar)
25
22
26
23
24+end :: Maybe Exit.Exit -> IO ()
25+end maybeExit =
26+ case maybeExit of
27+ Just exit ->
28+ B.hPutBuilder stderr (Encode.encodeUgly (Exit.toJson exit))
27
29
28−-- LOOP
30+ Nothing ->
29−
30−
31−loop :: Chan Progress.Msg -> IO ()
32−loop chan =
33− do msg <- readChan chan
34− case msg of
35− Progress.Progress _ ->
36− loop chan
37−
38− Progress.End maybeExit ->
39− case maybeExit of
40− Just exit ->
41− Exit.toJson exit
42−
43− Nothing ->
44− return ()
31+ return ()
builder/src/Reporting/Progress/Repl.hs+12−29
@@ -1,44 +1,27 @@
1module Reporting.Progress.Repl
1module Reporting.Progress.Repl
2− ( create
2+ ( reporter
3 )
3 )
4 where
4 where
5
5
6
6
7−import Control.Concurrent (forkIO)
8−import Control.Concurrent.Chan (Chan, newChan, readChan)
9−import Control.Concurrent.MVar (newEmptyMVar, putMVar)
10−
11import qualified Reporting.Exit as Exit
7import qualified Reporting.Exit as Exit
12import qualified Reporting.Progress as Progress
8import qualified Reporting.Progress as Progress
13
9
14
10
15
11
16−-- CREATE
12+-- REPORTER
17−
18−
19−create :: IO Progress.Reporter
20−create =
21− do chan <- newChan
22− mvar <- newEmptyMVar
23− _ <- forkIO (loop chan >>= putMVar mvar)
24− return (Progress.makeReporter chan mvar)
25−
26−
27
13
28−-- LOOP
29
14
15+reporter :: Progress.Reporter
16+reporter =
17+ Progress.Reporter (\_ -> return ()) end
30
18
31−loop :: Chan Progress.Msg -> IO ()
32−loop chan =
33− do msg <- readChan chan
34− case msg of
35− Progress.Progress _ ->
36− loop chan
37
19
20+end :: Maybe Exit.Exit -> IO ()
38− Progress.End maybeExit ->
21+end maybeExit =
39− case maybeExit of
22+ case maybeExit of
40− Just exit ->
23+ Just exit ->
41− Exit.toStderr exit
24+ Exit.toStderr exit
42
25
43− Nothing ->
26+ Nothing ->
44− return ()
27+ return ()
ui/terminal/src/Make.hs+2−5
@@ -44,11 +44,8 @@ run paths (Flags optimize output report docs) =
44
44
45 makeReporter =
45 makeReporter =
46 case report of
46 case report of
47− Nothing ->
48− Terminal.create
47+ Nothing -> Terminal.create
49−
50− Just Json ->
48+ Just Json -> return Json.reporter
51− Json.create
52 in
49 in
53 do reporter <- makeReporter
50 do reporter <- makeReporter
54 void $ Task.run reporter $
51 void $ Task.run reporter $
ui/terminal/src/Repl.hs+1−2
@@ -148,8 +148,7 @@ data Output = None | Def N.Name | Expr Text.Text
148
148
149interpret :: Output -> State -> Runner (Maybe a)
149interpret :: Output -> State -> Runner (Maybe a)
150interpret def state =
150interpret def state =
151− do reporter <- liftIO $ Repl.create
152− result <- liftIO $ Task.run reporter $ compile def state
151+ do result <- liftIO $ Task.run Repl.reporter $ compile def state
153
152
154 case result of
153 case result of
155 Nothing ->
154 Nothing ->