module Net.IPv6
( decodeRange
, IPv6Range
, member
, fromTupleWord32s
) where
import Prelude
import qualified Data.Attoparsec.Text as Atto
import qualified Net.IPv4 as IPv4
import Net.IPv4 (IPv4(..))
import Data.WideWord.Word128 (Word128(..))
import Data.Word
import qualified Data.Attoparsec.Text as AT
import Data.Text (Text)
import GHC.Generics (Generic)
import Data.Ix (Ix)
import Data.Bits (Bits(..))
import Control.Applicative
import qualified Data.Bits as Bits
decodeRange :: Text -> Maybe IPv6Range
decodeRange :: Text -> Maybe IPv6Range
decodeRange = Either String IPv6Range -> Maybe IPv6Range
forall a b. Either a b -> Maybe b
rightToMaybe (Either String IPv6Range -> Maybe IPv6Range)
-> (Text -> Either String IPv6Range) -> Text -> Maybe IPv6Range
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser IPv6Range -> Text -> Either String IPv6Range
forall a. Parser a -> Text -> Either String a
AT.parseOnly (Parser IPv6Range
parserRange Parser IPv6Range -> Parser Text () -> Parser IPv6Range
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
AT.endOfInput)
parserRange :: AT.Parser IPv6Range
parserRange :: Parser IPv6Range
parserRange = do
IPv6
ip <- Parser IPv6
parser
Char
_ <- Char -> Parser Char
AT.char Char
'/'
Word8
theMask <- Parser Word8
forall a. Integral a => Parser a
AT.decimal Parser Word8 -> (Word8 -> Parser Word8) -> Parser Word8
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Word8 -> Parser Word8
forall a (m :: * -> *). (Ord a, Num a, MonadFail m) => a -> m a
limitSize
IPv6Range -> Parser IPv6Range
forall (m :: * -> *) a. Monad m => a -> m a
return (IPv6Range -> IPv6Range
normalize (IPv6 -> Word8 -> IPv6Range
IPv6Range IPv6
ip Word8
theMask))
where
limitSize :: a -> m a
limitSize a
i =
if a
i a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
128
then String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"An IP range length must be between 0 and 128"
else a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
i
data IPv6Range = IPv6Range
{ IPv6Range -> IPv6
ipv6RangeBase :: {-# UNPACK #-} !IPv6
, IPv6Range -> Word8
ipv6RangeLength :: {-# UNPACK #-} !Word8
} deriving (IPv6Range -> IPv6Range -> Bool
(IPv6Range -> IPv6Range -> Bool)
-> (IPv6Range -> IPv6Range -> Bool) -> Eq IPv6Range
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPv6Range -> IPv6Range -> Bool
$c/= :: IPv6Range -> IPv6Range -> Bool
== :: IPv6Range -> IPv6Range -> Bool
$c== :: IPv6Range -> IPv6Range -> Bool
Eq,Eq IPv6Range
Eq IPv6Range
-> (IPv6Range -> IPv6Range -> Ordering)
-> (IPv6Range -> IPv6Range -> Bool)
-> (IPv6Range -> IPv6Range -> Bool)
-> (IPv6Range -> IPv6Range -> Bool)
-> (IPv6Range -> IPv6Range -> Bool)
-> (IPv6Range -> IPv6Range -> IPv6Range)
-> (IPv6Range -> IPv6Range -> IPv6Range)
-> Ord IPv6Range
IPv6Range -> IPv6Range -> Bool
IPv6Range -> IPv6Range -> Ordering
IPv6Range -> IPv6Range -> IPv6Range
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 :: IPv6Range -> IPv6Range -> IPv6Range
$cmin :: IPv6Range -> IPv6Range -> IPv6Range
max :: IPv6Range -> IPv6Range -> IPv6Range
$cmax :: IPv6Range -> IPv6Range -> IPv6Range
>= :: IPv6Range -> IPv6Range -> Bool
$c>= :: IPv6Range -> IPv6Range -> Bool
> :: IPv6Range -> IPv6Range -> Bool
$c> :: IPv6Range -> IPv6Range -> Bool
<= :: IPv6Range -> IPv6Range -> Bool
$c<= :: IPv6Range -> IPv6Range -> Bool
< :: IPv6Range -> IPv6Range -> Bool
$c< :: IPv6Range -> IPv6Range -> Bool
compare :: IPv6Range -> IPv6Range -> Ordering
$ccompare :: IPv6Range -> IPv6Range -> Ordering
$cp1Ord :: Eq IPv6Range
Ord,Int -> IPv6Range -> ShowS
[IPv6Range] -> ShowS
IPv6Range -> String
(Int -> IPv6Range -> ShowS)
-> (IPv6Range -> String)
-> ([IPv6Range] -> ShowS)
-> Show IPv6Range
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPv6Range] -> ShowS
$cshowList :: [IPv6Range] -> ShowS
show :: IPv6Range -> String
$cshow :: IPv6Range -> String
showsPrec :: Int -> IPv6Range -> ShowS
$cshowsPrec :: Int -> IPv6Range -> ShowS
Show,ReadPrec [IPv6Range]
ReadPrec IPv6Range
Int -> ReadS IPv6Range
ReadS [IPv6Range]
(Int -> ReadS IPv6Range)
-> ReadS [IPv6Range]
-> ReadPrec IPv6Range
-> ReadPrec [IPv6Range]
-> Read IPv6Range
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [IPv6Range]
$creadListPrec :: ReadPrec [IPv6Range]
readPrec :: ReadPrec IPv6Range
$creadPrec :: ReadPrec IPv6Range
readList :: ReadS [IPv6Range]
$creadList :: ReadS [IPv6Range]
readsPrec :: Int -> ReadS IPv6Range
$creadsPrec :: Int -> ReadS IPv6Range
Read,(forall x. IPv6Range -> Rep IPv6Range x)
-> (forall x. Rep IPv6Range x -> IPv6Range) -> Generic IPv6Range
forall x. Rep IPv6Range x -> IPv6Range
forall x. IPv6Range -> Rep IPv6Range x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPv6Range x -> IPv6Range
$cfrom :: forall x. IPv6Range -> Rep IPv6Range x
Generic)
newtype IPv6 = IPv6 { IPv6 -> Word128
getIPv6 :: Word128 }
deriving (IPv6
IPv6 -> IPv6 -> Bounded IPv6
forall a. a -> a -> Bounded a
maxBound :: IPv6
$cmaxBound :: IPv6
minBound :: IPv6
$cminBound :: IPv6
Bounded,Int -> IPv6
IPv6 -> Int
IPv6 -> [IPv6]
IPv6 -> IPv6
IPv6 -> IPv6 -> [IPv6]
IPv6 -> IPv6 -> IPv6 -> [IPv6]
(IPv6 -> IPv6)
-> (IPv6 -> IPv6)
-> (Int -> IPv6)
-> (IPv6 -> Int)
-> (IPv6 -> [IPv6])
-> (IPv6 -> IPv6 -> [IPv6])
-> (IPv6 -> IPv6 -> [IPv6])
-> (IPv6 -> IPv6 -> IPv6 -> [IPv6])
-> Enum IPv6
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: IPv6 -> IPv6 -> IPv6 -> [IPv6]
$cenumFromThenTo :: IPv6 -> IPv6 -> IPv6 -> [IPv6]
enumFromTo :: IPv6 -> IPv6 -> [IPv6]
$cenumFromTo :: IPv6 -> IPv6 -> [IPv6]
enumFromThen :: IPv6 -> IPv6 -> [IPv6]
$cenumFromThen :: IPv6 -> IPv6 -> [IPv6]
enumFrom :: IPv6 -> [IPv6]
$cenumFrom :: IPv6 -> [IPv6]
fromEnum :: IPv6 -> Int
$cfromEnum :: IPv6 -> Int
toEnum :: Int -> IPv6
$ctoEnum :: Int -> IPv6
pred :: IPv6 -> IPv6
$cpred :: IPv6 -> IPv6
succ :: IPv6 -> IPv6
$csucc :: IPv6 -> IPv6
Enum,IPv6 -> IPv6 -> Bool
(IPv6 -> IPv6 -> Bool) -> (IPv6 -> IPv6 -> Bool) -> Eq IPv6
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IPv6 -> IPv6 -> Bool
$c/= :: IPv6 -> IPv6 -> Bool
== :: IPv6 -> IPv6 -> Bool
$c== :: IPv6 -> IPv6 -> Bool
Eq,Eq IPv6
Eq IPv6
-> (IPv6 -> IPv6 -> Ordering)
-> (IPv6 -> IPv6 -> Bool)
-> (IPv6 -> IPv6 -> Bool)
-> (IPv6 -> IPv6 -> Bool)
-> (IPv6 -> IPv6 -> Bool)
-> (IPv6 -> IPv6 -> IPv6)
-> (IPv6 -> IPv6 -> IPv6)
-> Ord IPv6
IPv6 -> IPv6 -> Bool
IPv6 -> IPv6 -> Ordering
IPv6 -> IPv6 -> IPv6
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 :: IPv6 -> IPv6 -> IPv6
$cmin :: IPv6 -> IPv6 -> IPv6
max :: IPv6 -> IPv6 -> IPv6
$cmax :: IPv6 -> IPv6 -> IPv6
>= :: IPv6 -> IPv6 -> Bool
$c>= :: IPv6 -> IPv6 -> Bool
> :: IPv6 -> IPv6 -> Bool
$c> :: IPv6 -> IPv6 -> Bool
<= :: IPv6 -> IPv6 -> Bool
$c<= :: IPv6 -> IPv6 -> Bool
< :: IPv6 -> IPv6 -> Bool
$c< :: IPv6 -> IPv6 -> Bool
compare :: IPv6 -> IPv6 -> Ordering
$ccompare :: IPv6 -> IPv6 -> Ordering
$cp1Ord :: Eq IPv6
Ord,Eq IPv6
IPv6
Eq IPv6
-> (IPv6 -> IPv6 -> IPv6)
-> (IPv6 -> IPv6 -> IPv6)
-> (IPv6 -> IPv6 -> IPv6)
-> (IPv6 -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> IPv6
-> (Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> Bool)
-> (IPv6 -> Maybe Int)
-> (IPv6 -> Int)
-> (IPv6 -> Bool)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int -> IPv6)
-> (IPv6 -> Int)
-> Bits IPv6
Int -> IPv6
IPv6 -> Bool
IPv6 -> Int
IPv6 -> Maybe Int
IPv6 -> IPv6
IPv6 -> Int -> Bool
IPv6 -> Int -> IPv6
IPv6 -> IPv6 -> IPv6
forall a.
Eq a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
popCount :: IPv6 -> Int
$cpopCount :: IPv6 -> Int
rotateR :: IPv6 -> Int -> IPv6
$crotateR :: IPv6 -> Int -> IPv6
rotateL :: IPv6 -> Int -> IPv6
$crotateL :: IPv6 -> Int -> IPv6
unsafeShiftR :: IPv6 -> Int -> IPv6
$cunsafeShiftR :: IPv6 -> Int -> IPv6
shiftR :: IPv6 -> Int -> IPv6
$cshiftR :: IPv6 -> Int -> IPv6
unsafeShiftL :: IPv6 -> Int -> IPv6
$cunsafeShiftL :: IPv6 -> Int -> IPv6
shiftL :: IPv6 -> Int -> IPv6
$cshiftL :: IPv6 -> Int -> IPv6
isSigned :: IPv6 -> Bool
$cisSigned :: IPv6 -> Bool
bitSize :: IPv6 -> Int
$cbitSize :: IPv6 -> Int
bitSizeMaybe :: IPv6 -> Maybe Int
$cbitSizeMaybe :: IPv6 -> Maybe Int
testBit :: IPv6 -> Int -> Bool
$ctestBit :: IPv6 -> Int -> Bool
complementBit :: IPv6 -> Int -> IPv6
$ccomplementBit :: IPv6 -> Int -> IPv6
clearBit :: IPv6 -> Int -> IPv6
$cclearBit :: IPv6 -> Int -> IPv6
setBit :: IPv6 -> Int -> IPv6
$csetBit :: IPv6 -> Int -> IPv6
bit :: Int -> IPv6
$cbit :: Int -> IPv6
zeroBits :: IPv6
$czeroBits :: IPv6
rotate :: IPv6 -> Int -> IPv6
$crotate :: IPv6 -> Int -> IPv6
shift :: IPv6 -> Int -> IPv6
$cshift :: IPv6 -> Int -> IPv6
complement :: IPv6 -> IPv6
$ccomplement :: IPv6 -> IPv6
xor :: IPv6 -> IPv6 -> IPv6
$cxor :: IPv6 -> IPv6 -> IPv6
.|. :: IPv6 -> IPv6 -> IPv6
$c.|. :: IPv6 -> IPv6 -> IPv6
.&. :: IPv6 -> IPv6 -> IPv6
$c.&. :: IPv6 -> IPv6 -> IPv6
$cp1Bits :: Eq IPv6
Bits,Bits IPv6
Bits IPv6
-> (IPv6 -> Int)
-> (IPv6 -> Int)
-> (IPv6 -> Int)
-> FiniteBits IPv6
IPv6 -> Int
forall b.
Bits b -> (b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b
countTrailingZeros :: IPv6 -> Int
$ccountTrailingZeros :: IPv6 -> Int
countLeadingZeros :: IPv6 -> Int
$ccountLeadingZeros :: IPv6 -> Int
finiteBitSize :: IPv6 -> Int
$cfiniteBitSize :: IPv6 -> Int
$cp1FiniteBits :: Bits IPv6
Bits.FiniteBits,(forall x. IPv6 -> Rep IPv6 x)
-> (forall x. Rep IPv6 x -> IPv6) -> Generic IPv6
forall x. Rep IPv6 x -> IPv6
forall x. IPv6 -> Rep IPv6 x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep IPv6 x -> IPv6
$cfrom :: forall x. IPv6 -> Rep IPv6 x
Generic,ReadPrec [IPv6]
ReadPrec IPv6
Int -> ReadS IPv6
ReadS [IPv6]
(Int -> ReadS IPv6)
-> ReadS [IPv6] -> ReadPrec IPv6 -> ReadPrec [IPv6] -> Read IPv6
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [IPv6]
$creadListPrec :: ReadPrec [IPv6]
readPrec :: ReadPrec IPv6
$creadPrec :: ReadPrec IPv6
readList :: ReadS [IPv6]
$creadList :: ReadS [IPv6]
readsPrec :: Int -> ReadS IPv6
$creadsPrec :: Int -> ReadS IPv6
Read,Int -> IPv6 -> ShowS
[IPv6] -> ShowS
IPv6 -> String
(Int -> IPv6 -> ShowS)
-> (IPv6 -> String) -> ([IPv6] -> ShowS) -> Show IPv6
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IPv6] -> ShowS
$cshowList :: [IPv6] -> ShowS
show :: IPv6 -> String
$cshow :: IPv6 -> String
showsPrec :: Int -> IPv6 -> ShowS
$cshowsPrec :: Int -> IPv6 -> ShowS
Show,Ord IPv6
Ord IPv6
-> ((IPv6, IPv6) -> [IPv6])
-> ((IPv6, IPv6) -> IPv6 -> Int)
-> ((IPv6, IPv6) -> IPv6 -> Int)
-> ((IPv6, IPv6) -> IPv6 -> Bool)
-> ((IPv6, IPv6) -> Int)
-> ((IPv6, IPv6) -> Int)
-> Ix IPv6
(IPv6, IPv6) -> Int
(IPv6, IPv6) -> [IPv6]
(IPv6, IPv6) -> IPv6 -> Bool
(IPv6, IPv6) -> IPv6 -> Int
forall a.
Ord a
-> ((a, a) -> [a])
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Bool)
-> ((a, a) -> Int)
-> ((a, a) -> Int)
-> Ix a
unsafeRangeSize :: (IPv6, IPv6) -> Int
$cunsafeRangeSize :: (IPv6, IPv6) -> Int
rangeSize :: (IPv6, IPv6) -> Int
$crangeSize :: (IPv6, IPv6) -> Int
inRange :: (IPv6, IPv6) -> IPv6 -> Bool
$cinRange :: (IPv6, IPv6) -> IPv6 -> Bool
unsafeIndex :: (IPv6, IPv6) -> IPv6 -> Int
$cunsafeIndex :: (IPv6, IPv6) -> IPv6 -> Int
index :: (IPv6, IPv6) -> IPv6 -> Int
$cindex :: (IPv6, IPv6) -> IPv6 -> Int
range :: (IPv6, IPv6) -> [IPv6]
$crange :: (IPv6, IPv6) -> [IPv6]
$cp1Ix :: Ord IPv6
Ix)
parser :: Atto.Parser IPv6
parser :: Parser IPv6
parser = [Word16] -> IPv6
makeIP ([Word16] -> IPv6) -> Parser Text [Word16] -> Parser IPv6
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text [Word16]
ip
where
makeIP :: [Word16] -> IPv6
makeIP [Word16
w1, Word16
w2, Word16
w3, Word16
w4, Word16
w5, Word16
w6, Word16
w7, Word16
w8] = Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> IPv6
fromWord16s Word16
w1 Word16
w2 Word16
w3 Word16
w4 Word16
w5 Word16
w6 Word16
w7 Word16
w8
makeIP [Word16]
_ = String -> IPv6
forall a. HasCallStack => String -> a
error String
"Net.IPv6.parser: Implementation error. Please open a bug report."
ip :: Parser Text [Word16]
ip = (Char -> Parser Char
Atto.char Char
':' Parser Char -> Parser Char -> Parser Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> Parser Char
Atto.char Char
':' Parser Char -> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser Text [Word16]
doubleColon Int
0) Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> Parser Text [Word16]
part Int
0
part :: Int -> Atto.Parser [Word16]
part :: Int -> Parser Text [Word16]
part Int
n =
case Int
n of
Int
7 -> Word16 -> [Word16]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Word16 -> [Word16]) -> Parser Text Word16 -> Parser Text [Word16]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Word16
forall a. (Integral a, Bits a) => Parser a
Atto.hexadecimal
Int
6 -> Parser Text [Word16]
ipv4 Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text [Word16]
hexPart
Int
_ -> Parser Text [Word16]
hexPart
where
hexPart :: Parser Text [Word16]
hexPart = (:)
(Word16 -> [Word16] -> [Word16])
-> Parser Text Word16 -> Parser Text ([Word16] -> [Word16])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Word16
forall a. (Integral a, Bits a) => Parser a
Atto.hexadecimal
Parser Text ([Word16] -> [Word16])
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Char -> Parser Char
Atto.char Char
':' Parser Char -> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
(
(Char -> Parser Char
Atto.char Char
':' Parser Char -> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser Text [Word16]
doubleColon (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1))
Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
Int -> Parser Text [Word16]
part (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
)
)
doubleColon :: Int -> Atto.Parser [Word16]
doubleColon :: Int -> Parser Text [Word16]
doubleColon Int
count = do
[Word16]
rest <- Parser Text [Word16]
afterDoubleColon Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
let fillerLength :: Int
fillerLength = (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
count Int -> Int -> Int
forall a. Num a => a -> a -> a
- [Word16] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Word16]
rest)
if Int
fillerLength Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
then String -> Parser Text [Word16]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"too many parts in IPv6 address"
else [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int -> Word16 -> [Word16]
forall a. Int -> a -> [a]
replicate Int
fillerLength Word16
0 [Word16] -> [Word16] -> [Word16]
forall a. [a] -> [a] -> [a]
++ [Word16]
rest)
afterDoubleColon :: Atto.Parser [Word16]
afterDoubleColon :: Parser Text [Word16]
afterDoubleColon =
Parser Text [Word16]
ipv4 Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(:) (Word16 -> [Word16] -> [Word16])
-> Parser Text Word16 -> Parser Text ([Word16] -> [Word16])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Word16
forall a. (Integral a, Bits a) => Parser a
Atto.hexadecimal Parser Text ([Word16] -> [Word16])
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((Char -> Parser Char
Atto.char Char
':' Parser Char -> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text [Word16]
afterDoubleColon) Parser Text [Word16]
-> Parser Text [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [Word16] -> Parser Text [Word16]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [])
ipv4 :: Atto.Parser [Word16]
ipv4 :: Parser Text [Word16]
ipv4 = IPv4 -> [Word16]
ipv4ToWord16s (IPv4 -> [Word16]) -> Parser Text IPv4 -> Parser Text [Word16]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text IPv4
IPv4.parser
ipv4ToWord16s :: IPv4 -> [Word16]
ipv4ToWord16s :: IPv4 -> [Word16]
ipv4ToWord16s (IPv4 Word32
word) = [Word32 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32
word Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
16), Word32 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32
word Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
0xFFFF)]
normalize :: IPv6Range -> IPv6Range
normalize :: IPv6Range -> IPv6Range
normalize (IPv6Range IPv6
ip Word8
len) =
let len' :: Word8
len' = Word8 -> Word8 -> Word8
forall a. Ord a => a -> a -> a
min Word8
len Word8
128
ip' :: IPv6
ip' = IPv6
ip IPv6 -> IPv6 -> IPv6
forall a. Bits a => a -> a -> a
.&. Word8 -> IPv6
mask Word8
len'
in IPv6 -> Word8 -> IPv6Range
IPv6Range IPv6
ip' Word8
len'
mask128 :: IPv6
mask128 :: IPv6
mask128 = IPv6
forall a. Bounded a => a
maxBound
mask :: Word8 -> IPv6
mask :: Word8 -> IPv6
mask = IPv6 -> IPv6
forall a. Bits a => a -> a
complement (IPv6 -> IPv6) -> (Word8 -> IPv6) -> Word8 -> IPv6
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IPv6 -> Int -> IPv6
forall a. Bits a => a -> Int -> a
shiftR IPv6
mask128 (Int -> IPv6) -> (Word8 -> Int) -> Word8 -> IPv6
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral
fromWord16s ::
Word16 -> Word16 -> Word16 -> Word16
-> Word16 -> Word16 -> Word16 -> Word16
-> IPv6
fromWord16s :: Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> Word16
-> IPv6
fromWord16s Word16
a Word16
b Word16
c Word16
d Word16
e Word16
f Word16
g Word16
h =
Word128 -> IPv6
IPv6 (Word128 -> IPv6) -> Word128 -> IPv6
forall a b. (a -> b) -> a -> b
$ Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
fromWord16sWord128
(Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
a) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
b) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
c) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
d)
(Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
e) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
f) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
g) (Word16 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
h)
fromWord16sWord128 ::
Word128 -> Word128 -> Word128 -> Word128
-> Word128 -> Word128 -> Word128 -> Word128
-> Word128
fromWord16sWord128 :: Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
-> Word128
fromWord16sWord128 Word128
a Word128
b Word128
c Word128
d Word128
e Word128
f Word128
g Word128
h = Word128 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral
( Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
a Int
112
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
b Int
96
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
c Int
80
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
d Int
64
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
e Int
48
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
f Int
32
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
g Int
16
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128
h
)
fromTupleWord32s :: (Word32,Word32,Word32,Word32) -> IPv6
fromTupleWord32s :: (Word32, Word32, Word32, Word32) -> IPv6
fromTupleWord32s (Word32
a,Word32
b,Word32
c,Word32
d) = Word32 -> Word32 -> Word32 -> Word32 -> IPv6
fromWord32s Word32
a Word32
b Word32
c Word32
d
member :: IPv6 -> IPv6Range -> Bool
member :: IPv6 -> IPv6Range -> Bool
member = (IPv6Range -> IPv6 -> Bool) -> IPv6 -> IPv6Range -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip IPv6Range -> IPv6 -> Bool
contains
rightToMaybe :: Either a b -> Maybe b
rightToMaybe :: Either a b -> Maybe b
rightToMaybe = (a -> Maybe b) -> (b -> Maybe b) -> Either a b -> Maybe b
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe b -> a -> Maybe b
forall a b. a -> b -> a
const Maybe b
forall a. Maybe a
Nothing) b -> Maybe b
forall a. a -> Maybe a
Just
contains :: IPv6Range -> IPv6 -> Bool
contains :: IPv6Range -> IPv6 -> Bool
contains (IPv6Range IPv6
subnet Word8
len) =
let theMask :: IPv6
theMask = Word8 -> IPv6
mask Word8
len
subnetNormalized :: IPv6
subnetNormalized = IPv6
subnet IPv6 -> IPv6 -> IPv6
forall a. Bits a => a -> a -> a
.&. IPv6
theMask
in \IPv6
ip -> (IPv6
ip IPv6 -> IPv6 -> IPv6
forall a. Bits a => a -> a -> a
.&. IPv6
theMask) IPv6 -> IPv6 -> Bool
forall a. Eq a => a -> a -> Bool
== IPv6
subnetNormalized
fromWord32s :: Word32 -> Word32 -> Word32 -> Word32 -> IPv6
fromWord32s :: Word32 -> Word32 -> Word32 -> Word32 -> IPv6
fromWord32s Word32
a Word32
b Word32
c Word32
d =
Word128 -> IPv6
IPv6 (Word128 -> IPv6) -> Word128 -> IPv6
forall a b. (a -> b) -> a -> b
$ Word128 -> Word128 -> Word128 -> Word128 -> Word128
fromWord32sWord128
(Word32 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
a) (Word32 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
b) (Word32 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
c) (Word32 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
d)
fromWord32sWord128 ::
Word128 -> Word128 -> Word128 -> Word128
-> Word128
fromWord32sWord128 :: Word128 -> Word128 -> Word128 -> Word128 -> Word128
fromWord32sWord128 Word128
a Word128
b Word128
c Word128
d = Word128 -> Word128
forall a b. (Integral a, Num b) => a -> b
fromIntegral
( Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
a Int
96
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
b Int
64
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128 -> Int -> Word128
forall a. Bits a => a -> Int -> a
shiftL Word128
c Int
32
Word128 -> Word128 -> Word128
forall a. Bits a => a -> a -> a
.|. Word128
d
)