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 <deduktionstheorem@googlemail.com>:
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