hw-ip-2.0.0.0: test/HaskellWorks/Data/Network/Gen.hs
module HaskellWorks.Data.Network.Gen
( canonicalIpv4Block
, canonicalIpv6Block
) where
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Network.Ip.Validity
import Hedgehog
import qualified Data.Bits as B
import qualified HaskellWorks.Data.Network.Ip.Ipv4 as V4
import qualified HaskellWorks.Data.Network.Ip.Ipv6 as V6
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
canonicalIpv4Block :: MonadGen m => m (V4.IpBlock Canonical)
canonicalIpv4Block = do
m <- G.word8 (R.linear 0 32)
let p = fromIntegral (32 - m)
w <- G.word32 (R.linear 0 ((0xffffffff .>. p) .<. p))
return (V4.IpBlock (V4.IpAddress (w .<. p)) (V4.IpNetMask m))
canonicalIpv6Block :: MonadGen m => m (V6.IpBlock Canonical)
canonicalIpv6Block = do
m <- G.word8 (R.linear 0 128)
let p = fromIntegral (128 - m)
w128 <- (,,,) <$> G.word32 (R.linear 0 0xffffffff)
<*> G.word32 (R.linear 0 0xffffffff)
<*> G.word32 (R.linear 0 0xffffffff)
<*> G.word32 (R.linear 0 0xffffffff)
return (V6.IpBlock (V6.IpAddress (w128 `B.shift` p)) (V6.IpNetMask m))