]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Cidr.hs
Define a show instance for Cidr.
[hath.git] / src / Cidr.hs
index ab1ef51cce7af37bb5e3bdbec269a512ca59976f..df35138aa8fca2d6f43c7a952f146f1fc8e4da87 100644 (file)
@@ -1,7 +1,7 @@
 module Cidr
 ( Cidr(..),
   cidr_from_string,
-  contains
+  combine_all
 ) where
 
 import IPv4Address
@@ -13,7 +13,12 @@ import Octet
 
 data Cidr = None | Cidr { ipv4address :: IPv4Address,
                           maskbits :: Maskbits }
-            deriving (Eq, Show)
+            deriving (Eq)
+
+
+instance Show Cidr where
+    show Cidr.None = "None"
+    show cidr = (show (ipv4address cidr)) ++ "/" ++ (show (maskbits cidr))
 
 
 -- Returns the mask portion of a CIDR address. That is, everything
@@ -85,9 +90,27 @@ contains _ (Cidr IPv4Address.None _) = False
 -- address and see if the result is the same as cidr1's mask applied
 -- to cidr1's address.
 --
-contains (Cidr addr1 (Maskbits mbits1)) (Cidr addr2 (Maskbits mbits2))
+contains (Cidr addr1 mbits1) (Cidr addr2 mbits2)
     | mbits1 > mbits2 = False
     | otherwise = addr1masked == addr2masked
     where
-      addr1masked = apply_mask addr1 (Maskbits mbits1)
-      addr2masked = apply_mask addr2 (Maskbits mbits1)
+      addr1masked = apply_mask addr1 mbits1
+      addr2masked = apply_mask addr2 mbits1
+
+
+contains_proper :: Cidr -> Cidr -> Bool
+contains_proper cidr1 cidr2 =
+    (cidr1 `contains` cidr2) && (not (cidr1 == cidr2))
+
+
+-- A CIDR range is redundant (with respect to the given list) if
+-- another CIDR range in that list properly contains it.
+redundant :: [Cidr] -> Cidr -> Bool
+redundant cidrlist cidr = any ((flip contains_proper) cidr) cidrlist
+
+
+-- We want to get rid of all the Cidrs that are properly contained
+-- in some other Cidr.
+combine_all :: [Cidr] -> [Cidr]
+combine_all cidrs =
+    filter (not . (redundant cidrs)) cidrs