Carsten Schultz wrote:
Wouldn't that make
 getSocketOption :: Socket -> SocketOption -> IO Int
a bit strange? How would you propose to change it?

Possible, but also possibly overkill, would be:

newtype Debug = Debug Bool
newtype SendBuffer = SendBuffer (Maybe Int)
[...]

class SocketOption a where [...]

instance SocketOption Debug [...]
instance SocketOption SendBuffer [...]
[...]

setSocketOption :: SocketOption a => Socket -> a -> IO ()
getSocketOption :: SockerOption a => Socket -> IO a


However, while quite clever :-), this would not be far from having a seperate get/set-functions for every option (and could indeed be implemented that way).

This is a recurring problem and has been solved several times e.g. in some Haskell GUI bindings and my OpenGL/GLUT binding, see e.g.:

   http://haskell.org/HOpenGL/newAPI/OpenGL/Graphics.Rendering.OpenGL.GL.StateVar.html

If we had:

   socketOptionDebug :: Socket -> StateVar Bool
   socketOptionSendBuffer :: Socket -> StateVar (Maybe Int)
   ...

then we could write:

   socketOptionDebug mySocket $= True
   maybeBuf <- get $ socketOptionSendBuffer mySocket
   ...

But there are some reasons for not using this here:

   * Alas, HasGetter/HasSetter/StateVar/... are not standard.

   * It's a bit overkill for the simple task at hand. :-)

I would simply go for a single setter function and several getters here.

Cheers,
   S.

_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to