X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FMaskbits.hs;h=06314e395f2043c12da778f81405203692e5ded2;hb=9200fe5fcab505e5a331514a6ee687c6f78011b1;hp=cb4ab8986b2bcd343540baa56dbda4a11e7d9dc6;hpb=ac6042568d7c10b3d9d070fb3c4b1864256e51ac;p=hath.git diff --git a/src/Maskbits.hs b/src/Maskbits.hs index cb4ab89..06314e3 100644 --- a/src/Maskbits.hs +++ b/src/Maskbits.hs @@ -1,18 +1,160 @@ module Maskbits ( Maskbits(..), + decrement, maskbits_from_string ) where +import Test.QuickCheck + -- A type representing the number of bits in a CIDR netmask. -data Maskbits = None | Maskbits Int - deriving (Eq, Show) +data Maskbits = None + | 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 None = "None" + 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 -> Maskbits -maskbits_from_int x | (x < 0) || (x > 32) = None - | otherwise = Maskbits x +maskbits_from_int 0 = Zero +maskbits_from_int 1 = One +maskbits_from_int 2 = Two +maskbits_from_int 3 = Three +maskbits_from_int 4 = Four +maskbits_from_int 5 = Five +maskbits_from_int 6 = Six +maskbits_from_int 7 = Seven +maskbits_from_int 8 = Eight +maskbits_from_int 9 = Nine +maskbits_from_int 10 = Ten +maskbits_from_int 11 = Eleven +maskbits_from_int 12 = Twelve +maskbits_from_int 13 = Thirteen +maskbits_from_int 14 = Fourteen +maskbits_from_int 15 = Fifteen +maskbits_from_int 16 = Sixteen +maskbits_from_int 17 = Seventeen +maskbits_from_int 18 = Eighteen +maskbits_from_int 19 = Nineteen +maskbits_from_int 20 = Twenty +maskbits_from_int 21 = TwentyOne +maskbits_from_int 22 = TwentyTwo +maskbits_from_int 23 = TwentyThree +maskbits_from_int 24 = TwentyFour +maskbits_from_int 25 = TwentyFive +maskbits_from_int 26 = TwentySix +maskbits_from_int 27 = TwentySeven +maskbits_from_int 28 = TwentyEight +maskbits_from_int 29 = TwentyNine +maskbits_from_int 30 = Thirty +maskbits_from_int 31 = ThirtyOne +maskbits_from_int 32 = ThirtyTwo +maskbits_from_int _ = None maskbits_from_string :: String -> Maskbits @@ -20,3 +162,41 @@ maskbits_from_string s = case (reads s :: [(Int, String)]) of [] -> None x:_ -> maskbits_from_int (fst x) + + + +decrement :: Maskbits -> Maskbits +decrement None = None +decrement Zero = None +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