X-Git-Url: http://gitweb.michael.orlitzky.com/?p=hath.git;a=blobdiff_plain;f=src%2FMaskbits.hs;h=27fa29fa2934e146f1d6ba848453bfacd0c7bfc7;hp=59efc2d2e6d61454d55abcf7d88f7c5a782f2542;hb=eee156f562f9c1c1194a67cef12f146304d88ce9;hpb=6257f1c59c5c9663f8d95996c1c35362417def71 diff --git a/src/Maskbits.hs b/src/Maskbits.hs index 59efc2d..27fa29f 100644 --- a/src/Maskbits.hs +++ b/src/Maskbits.hs @@ -1,204 +1,128 @@ -module Maskbits -( Maskbits(..), - decrement, - maskbits_from_string -) where +module Maskbits( + Maskbits(..) ) +where -import Test.QuickCheck +import Test.Tasty.QuickCheck ( Arbitrary(..), elements ) --- A type representing the number of bits in a CIDR netmask. -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) + +-- | 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 (Enum, 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" + 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 ] - - coarbitrary _ = variant 0 - - + 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 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 -maskbits_from_string s = +instance Read Maskbits where + readsPrec _ 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 + [] -> [] + (x,leftover):_ -> go x leftover + where + go :: Int -> String -> [(Maskbits, String)] + go x' leftover' + | x' < minBound || x' > maxBound = [] + | otherwise = [(toEnum x', leftover')]