Wrapping Code
Glynn Clements
glynn.clements at virgin.net
Sun Oct 26 01:31:58 EDT 2003
Dominic Steinitz wrote:
> Does anyone have any views on how to "wrap" code that has been designed to
> take input from handles but you now want to take input from strings? I want
> to make minimal changes to a module that already works and to code that uses
> that module. Here's my thinking below. I'd be interested in other approaches
> and pros and cons.
> Even nearer but still not good enough. So I went for type class:
>
> class Monad m => Foo m where
> get' :: Handle -> m Char
>
> instance Foo IO where
> get' = hGetChar
>
> instance Foo (State String) where
> get' = \_ -> do (x:xs) <- get; put xs; return x
For general usage, you would also need an equivalent of hIsEOF.
Also, for simple applications, you could just operate on String, and
use lazy I/O for dealing with files.
Aside: it would be useful to have a more robust interface to lazy I/O,
e.g.:
withHandle :: Handle -> (String -> a) -> IO a
which would be roughly equivalent to:
withHandle handle f = do
string <- hGetContents handle
return $ f string
except that exceptions would be handled correctly, i.e. withHandle
would throw the exception rather than just treating it as EOF.
--
Glynn Clements <glynn.clements at virgin.net>
More information about the Haskell
mailing list