module Data.PostgreSQL.NetworkAddress
(
Inet (..), Cidr (..), cidr4, cidr4', cidr6, cidr6',
NetAddress (..), netAddress4, netAddress6,
V4HostAddress (..), v4HostAddressOctets,
V6HostAddress (..), v6HostAddressLong, v6HostAddressWords,
v6HostAddress, v6HostAddressL, v6HostAddressR,
) where
import Control.Applicative (pure)
import Control.Monad (guard)
import Data.Word (Word8, Word16, Word32)
import Data.Bits (shiftL, shiftR, (.&.), (.|.))
data V4HostAddress =
V4HostAddress !Word8 !Word8 !Word8 !Word8
deriving (V4HostAddress -> V4HostAddress -> Bool
(V4HostAddress -> V4HostAddress -> Bool)
-> (V4HostAddress -> V4HostAddress -> Bool) -> Eq V4HostAddress
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: V4HostAddress -> V4HostAddress -> Bool
$c/= :: V4HostAddress -> V4HostAddress -> Bool
== :: V4HostAddress -> V4HostAddress -> Bool
$c== :: V4HostAddress -> V4HostAddress -> Bool
Eq, Eq V4HostAddress
Eq V4HostAddress =>
(V4HostAddress -> V4HostAddress -> Ordering)
-> (V4HostAddress -> V4HostAddress -> Bool)
-> (V4HostAddress -> V4HostAddress -> Bool)
-> (V4HostAddress -> V4HostAddress -> Bool)
-> (V4HostAddress -> V4HostAddress -> Bool)
-> (V4HostAddress -> V4HostAddress -> V4HostAddress)
-> (V4HostAddress -> V4HostAddress -> V4HostAddress)
-> Ord V4HostAddress
V4HostAddress -> V4HostAddress -> Bool
V4HostAddress -> V4HostAddress -> Ordering
V4HostAddress -> V4HostAddress -> V4HostAddress
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: V4HostAddress -> V4HostAddress -> V4HostAddress
$cmin :: V4HostAddress -> V4HostAddress -> V4HostAddress
max :: V4HostAddress -> V4HostAddress -> V4HostAddress
$cmax :: V4HostAddress -> V4HostAddress -> V4HostAddress
>= :: V4HostAddress -> V4HostAddress -> Bool
$c>= :: V4HostAddress -> V4HostAddress -> Bool
> :: V4HostAddress -> V4HostAddress -> Bool
$c> :: V4HostAddress -> V4HostAddress -> Bool
<= :: V4HostAddress -> V4HostAddress -> Bool
$c<= :: V4HostAddress -> V4HostAddress -> Bool
< :: V4HostAddress -> V4HostAddress -> Bool
$c< :: V4HostAddress -> V4HostAddress -> Bool
compare :: V4HostAddress -> V4HostAddress -> Ordering
$ccompare :: V4HostAddress -> V4HostAddress -> Ordering
$cp1Ord :: Eq V4HostAddress
Ord, Int -> V4HostAddress -> ShowS
[V4HostAddress] -> ShowS
V4HostAddress -> String
(Int -> V4HostAddress -> ShowS)
-> (V4HostAddress -> String)
-> ([V4HostAddress] -> ShowS)
-> Show V4HostAddress
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [V4HostAddress] -> ShowS
$cshowList :: [V4HostAddress] -> ShowS
show :: V4HostAddress -> String
$cshow :: V4HostAddress -> String
showsPrec :: Int -> V4HostAddress -> ShowS
$cshowsPrec :: Int -> V4HostAddress -> ShowS
Show, ReadPrec [V4HostAddress]
ReadPrec V4HostAddress
Int -> ReadS V4HostAddress
ReadS [V4HostAddress]
(Int -> ReadS V4HostAddress)
-> ReadS [V4HostAddress]
-> ReadPrec V4HostAddress
-> ReadPrec [V4HostAddress]
-> Read V4HostAddress
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [V4HostAddress]
$creadListPrec :: ReadPrec [V4HostAddress]
readPrec :: ReadPrec V4HostAddress
$creadPrec :: ReadPrec V4HostAddress
readList :: ReadS [V4HostAddress]
$creadList :: ReadS [V4HostAddress]
readsPrec :: Int -> ReadS V4HostAddress
$creadsPrec :: Int -> ReadS V4HostAddress
Read)
v4HostAddressOctets :: V4HostAddress -> (Word8, Word8, Word8, Word8)
v4HostAddressOctets :: V4HostAddress -> (Word8, Word8, Word8, Word8)
v4HostAddressOctets (V4HostAddress a :: Word8
a b :: Word8
b c :: Word8
c d :: Word8
d) = (Word8
a, Word8
b, Word8
c, Word8
d)
data V6HostAddress =
V6HostAddress !Word16 !Word16 !Word16 !Word16 !Word16 !Word16 !Word16 !Word16
deriving (V6HostAddress -> V6HostAddress -> Bool
(V6HostAddress -> V6HostAddress -> Bool)
-> (V6HostAddress -> V6HostAddress -> Bool) -> Eq V6HostAddress
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: V6HostAddress -> V6HostAddress -> Bool
$c/= :: V6HostAddress -> V6HostAddress -> Bool
== :: V6HostAddress -> V6HostAddress -> Bool
$c== :: V6HostAddress -> V6HostAddress -> Bool
Eq, Eq V6HostAddress
Eq V6HostAddress =>
(V6HostAddress -> V6HostAddress -> Ordering)
-> (V6HostAddress -> V6HostAddress -> Bool)
-> (V6HostAddress -> V6HostAddress -> Bool)
-> (V6HostAddress -> V6HostAddress -> Bool)
-> (V6HostAddress -> V6HostAddress -> Bool)
-> (V6HostAddress -> V6HostAddress -> V6HostAddress)
-> (V6HostAddress -> V6HostAddress -> V6HostAddress)
-> Ord V6HostAddress
V6HostAddress -> V6HostAddress -> Bool
V6HostAddress -> V6HostAddress -> Ordering
V6HostAddress -> V6HostAddress -> V6HostAddress
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: V6HostAddress -> V6HostAddress -> V6HostAddress
$cmin :: V6HostAddress -> V6HostAddress -> V6HostAddress
max :: V6HostAddress -> V6HostAddress -> V6HostAddress
$cmax :: V6HostAddress -> V6HostAddress -> V6HostAddress
>= :: V6HostAddress -> V6HostAddress -> Bool
$c>= :: V6HostAddress -> V6HostAddress -> Bool
> :: V6HostAddress -> V6HostAddress -> Bool
$c> :: V6HostAddress -> V6HostAddress -> Bool
<= :: V6HostAddress -> V6HostAddress -> Bool
$c<= :: V6HostAddress -> V6HostAddress -> Bool
< :: V6HostAddress -> V6HostAddress -> Bool
$c< :: V6HostAddress -> V6HostAddress -> Bool
compare :: V6HostAddress -> V6HostAddress -> Ordering
$ccompare :: V6HostAddress -> V6HostAddress -> Ordering
$cp1Ord :: Eq V6HostAddress
Ord, Int -> V6HostAddress -> ShowS
[V6HostAddress] -> ShowS
V6HostAddress -> String
(Int -> V6HostAddress -> ShowS)
-> (V6HostAddress -> String)
-> ([V6HostAddress] -> ShowS)
-> Show V6HostAddress
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [V6HostAddress] -> ShowS
$cshowList :: [V6HostAddress] -> ShowS
show :: V6HostAddress -> String
$cshow :: V6HostAddress -> String
showsPrec :: Int -> V6HostAddress -> ShowS
$cshowsPrec :: Int -> V6HostAddress -> ShowS
Show, ReadPrec [V6HostAddress]
ReadPrec V6HostAddress
Int -> ReadS V6HostAddress
ReadS [V6HostAddress]
(Int -> ReadS V6HostAddress)
-> ReadS [V6HostAddress]
-> ReadPrec V6HostAddress
-> ReadPrec [V6HostAddress]
-> Read V6HostAddress
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [V6HostAddress]
$creadListPrec :: ReadPrec [V6HostAddress]
readPrec :: ReadPrec V6HostAddress
$creadPrec :: ReadPrec V6HostAddress
readList :: ReadS [V6HostAddress]
$creadList :: ReadS [V6HostAddress]
readsPrec :: Int -> ReadS V6HostAddress
$creadsPrec :: Int -> ReadS V6HostAddress
Read)
v6HostAddressLong :: Word16 -> Word16 -> Word16 -> Word16
-> Word16 -> Word16 -> Word16 -> Word16
-> V6HostAddress
v6HostAddressLong :: Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> V6HostAddress
v6HostAddressLong = Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> V6HostAddress
V6HostAddress
v6HostAddress :: [Word16] -> [Word16] -> Maybe V6HostAddress
v6HostAddress :: [Word16] -> [Word16] -> Maybe V6HostAddress
v6HostAddress ls :: [Word16]
ls rs :: [Word16]
rs = do
let zlength :: Int
zlength = 8 Int -> Int -> Int
forall a. Num a => a -> a -> a
- [Word16] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Word16]
ls [Word16] -> [Word16] -> [Word16]
forall a. [a] -> [a] -> [a]
++ [Word16]
rs)
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
zlength Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 0
[a :: Word16
a, b :: Word16
b, c :: Word16
c, d :: Word16
d, e :: Word16
e, f :: Word16
f, g :: Word16
g, h :: Word16
h] <- [Word16] -> Maybe [Word16]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Word16] -> Maybe [Word16]) -> [Word16] -> Maybe [Word16]
forall a b. (a -> b) -> a -> b
$ [Word16]
ls [Word16] -> [Word16] -> [Word16]
forall a. [a] -> [a] -> [a]
++ Int -> Word16 -> [Word16]
forall a. Int -> a -> [a]
replicate Int
zlength 0 [Word16] -> [Word16] -> [Word16]
forall a. [a] -> [a] -> [a]
++ [Word16]
rs
V6HostAddress -> Maybe V6HostAddress
forall (f :: * -> *) a. Applicative f => a -> f a
pure (V6HostAddress -> Maybe V6HostAddress)
-> V6HostAddress -> Maybe V6HostAddress
forall a b. (a -> b) -> a -> b
$ Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> V6HostAddress
v6HostAddressLong Word16
a Word16
b Word16
c Word16
d Word16
e Word16
f Word16
g Word16
h
v6HostAddressR :: [Word16] -> Maybe V6HostAddress
v6HostAddressR :: [Word16] -> Maybe V6HostAddress
v6HostAddressR = [Word16] -> [Word16] -> Maybe V6HostAddress
v6HostAddress []
v6HostAddressL :: [Word16] -> Maybe V6HostAddress
v6HostAddressL :: [Word16] -> Maybe V6HostAddress
v6HostAddressL ls :: [Word16]
ls = [Word16] -> [Word16] -> Maybe V6HostAddress
v6HostAddress [Word16]
ls []
v6HostAddressWords :: V6HostAddress -> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
v6HostAddressWords :: V6HostAddress
-> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
v6HostAddressWords (V6HostAddress a :: Word16
a b :: Word16
b c :: Word16
c d :: Word16
d e :: Word16
e f :: Word16
f g :: Word16
g h :: Word16
h) =
(Word16
a, Word16
b, Word16
c, Word16
d, Word16
e, Word16
f, Word16
g, Word16
h)
data NetAddress
= NetAddress4 !V4HostAddress !Word8
| NetAddress6 !V6HostAddress !Word8
deriving (NetAddress -> NetAddress -> Bool
(NetAddress -> NetAddress -> Bool)
-> (NetAddress -> NetAddress -> Bool) -> Eq NetAddress
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NetAddress -> NetAddress -> Bool
$c/= :: NetAddress -> NetAddress -> Bool
== :: NetAddress -> NetAddress -> Bool
$c== :: NetAddress -> NetAddress -> Bool
Eq, Eq NetAddress
Eq NetAddress =>
(NetAddress -> NetAddress -> Ordering)
-> (NetAddress -> NetAddress -> Bool)
-> (NetAddress -> NetAddress -> Bool)
-> (NetAddress -> NetAddress -> Bool)
-> (NetAddress -> NetAddress -> Bool)
-> (NetAddress -> NetAddress -> NetAddress)
-> (NetAddress -> NetAddress -> NetAddress)
-> Ord NetAddress
NetAddress -> NetAddress -> Bool
NetAddress -> NetAddress -> Ordering
NetAddress -> NetAddress -> NetAddress
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NetAddress -> NetAddress -> NetAddress
$cmin :: NetAddress -> NetAddress -> NetAddress
max :: NetAddress -> NetAddress -> NetAddress
$cmax :: NetAddress -> NetAddress -> NetAddress
>= :: NetAddress -> NetAddress -> Bool
$c>= :: NetAddress -> NetAddress -> Bool
> :: NetAddress -> NetAddress -> Bool
$c> :: NetAddress -> NetAddress -> Bool
<= :: NetAddress -> NetAddress -> Bool
$c<= :: NetAddress -> NetAddress -> Bool
< :: NetAddress -> NetAddress -> Bool
$c< :: NetAddress -> NetAddress -> Bool
compare :: NetAddress -> NetAddress -> Ordering
$ccompare :: NetAddress -> NetAddress -> Ordering
$cp1Ord :: Eq NetAddress
Ord, Int -> NetAddress -> ShowS
[NetAddress] -> ShowS
NetAddress -> String
(Int -> NetAddress -> ShowS)
-> (NetAddress -> String)
-> ([NetAddress] -> ShowS)
-> Show NetAddress
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NetAddress] -> ShowS
$cshowList :: [NetAddress] -> ShowS
show :: NetAddress -> String
$cshow :: NetAddress -> String
showsPrec :: Int -> NetAddress -> ShowS
$cshowsPrec :: Int -> NetAddress -> ShowS
Show, ReadPrec [NetAddress]
ReadPrec NetAddress
Int -> ReadS NetAddress
ReadS [NetAddress]
(Int -> ReadS NetAddress)
-> ReadS [NetAddress]
-> ReadPrec NetAddress
-> ReadPrec [NetAddress]
-> Read NetAddress
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NetAddress]
$creadListPrec :: ReadPrec [NetAddress]
readPrec :: ReadPrec NetAddress
$creadPrec :: ReadPrec NetAddress
readList :: ReadS [NetAddress]
$creadList :: ReadS [NetAddress]
readsPrec :: Int -> ReadS NetAddress
$creadsPrec :: Int -> ReadS NetAddress
Read)
vmask4 :: (Ord a, Integral a) => a -> Bool
vmask4 :: a -> Bool
vmask4 = (a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= 32)
netAddress4 :: V4HostAddress
-> Word8
-> Maybe NetAddress
netAddress4 :: V4HostAddress -> Word8 -> Maybe NetAddress
netAddress4 a4 :: V4HostAddress
a4 m :: Word8
m
| Word8 -> Bool
forall a. (Ord a, Integral a) => a -> Bool
vmask4 Word8
m = NetAddress -> Maybe NetAddress
forall a. a -> Maybe a
Just (NetAddress -> Maybe NetAddress) -> NetAddress -> Maybe NetAddress
forall a b. (a -> b) -> a -> b
$ V4HostAddress -> Word8 -> NetAddress
NetAddress4 V4HostAddress
a4 Word8
m
| Bool
otherwise = Maybe NetAddress
forall a. Maybe a
Nothing
vmask6 :: (Ord a, Integral a) => a -> Bool
vmask6 :: a -> Bool
vmask6 = (a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= 128)
netAddress6 :: V6HostAddress
-> Word8
-> Maybe NetAddress
netAddress6 :: V6HostAddress -> Word8 -> Maybe NetAddress
netAddress6 a6 :: V6HostAddress
a6 m :: Word8
m
| Word8 -> Bool
forall a. (Ord a, Integral a) => a -> Bool
vmask6 Word8
m = NetAddress -> Maybe NetAddress
forall a. a -> Maybe a
Just (NetAddress -> Maybe NetAddress) -> NetAddress -> Maybe NetAddress
forall a b. (a -> b) -> a -> b
$ V6HostAddress -> Word8 -> NetAddress
NetAddress6 V6HostAddress
a6 Word8
m
| Bool
otherwise = Maybe NetAddress
forall a. Maybe a
Nothing
newtype Inet = Inet NetAddress deriving (Inet -> Inet -> Bool
(Inet -> Inet -> Bool) -> (Inet -> Inet -> Bool) -> Eq Inet
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Inet -> Inet -> Bool
$c/= :: Inet -> Inet -> Bool
== :: Inet -> Inet -> Bool
$c== :: Inet -> Inet -> Bool
Eq, Eq Inet
Eq Inet =>
(Inet -> Inet -> Ordering)
-> (Inet -> Inet -> Bool)
-> (Inet -> Inet -> Bool)
-> (Inet -> Inet -> Bool)
-> (Inet -> Inet -> Bool)
-> (Inet -> Inet -> Inet)
-> (Inet -> Inet -> Inet)
-> Ord Inet
Inet -> Inet -> Bool
Inet -> Inet -> Ordering
Inet -> Inet -> Inet
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Inet -> Inet -> Inet
$cmin :: Inet -> Inet -> Inet
max :: Inet -> Inet -> Inet
$cmax :: Inet -> Inet -> Inet
>= :: Inet -> Inet -> Bool
$c>= :: Inet -> Inet -> Bool
> :: Inet -> Inet -> Bool
$c> :: Inet -> Inet -> Bool
<= :: Inet -> Inet -> Bool
$c<= :: Inet -> Inet -> Bool
< :: Inet -> Inet -> Bool
$c< :: Inet -> Inet -> Bool
compare :: Inet -> Inet -> Ordering
$ccompare :: Inet -> Inet -> Ordering
$cp1Ord :: Eq Inet
Ord, Int -> Inet -> ShowS
[Inet] -> ShowS
Inet -> String
(Int -> Inet -> ShowS)
-> (Inet -> String) -> ([Inet] -> ShowS) -> Show Inet
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Inet] -> ShowS
$cshowList :: [Inet] -> ShowS
show :: Inet -> String
$cshow :: Inet -> String
showsPrec :: Int -> Inet -> ShowS
$cshowsPrec :: Int -> Inet -> ShowS
Show, ReadPrec [Inet]
ReadPrec Inet
Int -> ReadS Inet
ReadS [Inet]
(Int -> ReadS Inet)
-> ReadS [Inet] -> ReadPrec Inet -> ReadPrec [Inet] -> Read Inet
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Inet]
$creadListPrec :: ReadPrec [Inet]
readPrec :: ReadPrec Inet
$creadPrec :: ReadPrec Inet
readList :: ReadS [Inet]
$creadList :: ReadS [Inet]
readsPrec :: Int -> ReadS Inet
$creadsPrec :: Int -> ReadS Inet
Read)
newtype Cidr = Cidr NetAddress deriving (Cidr -> Cidr -> Bool
(Cidr -> Cidr -> Bool) -> (Cidr -> Cidr -> Bool) -> Eq Cidr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Cidr -> Cidr -> Bool
$c/= :: Cidr -> Cidr -> Bool
== :: Cidr -> Cidr -> Bool
$c== :: Cidr -> Cidr -> Bool
Eq, Eq Cidr
Eq Cidr =>
(Cidr -> Cidr -> Ordering)
-> (Cidr -> Cidr -> Bool)
-> (Cidr -> Cidr -> Bool)
-> (Cidr -> Cidr -> Bool)
-> (Cidr -> Cidr -> Bool)
-> (Cidr -> Cidr -> Cidr)
-> (Cidr -> Cidr -> Cidr)
-> Ord Cidr
Cidr -> Cidr -> Bool
Cidr -> Cidr -> Ordering
Cidr -> Cidr -> Cidr
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Cidr -> Cidr -> Cidr
$cmin :: Cidr -> Cidr -> Cidr
max :: Cidr -> Cidr -> Cidr
$cmax :: Cidr -> Cidr -> Cidr
>= :: Cidr -> Cidr -> Bool
$c>= :: Cidr -> Cidr -> Bool
> :: Cidr -> Cidr -> Bool
$c> :: Cidr -> Cidr -> Bool
<= :: Cidr -> Cidr -> Bool
$c<= :: Cidr -> Cidr -> Bool
< :: Cidr -> Cidr -> Bool
$c< :: Cidr -> Cidr -> Bool
compare :: Cidr -> Cidr -> Ordering
$ccompare :: Cidr -> Cidr -> Ordering
$cp1Ord :: Eq Cidr
Ord, Int -> Cidr -> ShowS
[Cidr] -> ShowS
Cidr -> String
(Int -> Cidr -> ShowS)
-> (Cidr -> String) -> ([Cidr] -> ShowS) -> Show Cidr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Cidr] -> ShowS
$cshowList :: [Cidr] -> ShowS
show :: Cidr -> String
$cshow :: Cidr -> String
showsPrec :: Int -> Cidr -> ShowS
$cshowsPrec :: Int -> Cidr -> ShowS
Show, ReadPrec [Cidr]
ReadPrec Cidr
Int -> ReadS Cidr
ReadS [Cidr]
(Int -> ReadS Cidr)
-> ReadS [Cidr] -> ReadPrec Cidr -> ReadPrec [Cidr] -> Read Cidr
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Cidr]
$creadListPrec :: ReadPrec [Cidr]
readPrec :: ReadPrec Cidr
$creadPrec :: ReadPrec Cidr
readList :: ReadS [Cidr]
$creadList :: ReadS [Cidr]
readsPrec :: Int -> ReadS Cidr
$creadsPrec :: Int -> ReadS Cidr
Read)
maskCidr4 :: V4HostAddress -> Word8 -> (Word32, Word32)
maskCidr4 :: V4HostAddress -> Word8 -> (Word32, Word32)
maskCidr4 (V4HostAddress w0 :: Word8
w0 w1 :: Word8
w1 w2 :: Word8
w2 w3 :: Word8
w3) m :: Word8
m =
(Word32
a4 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. (1 Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`shiftL` Int
mi Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- 1) Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`shiftL` (32 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
mi), Word32
a4)
where
mi :: Int
mi = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
m
a4 :: Word32
a4 :: Word32
a4 = (Word32 -> Word32 -> Word32) -> Word32 -> [Word32] -> Word32
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
(.|.) 0 ([Word32] -> Word32) -> [Word32] -> Word32
forall a b. (a -> b) -> a -> b
$ (Word8 -> Int -> Word32) -> [Word8] -> [Int] -> [Word32]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
(\w :: Word8
w x :: Int
x -> Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
w Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`shiftL` Int
x)
[Word8
w3, Word8
w2, Word8
w1, Word8
w0]
[0,8 ..]
cidr4' :: V4HostAddress -> Word8 -> Maybe Cidr
cidr4' :: V4HostAddress -> Word8 -> Maybe Cidr
cidr4' ha0 :: V4HostAddress
ha0 m :: Word8
m = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Bool
forall a. (Ord a, Integral a) => a -> Bool
vmask4 Word8
m
let (ra :: Word32
ra, _) = V4HostAddress -> Word8 -> (Word32, Word32)
maskCidr4 V4HostAddress
ha0 Word8
m
ha :: V4HostAddress
ha = [Word8] -> V4HostAddress
fromList4 ([Word8] -> V4HostAddress) -> [Word8] -> V4HostAddress
forall a b. (a -> b) -> a -> b
$ (Int -> Word8) -> [Int] -> [Word8]
forall a b. (a -> b) -> [a] -> [b]
map (Word32 -> Word8
byte (Word32 -> Word8) -> (Int -> Word32) -> Int -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32
ra Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`shiftR`)) [24,16,8,0]
Cidr -> Maybe Cidr
forall (m :: * -> *) a. Monad m => a -> m a
return (Cidr -> Maybe Cidr)
-> (NetAddress -> Cidr) -> NetAddress -> Maybe Cidr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NetAddress -> Cidr
Cidr (NetAddress -> Maybe Cidr) -> NetAddress -> Maybe Cidr
forall a b. (a -> b) -> a -> b
$ V4HostAddress -> Word8 -> NetAddress
NetAddress4 V4HostAddress
ha Word8
m
where
byte :: Word32 -> Word8
byte = Word32 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Word8) -> (Word32 -> Word32) -> Word32 -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. 0xff)
fromList4 :: [Word8] -> V4HostAddress
fromList4 ws :: [Word8]
ws = Word8 -> Word8 -> Word8 -> Word8 -> V4HostAddress
V4HostAddress Word8
w0 Word8
w1 Word8
w2 Word8
w3
where [w0 :: Word8
w0, w1 :: Word8
w1, w2 :: Word8
w2, w3 :: Word8
w3] = [Word8]
ws
cidr4 :: V4HostAddress -> Word8 -> Maybe Cidr
cidr4 :: V4HostAddress -> Word8 -> Maybe Cidr
cidr4 ha :: V4HostAddress
ha m :: Word8
m = do
NetAddress
na <- V4HostAddress -> Word8 -> Maybe NetAddress
netAddress4 V4HostAddress
ha Word8
m
let (ma :: Word32
ma, ra :: Word32
ra) = V4HostAddress -> Word8 -> (Word32, Word32)
maskCidr4 V4HostAddress
ha Word8
m
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Word32
ma Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
ra
Cidr -> Maybe Cidr
forall (m :: * -> *) a. Monad m => a -> m a
return (Cidr -> Maybe Cidr) -> Cidr -> Maybe Cidr
forall a b. (a -> b) -> a -> b
$ NetAddress -> Cidr
Cidr NetAddress
na
maskCidr6 :: V6HostAddress -> Word8 -> (Integer, Integer)
maskCidr6 :: V6HostAddress -> Word8 -> (Integer, Integer)
maskCidr6 (V6HostAddress w0 :: Word16
w0 w1 :: Word16
w1 w2 :: Word16
w2 w3 :: Word16
w3 w4 :: Word16
w4 w5 :: Word16
w5 w6 :: Word16
w6 w7 :: Word16
w7) m :: Word8
m =
(Integer
a6 Integer -> Integer -> Integer
forall a. Bits a => a -> a -> a
.&. (1 Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftL` Int
mi Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- 1) Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftL` (128 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
mi), Integer
a6)
where
mi :: Int
mi = Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
m
a6 :: Integer
a6 :: Integer
a6 = (Integer -> Integer -> Integer) -> Integer -> [Integer] -> Integer
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Integer -> Integer -> Integer
forall a. Bits a => a -> a -> a
(.|.) 0 ([Integer] -> Integer) -> [Integer] -> Integer
forall a b. (a -> b) -> a -> b
$ (Word16 -> Int -> Integer) -> [Word16] -> [Int] -> [Integer]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
(\w :: Word16
w x :: Int
x -> Word16 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
w Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftL` Int
x)
[Word16
w7, Word16
w6, Word16
w5, Word16
w4, Word16
w3, Word16
w2, Word16
w1, Word16
w0]
[0,16 ..]
cidr6' :: V6HostAddress -> Word8 -> Maybe Cidr
cidr6' :: V6HostAddress -> Word8 -> Maybe Cidr
cidr6' ha0 :: V6HostAddress
ha0 m :: Word8
m = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Word8 -> Bool
forall a. (Ord a, Integral a) => a -> Bool
vmask6 Word8
m
let (ra :: Integer
ra, _) = V6HostAddress -> Word8 -> (Integer, Integer)
maskCidr6 V6HostAddress
ha0 Word8
m
ha :: V6HostAddress
ha = [Word16] -> V6HostAddress
fromList6 ([Word16] -> V6HostAddress) -> [Word16] -> V6HostAddress
forall a b. (a -> b) -> a -> b
$ (Int -> Word16) -> [Int] -> [Word16]
forall a b. (a -> b) -> [a] -> [b]
map (Integer -> Word16
word (Integer -> Word16) -> (Int -> Integer) -> Int -> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer
ra Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftR`)) [112, 96 .. 0]
Cidr -> Maybe Cidr
forall (m :: * -> *) a. Monad m => a -> m a
return (Cidr -> Maybe Cidr)
-> (NetAddress -> Cidr) -> NetAddress -> Maybe Cidr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NetAddress -> Cidr
Cidr (NetAddress -> Maybe Cidr) -> NetAddress -> Maybe Cidr
forall a b. (a -> b) -> a -> b
$ V6HostAddress -> Word8 -> NetAddress
NetAddress6 V6HostAddress
ha Word8
m
where
word :: Integer -> Word16
word = Integer -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Word16) -> (Integer -> Integer) -> Integer -> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Integer -> Integer
forall a. Bits a => a -> a -> a
.&. 0xffff)
fromList6 :: [Word16] -> V6HostAddress
fromList6 ws :: [Word16]
ws = Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> V6HostAddress
V6HostAddress Word16
w0 Word16
w1 Word16
w2 Word16
w3 Word16
w4 Word16
w5 Word16
w6 Word16
w7
where [w0 :: Word16
w0, w1 :: Word16
w1, w2 :: Word16
w2, w3 :: Word16
w3, w4 :: Word16
w4, w5 :: Word16
w5, w6 :: Word16
w6, w7 :: Word16
w7] = [Word16]
ws
cidr6 :: V6HostAddress -> Word8 -> Maybe Cidr
cidr6 :: V6HostAddress -> Word8 -> Maybe Cidr
cidr6 ha :: V6HostAddress
ha m :: Word8
m = do
NetAddress
na <- V6HostAddress -> Word8 -> Maybe NetAddress
netAddress6 V6HostAddress
ha Word8
m
let (ma :: Integer
ma, ra :: Integer
ra) = V6HostAddress -> Word8 -> (Integer, Integer)
maskCidr6 V6HostAddress
ha Word8
m
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Integer
ma Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
ra
Cidr -> Maybe Cidr
forall (m :: * -> *) a. Monad m => a -> m a
return (Cidr -> Maybe Cidr) -> Cidr -> Maybe Cidr
forall a b. (a -> b) -> a -> b
$ NetAddress -> Cidr
Cidr NetAddress
na