    module Data.IP.Mask where

    import Data.Bits
    import Data.IP.Addr
    import Data.Word
    import Data.IntMap hiding (map)

    ----------------------------------------------------------------

    maskIPv4 :: Int -> IPv4
    maskIPv4 len = IP4 (masksIPv4 ! len)

    maskIPv6 :: Int -> IPv6
    maskIPv6 len = IP6 (masksIPv6 ! len)

    masksWord32 :: [Word32]
    masksWord32 = take 33 $ iterate (`shift` 1) 0xffffffff

    masksIPv4 :: IntMap IPv4Addr
    masksIPv4 = fromList $ zip [32,31..0] masksWord32

    masksIPv6 :: IntMap IPv6Addr
    masksIPv6 = fromList $ zip [128,127..0] ms
      where
        ms = m0 ++ m1 ++ m2 ++ m3 ++ m4
        m0 = [(all1,all1,all1,all1)]
        m1 = map (\vmsk -> (all1,all1,all1,vmsk)) masks
        m2 = map (\vmsk -> (all1,all1,vmsk,all0)) masks
        m3 = map (\vmsk -> (all1,vmsk,all0,all0)) masks
        m4 = map (\vmsk -> (vmsk,all0,all0,all0)) masks
        masks = tail masksWord32
        all1 = 0xffffffff
        all0 = 0x00000000