Proposal: overhaul System.Process

Simon Marlow marlowsd at gmail.com
Mon May 19 06:41:43 EDT 2008


David Roundy wrote:

> 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)

Yes, this is neat.  I also played around with an alternative formulation 
using GADTs, but decided against it because of course System.Process is 
supposed to present a portable API.  I sure hope we can add something like 
this in the future though.

Cheers,
	Simon



More information about the Libraries mailing list