]> gitweb.michael.orlitzky.com - hath.git/commitdiff
Implemented the combine_all function for Cidrs containing one another.
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 8 May 2010 16:45:46 +0000 (12:45 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sat, 8 May 2010 16:45:46 +0000 (12:45 -0400)
Removed the 'contains' export from the Cidr module.
Added a 'contains_proper' convenience function.

src/Cidr.hs

index 12d9689df71a7cbe955f4be1edb74c934263ef65..266b7c57f8a8e8318124a2518900de75a4d166ca 100644 (file)
@@ -1,7 +1,7 @@
 module Cidr
 ( Cidr(..),
   cidr_from_string,
-  contains
+  combine_all
 ) where
 
 import IPv4Address
@@ -91,3 +91,21 @@ contains (Cidr addr1 mbits1) (Cidr addr2 mbits2)
     where
       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