]> gitweb.michael.orlitzky.com - hath.git/blob - src/Maskbits.hs
Add more Haddock comments.
[hath.git] / src / Maskbits.hs
1 module Maskbits
2 ( Maskbits(..),
3 decrement,
4 maskbits_from_string
5 ) where
6
7 import Test.QuickCheck
8
9 -- | A type representing the number of bits in a CIDR netmask.
10 data Maskbits =
11 Zero
12 | One
13 | Two
14 | Three
15 | Four
16 | Five
17 | Six
18 | Seven
19 | Eight
20 | Nine
21 | Ten
22 | Eleven
23 | Twelve
24 | Thirteen
25 | Fourteen
26 | Fifteen
27 | Sixteen
28 | Seventeen
29 | Eighteen
30 | Nineteen
31 | Twenty
32 | TwentyOne
33 | TwentyTwo
34 | TwentyThree
35 | TwentyFour
36 | TwentyFive
37 | TwentySix
38 | TwentySeven
39 | TwentyEight
40 | TwentyNine
41 | Thirty
42 | ThirtyOne
43 | ThirtyTwo
44 deriving (Eq, Ord)
45
46
47 instance Show Maskbits where
48 show Zero = "0"
49 show One = "1"
50 show Two = "2"
51 show Three = "3"
52 show Four = "4"
53 show Five = "5"
54 show Six = "6"
55 show Seven = "7"
56 show Eight = "8"
57 show Nine = "9"
58 show Ten = "10"
59 show Eleven = "11"
60 show Twelve = "12"
61 show Thirteen = "13"
62 show Fourteen = "14"
63 show Fifteen = "15"
64 show Sixteen = "16"
65 show Seventeen = "17"
66 show Eighteen = "18"
67 show Nineteen = "19"
68 show Twenty = "20"
69 show TwentyOne = "21"
70 show TwentyTwo = "22"
71 show TwentyThree = "23"
72 show TwentyFour = "24"
73 show TwentyFive = "25"
74 show TwentySix = "26"
75 show TwentySeven = "27"
76 show TwentyEight = "28"
77 show TwentyNine = "29"
78 show Thirty = "30"
79 show ThirtyOne = "31"
80 show ThirtyTwo = "32"
81
82
83 instance Arbitrary Maskbits where
84 arbitrary =
85 elements [ Zero,
86 One,
87 Two,
88 Three,
89 Four,
90 Five,
91 Six,
92 Seven,
93 Eight,
94 Nine,
95 Ten,
96 Eleven,
97 Twelve,
98 Thirteen,
99 Fourteen,
100 Fifteen,
101 Sixteen,
102 Seventeen,
103 Eighteen,
104 Nineteen,
105 Twenty,
106 TwentyOne,
107 TwentyTwo,
108 TwentyThree,
109 TwentyFour,
110 TwentyFive,
111 TwentySix,
112 TwentySeven,
113 TwentyEight,
114 TwentyNine,
115 Thirty,
116 ThirtyOne,
117 ThirtyTwo ]
118
119
120
121 -- | There are only 32 bits in an IPv4 address, so there
122 -- can't be more bits than that in the mask.
123 maskbits_from_int :: Int -> Maybe Maskbits
124 maskbits_from_int 0 = Just Zero
125 maskbits_from_int 1 = Just One
126 maskbits_from_int 2 = Just Two
127 maskbits_from_int 3 = Just Three
128 maskbits_from_int 4 = Just Four
129 maskbits_from_int 5 = Just Five
130 maskbits_from_int 6 = Just Six
131 maskbits_from_int 7 = Just Seven
132 maskbits_from_int 8 = Just Eight
133 maskbits_from_int 9 = Just Nine
134 maskbits_from_int 10 = Just Ten
135 maskbits_from_int 11 = Just Eleven
136 maskbits_from_int 12 = Just Twelve
137 maskbits_from_int 13 = Just Thirteen
138 maskbits_from_int 14 = Just Fourteen
139 maskbits_from_int 15 = Just Fifteen
140 maskbits_from_int 16 = Just Sixteen
141 maskbits_from_int 17 = Just Seventeen
142 maskbits_from_int 18 = Just Eighteen
143 maskbits_from_int 19 = Just Nineteen
144 maskbits_from_int 20 = Just Twenty
145 maskbits_from_int 21 = Just TwentyOne
146 maskbits_from_int 22 = Just TwentyTwo
147 maskbits_from_int 23 = Just TwentyThree
148 maskbits_from_int 24 = Just TwentyFour
149 maskbits_from_int 25 = Just TwentyFive
150 maskbits_from_int 26 = Just TwentySix
151 maskbits_from_int 27 = Just TwentySeven
152 maskbits_from_int 28 = Just TwentyEight
153 maskbits_from_int 29 = Just TwentyNine
154 maskbits_from_int 30 = Just Thirty
155 maskbits_from_int 31 = Just ThirtyOne
156 maskbits_from_int 32 = Just ThirtyTwo
157 maskbits_from_int _ = Nothing
158
159
160 -- | Convert a String to Maskbits, if possible.
161 maskbits_from_string :: String -> Maybe Maskbits
162 maskbits_from_string s =
163 case (reads s :: [(Int, String)]) of
164 [] -> Nothing
165 x:_ -> maskbits_from_int (fst x)
166
167
168
169 -- | Maskbits are just natural numbers, this returns the previous one.
170 decrement :: Maskbits -> Maskbits
171 decrement Zero = Zero
172 decrement One = Zero
173 decrement Two = One
174 decrement Three = Two
175 decrement Four = Three
176 decrement Five = Four
177 decrement Six = Five
178 decrement Seven = Six
179 decrement Eight = Seven
180 decrement Nine = Eight
181 decrement Ten = Nine
182 decrement Eleven = Ten
183 decrement Twelve = Eleven
184 decrement Thirteen = Twelve
185 decrement Fourteen = Thirteen
186 decrement Fifteen = Fourteen
187 decrement Sixteen = Fifteen
188 decrement Seventeen = Sixteen
189 decrement Eighteen = Seventeen
190 decrement Nineteen = Eighteen
191 decrement Twenty = Nineteen
192 decrement TwentyOne = Twenty
193 decrement TwentyTwo = TwentyOne
194 decrement TwentyThree = TwentyTwo
195 decrement TwentyFour = TwentyThree
196 decrement TwentyFive = TwentyFour
197 decrement TwentySix = TwentyFive
198 decrement TwentySeven = TwentySix
199 decrement TwentyEight = TwentySeven
200 decrement TwentyNine = TwentyEight
201 decrement Thirty = TwentyNine
202 decrement ThirtyOne = Thirty
203 decrement ThirtyTwo = ThirtyOne