Hello,
> > countIO :: String -> String -> Int
-> [a] -> IO [a]
> > countIO msg post step xs = sequence $ map unsafeInterleaveIO
> ((blank >> outmsg (0::Int) >> c):cs)
> > where (c:cs) = ct 0 xs
> > output = hPutStr stderr
> > blank = output
('\r':take 70 (repeat ' '))
> > outmsg x = output ('\r':msg++show
x) >> hFlush stderr
> > ct s ys = let (a,b) = splitAt
(step-1) ys
> >
next = s+step
> >
in case b of [b1] -> map return a ++ [outmsg
> (s+step) >> hPutStr stderr post >> return b1]
> >
[] -> map return
(init a) ++
> [outmsg (s+length a) >> hPutStr stderr post >> return
(last a)]
> >
_ -> map return a ++
[outmsg s >>
> return (head b)] ++ ct next (tail b)
>
> It wraps a list with IO operations, so that progress can be reported
> while evaluating the list elements. Unfortunately, there seems
to be
> a "stricness leak" here - and consequently, it does not
work on an
> infinite list.
>
Besides anything else, sequence will diverge on an infinite list. This
can be seen directly from the type:
sequence :: Monad m => [m a] ->
m [a]
It is necessary to compute all of the computations
in the list before returning any of the pure resulting list.
-Jeff
---
This e-mail may contain confidential and/or privileged information. If you
are not the intended recipient (or have received this e-mail in error)
please notify the sender immediately and destroy this e-mail. Any
unauthorized copying, disclosure or distribution of the material in this
e-mail is strictly forbidden.