Instances for BaudRate from System.Posix.Terminal

Hi, the c-libraries use BaudRate as integers, so how about to add Enum instance for BaudRate? It allow users to use fromEnum, toEnum methods. Like this: module System.Posix.Terminal ( ... data BaudRate = B0 ... | B115200 deriving ( Eq, Ord ) instance Enum BaudRate where fromEnum b = case b of B0 -> 0 B50 -> 50 B75 -> 75 B110 -> 110 B134 -> 134 B150 -> 150 B200 -> 200 B300 -> 300 B600 -> 600 B1200 -> 1200 B1800 -> 1800 B2400 -> 2400 B4800 -> 4800 B9600 -> 9600 B19200 -> 19200 B38400 -> 38400 B57600 -> 57600 B115200 -> 115200 toEnum i = case i of 0 -> B0 50 -> B50 75 -> B75 110 -> B110 134 -> B134 150 -> B150 200 -> B200 300 -> B300 600 -> B600 1200 -> B1200 1800 -> B1800 2400 -> B2400 4800 -> B4800 9600 -> B9600 19200 -> B19200 38400 -> B38400 57600 -> B57600 115200 -> B115200 _ -> error $ "unsupported baudrate " ++ show i

On 26/04/11 10:19, Heka Treep wrote:
Hi, the c-libraries use BaudRate as integers, so how about to add Enum instance for BaudRate? It allow users to use fromEnum, toEnum methods.
Like this:
module System.Posix.Terminal ( ...
data BaudRate = B0 ... | B115200 deriving ( Eq, Ord )
instance Enum BaudRate where fromEnum b = case b of B0 -> 0 B50 -> 50 B75 -> 75 [...] toEnum i = case i of 0 -> B0 50 -> B50 75 -> B75 [...]
This way, the default implementations of - succ, pred - enumFrom, enumFromTo, enumFromThen, enumFromThenTo will fail, because, e.g. succ B0 ~> toEnum (0 + 1) ~> error ... Do you want succ B0 to be B50? Does [B0,B75..] make sense? //Stephan

Well, with this things become too complicated :) When we deriving
instances for Eq, Ord or Show typeclasses for BaudRate it has the
right semantic. But to ensure the correct semantic for the Enum
typeclass we need to do all manually:
1. succ means "take a greater baud rate", when pred means "take a
lesser baud rate". succ B115200 = _|_ in terms of "there is no greater
baud rate" (just like head [] = _|_ means "there is no heads anymore")
and pred B0 = _|_ in terms of "there is no lesser baud rate".
2. toEnum / fromEnum is usefull for converting baud rates to/from
integers (e.g. for give it to foreign code).
3. enumFrom, enumFromThen, enumFromTo, enumFromThenTo serve to create
a range of available baud rates.
4. Infinite lists of baud rates is do not make sense of course,
because there is no such hardware :)
Finally, instances can be defined like this (but I don't write
enumFromThenTo and enumFromThen methods):
data BaudRate
= B0
| B50
| B75
| B110
| B134
| B150
| B200
| B300
| B600
| B1200
| B1800
| B2400
| B4800
| B9600
| B19200
| B38400
| B57600
| B115200
deriving ( Show, Eq, Ord )
instance Enum BaudRate where
fromEnum b = case b of
B0 -> 0
B50 -> 50
B75 -> 75
B110 -> 110
B134 -> 134
B150 -> 150
B200 -> 200
B300 -> 300
B600 -> 600
B1200 -> 1200
B1800 -> 1800
B2400 -> 2400
B4800 -> 4800
B9600 -> 9600
B19200 -> 19200
B38400 -> 38400
B57600 -> 57600
B115200 -> 115200
toEnum i = case i of
0 -> B0
50 -> B50
75 -> B75
110 -> B110
134 -> B134
150 -> B150
200 -> B200
300 -> B300
600 -> B600
1200 -> B1200
1800 -> B1800
2400 -> B2400
4800 -> B4800
9600 -> B9600
19200 -> B19200
38400 -> B38400
57600 -> B57600
115200 -> B115200
_ -> error $ "unsupported baudrate " ++ show i
succ B115200 = error "There is no greater baud rate."
succ b = head $ tail $ dropWhile (/= b) baudRates
pred B0 = error "There is no lesser baud rate."
pred b = last $ takeWhile (/= b) baudRates
enumFromTo b b' | b > b' = []
| b == b' = [b]
| otherwise = b : enumFromTo (succ b) b'
enumFrom b = enumFromTo b B115200
enumFromThenTo = undefined
enumFromThen = undefined
baudRates :: [BaudRate]
baudRates =
[ B0
, B50
, B75
, B110
, B134
, B150
, B200
, B300
, B600
, B1200
, B1800
, B2400
, B4800
, B9600
, B19200
, B38400
, B57600
, B115200
]
2011/4/26, Stephan Friedrichs
On 26/04/11 10:19, Heka Treep wrote:
Hi, the c-libraries use BaudRate as integers, so how about to add Enum instance for BaudRate? It allow users to use fromEnum, toEnum methods.
Like this:
module System.Posix.Terminal ( ...
data BaudRate = B0 ... | B115200 deriving ( Eq, Ord )
instance Enum BaudRate where fromEnum b = case b of B0 -> 0 B50 -> 50 B75 -> 75 [...] toEnum i = case i of 0 -> B0 50 -> B50 75 -> B75 [...]
This way, the default implementations of - succ, pred - enumFrom, enumFromTo, enumFromThen, enumFromThenTo will fail, because, e.g. succ B0 ~> toEnum (0 + 1) ~> error ... Do you want succ B0 to be B50? Does [B0,B75..] make sense?
//Stephan
_______________________________________________ Libraries mailing list Libraries@haskell.org http://www.haskell.org/mailman/listinfo/libraries
participants (2)
-
Heka Treep
-
Stephan Friedrichs