@@ -85,15 +85,13 @@ bold s = s -- for now
85
85
-- putting strings
86
86
87
87
data Terminal
88
- = MkTerminal (IORef ( IO () )) Output Output
88
+ = MkTerminal (IORef String ) ( IORef Int ) ( String -> IO () ) ( String -> IO () )
89
89
90
- data Output
91
- = Output (String -> IO () ) (IORef String )
92
-
93
- newTerminal :: Output -> Output -> IO Terminal
90
+ newTerminal :: (String -> IO () ) -> (String -> IO () ) -> IO Terminal
94
91
newTerminal out err =
95
- do ref <- newIORef (return () )
96
- return (MkTerminal ref out err)
92
+ do res <- newIORef " "
93
+ tmp <- newIORef 0
94
+ return (MkTerminal res tmp out err)
97
95
98
96
withBuffering :: IO a -> IO a
99
97
withBuffering action = do
@@ -104,65 +102,39 @@ withBuffering action = do
104
102
action `finally` hSetBuffering stderr mode
105
103
106
104
withStdioTerminal :: (Terminal -> IO a ) -> IO a
107
- withStdioTerminal action = do
108
- out <- output (handle stdout)
109
- err <- output (handle stderr)
110
- withBuffering (newTerminal out err >>= action)
105
+ withStdioTerminal action =
106
+ withBuffering (newTerminal (handle stdout) (handle stderr) >>= action)
111
107
112
108
withNullTerminal :: (Terminal -> IO a ) -> IO a
113
- withNullTerminal action = do
114
- out <- output (const (return () ))
115
- err <- output (const (return () ))
116
- newTerminal out err >>= action
109
+ withNullTerminal action =
110
+ newTerminal (const (return () )) (const (return () )) >>= action
117
111
118
112
terminalOutput :: Terminal -> IO String
119
- terminalOutput (MkTerminal _ out _) = get out
113
+ terminalOutput (MkTerminal res _ _ _) = readIORef res
120
114
121
115
handle :: Handle -> String -> IO ()
122
116
handle h s = do
123
117
hPutStr h s
124
118
hFlush h
125
119
126
- output :: (String -> IO () ) -> IO Output
127
- output f = do
128
- r <- newIORef " "
129
- return (Output f r)
130
-
131
- put :: Output -> String -> IO ()
132
- put (Output f r) s = do
133
- f s
134
- modifyIORef r (++ s)
135
-
136
- get :: Output -> IO String
137
- get (Output _ r) = readIORef r
138
-
139
120
flush :: Terminal -> IO ()
140
- flush (MkTerminal ref _ _) =
141
- do io <- readIORef ref
142
- writeIORef ref (return () )
143
- io
144
-
145
- postpone :: Terminal -> IO () -> IO ()
146
- postpone (MkTerminal ref _ _) io' =
147
- do io <- readIORef ref
148
- writeIORef ref (io >> io')
121
+ flush (MkTerminal _ tmp _ err) =
122
+ do n <- readIORef tmp
123
+ writeIORef tmp 0
124
+ err (replicate n ' ' ++ replicate n ' \b ' )
149
125
150
126
putPart , putTemp , putLine :: Terminal -> String -> IO ()
151
- putPart tm@ (MkTerminal _ out _) s =
127
+ putPart tm@ (MkTerminal res _ out _) s =
152
128
do flush tm
153
- put out s
129
+ out s
130
+ modifyIORef' res (++ s)
154
131
155
- putTemp tm@ (MkTerminal _ _ err) s =
156
- do flush tm
157
- put err (s ++ [ ' \b ' | _ <- s ])
158
- postpone tm $
159
- put err ( [ ' ' | _ <- s ]
160
- ++ [ ' \b ' | _ <- s ]
161
- )
132
+ putLine tm s = putPart tm (s ++ " \n " )
162
133
163
- putLine tm@ (MkTerminal _ out _ ) s =
134
+ putTemp tm@ (MkTerminal _ tmp _ err ) s =
164
135
do flush tm
165
- put out (s ++ " \n " )
136
+ err (s ++ [ ' \b ' | _ <- s ])
137
+ modifyIORef' tmp (+ length s)
166
138
167
139
--------------------------------------------------------------------------
168
140
-- the end.
0 commit comments