X-Git-Url: http://gitweb.michael.orlitzky.com/?p=hath.git;a=blobdiff_plain;f=src%2FMaskbits.hs;h=51701f562276ece9cc216a0d9cb649624ff7fe1c;hp=ac46ccf96a316a3233e961d9e00d637c95c3d11b;hb=45ac9baca360d0f0dabe4576fb44c1634a50dbf7;hpb=18a81546e7c4ad10574918efb08b2e104e911d73 diff --git a/src/Maskbits.hs b/src/Maskbits.hs index ac46ccf..51701f5 100644 --- a/src/Maskbits.hs +++ b/src/Maskbits.hs @@ -1,10 +1,10 @@ -module Maskbits -( Maskbits(..), - decrement, - maskbits_from_string -) where +module Maskbits( + Maskbits(..), + ) +where + +import Test.QuickCheck (Arbitrary(..), elements) -import Test.QuickCheck -- | A type representing the number of bits in a CIDR netmask. data Maskbits = @@ -41,7 +41,7 @@ data Maskbits = | Thirty | ThirtyOne | ThirtyTwo - deriving (Eq, Ord) + deriving (Enum, Eq, Ord) instance Show Maskbits where @@ -117,87 +117,13 @@ instance Arbitrary Maskbits where 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 +instance Read Maskbits where + readsPrec _ = \s -> + case (reads s :: [(Int, String)]) of + [] -> [] + (x,leftover):_ -> go x leftover + where + go :: Int -> String -> [(Maskbits, String)] + go y s + | y < minBound || y > maxBound = [] + | otherwise = [(toEnum y, s)]