Proposal: overhaul System.Process
David Roundy
droundy at darcs.net
Fri May 16 11:10:43 EDT 2008
On Fri, May 16, 2008 at 02:34:48PM +0100, Neil Mitchell wrote:
> > - made it work on Windows, and the patch passes GHC's validate
> > on both Windows and Linux.
> >
> > Reminder: the deadline for discussion is 20 May (5 days).
>
> Fully support. I think it could benefit from a slight clarification to
> the documentation in createProcess, to help pattern-match safety
> checking.
>
> (aStdin,aStdout,aStderr,d) <- createProcess cp
> isJust aStdin == (std_in == CreatePipe)
>
> (and ditto for the out and err)
If only we had type families already, then we could define
-- These data constructors are exported
data Inherit = Inherit
data CreatePipe = CreatePipe
data UseHandle = UseHandle Handle
data NewHandle = NewHandle Handle
-- This class is not exported! (so CreateProcess needn't worry about new
-- instances sowing up)
class StdStream s where
type Out s
isInherit :: s -> Bool
isCreatePipe :: s -> Bool
isHandle :: s -> Maybe Handle
instance StdStream Inherit where
type Out Inherit = ()
...
instance StdStream IsHandle where
type Out IsHandle = ()
...
instance StdStream CreateProcess where
type Out Inherit = NewHandle
...
data CreateProcess sin sout serr = CreateProcess {
cmdspec :: CmdSpec
cwd :: (Maybe FilePath)
env :: (Maybe [(String, String)])
std_in :: sin
std_out :: sout
std_err :: serr
close_fds :: Bool
}
createProcess :: (StdStream sin, StdStream sout, StdStream serr) =>
CreateProcess sin sout serr
-> IO (Out sin, Out sout, Out serr, ProcessHandle)
Then we could have a static guarantee that we only try to peek at
actually-created pipes. I suppose this is a bit heavy infrastructure just
to avoid runtime checks for "Just", but in a few years (say, post
Haskell'...) it'd be nice to have safer instances like this.
David
More information about the Libraries
mailing list