module Maskbits ( Maskbits(..), decrement, maskbits_from_string ) where import Test.QuickCheck -- | A type representing the number of bits in a CIDR netmask. data Maskbits = Zero | One | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Eleven | Twelve | Thirteen | Fourteen | Fifteen | Sixteen | Seventeen | Eighteen | Nineteen | Twenty | TwentyOne | TwentyTwo | TwentyThree | TwentyFour | TwentyFive | TwentySix | TwentySeven | TwentyEight | TwentyNine | Thirty | ThirtyOne | ThirtyTwo deriving (Eq, Ord) instance Show Maskbits where show Zero = "0" show One = "1" show Two = "2" show Three = "3" show Four = "4" show Five = "5" show Six = "6" show Seven = "7" show Eight = "8" show Nine = "9" show Ten = "10" show Eleven = "11" show Twelve = "12" show Thirteen = "13" show Fourteen = "14" show Fifteen = "15" show Sixteen = "16" show Seventeen = "17" show Eighteen = "18" show Nineteen = "19" show Twenty = "20" show TwentyOne = "21" show TwentyTwo = "22" show TwentyThree = "23" show TwentyFour = "24" show TwentyFive = "25" show TwentySix = "26" show TwentySeven = "27" show TwentyEight = "28" show TwentyNine = "29" show Thirty = "30" show ThirtyOne = "31" show ThirtyTwo = "32" instance Arbitrary Maskbits where arbitrary = elements [ Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Eleven, Twelve, Thirteen, Fourteen, Fifteen, Sixteen, Seventeen, Eighteen, Nineteen, Twenty, TwentyOne, TwentyTwo, TwentyThree, TwentyFour, TwentyFive, TwentySix, TwentySeven, TwentyEight, TwentyNine, Thirty, ThirtyOne, ThirtyTwo ] -- | There are only 32 bits in an IPv4 address, so there -- can't be more bits than that in the mask. maskbits_from_int :: Int -> Maybe Maskbits maskbits_from_int 0 = Just Zero maskbits_from_int 1 = Just One maskbits_from_int 2 = Just Two maskbits_from_int 3 = Just Three maskbits_from_int 4 = Just Four maskbits_from_int 5 = Just Five maskbits_from_int 6 = Just Six maskbits_from_int 7 = Just Seven maskbits_from_int 8 = Just Eight maskbits_from_int 9 = Just Nine maskbits_from_int 10 = Just Ten maskbits_from_int 11 = Just Eleven maskbits_from_int 12 = Just Twelve maskbits_from_int 13 = Just Thirteen maskbits_from_int 14 = Just Fourteen maskbits_from_int 15 = Just Fifteen maskbits_from_int 16 = Just Sixteen maskbits_from_int 17 = Just Seventeen maskbits_from_int 18 = Just Eighteen maskbits_from_int 19 = Just Nineteen maskbits_from_int 20 = Just Twenty maskbits_from_int 21 = Just TwentyOne maskbits_from_int 22 = Just TwentyTwo maskbits_from_int 23 = Just TwentyThree maskbits_from_int 24 = Just TwentyFour maskbits_from_int 25 = Just TwentyFive maskbits_from_int 26 = Just TwentySix maskbits_from_int 27 = Just TwentySeven maskbits_from_int 28 = Just TwentyEight maskbits_from_int 29 = Just TwentyNine maskbits_from_int 30 = Just Thirty maskbits_from_int 31 = Just ThirtyOne maskbits_from_int 32 = Just ThirtyTwo maskbits_from_int _ = Nothing -- | Convert a String to Maskbits, if possible. maskbits_from_string :: String -> Maybe Maskbits maskbits_from_string s = case (reads s :: [(Int, String)]) of [] -> Nothing x:_ -> maskbits_from_int (fst x) -- | Maskbits are just natural numbers, this returns the previous one. decrement :: Maskbits -> Maskbits decrement Zero = Zero decrement One = Zero decrement Two = One decrement Three = Two decrement Four = Three decrement Five = Four decrement Six = Five decrement Seven = Six decrement Eight = Seven decrement Nine = Eight decrement Ten = Nine decrement Eleven = Ten decrement Twelve = Eleven decrement Thirteen = Twelve decrement Fourteen = Thirteen decrement Fifteen = Fourteen decrement Sixteen = Fifteen decrement Seventeen = Sixteen decrement Eighteen = Seventeen decrement Nineteen = Eighteen decrement Twenty = Nineteen decrement TwentyOne = Twenty decrement TwentyTwo = TwentyOne decrement TwentyThree = TwentyTwo decrement TwentyFour = TwentyThree decrement TwentyFive = TwentyFour decrement TwentySix = TwentyFive decrement TwentySeven = TwentySix decrement TwentyEight = TwentySeven decrement TwentyNine = TwentyEight decrement Thirty = TwentyNine decrement ThirtyOne = Thirty decrement ThirtyTwo = ThirtyOne