hw-ip 2.3.1.2 → 2.3.2.0
raw patch · 7 files changed
+126/−101 lines, 7 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HaskellWorks.Data.Network.Ip.Internal: (#<*>#) :: Parser Word8 -> Parser Word8 -> Parser Word8
- HaskellWorks.Data.Network.Ip.Internal: bitPower :: Word8 -> Word64
- HaskellWorks.Data.Network.Ip.Internal: bitPower128 :: Word8 -> Integer
- HaskellWorks.Data.Network.Ip.Internal: blockSize :: Word8 -> Int
- HaskellWorks.Data.Network.Ip.Internal: blockSize128 :: Word8 -> Integer
- HaskellWorks.Data.Network.Ip.Internal: digit :: Int -> Parser Word8
- HaskellWorks.Data.Network.Ip.Internal: digits :: Int -> Int -> Parser Word8
- HaskellWorks.Data.Network.Ip.Internal: fourOctetsToWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32
- HaskellWorks.Data.Network.Ip.Internal: infixl 4 #<*>#
- HaskellWorks.Data.Network.Ip.Internal: ipv4Address :: Parser Word32
- HaskellWorks.Data.Network.Ip.Internal: ipv4Block :: Parser (Word32, Word8)
- HaskellWorks.Data.Network.Ip.Internal: ipv4NetMask :: Parser Word8
- HaskellWorks.Data.Network.Ip.Internal: octet :: Parser Word8
- HaskellWorks.Data.Network.Ip.Internal: readsPrecOnParser :: Parser a -> Int -> String -> [(a, String)]
- HaskellWorks.Data.Network.Ip.Internal: whitespace :: Parser ()
- HaskellWorks.Data.Network.Ip.Internal: word32x4ToWords :: (Word32, Word32, Word32, Word32) -> [Word32]
+ HaskellWorks.Data.Network.Ip.Internal.Appar: (#<*>#) :: Parser Word8 -> Parser Word8 -> Parser Word8
+ HaskellWorks.Data.Network.Ip.Internal.Appar: bitPower :: Word8 -> Word64
+ HaskellWorks.Data.Network.Ip.Internal.Appar: bitPower128 :: Word8 -> Integer
+ HaskellWorks.Data.Network.Ip.Internal.Appar: blockSize :: Word8 -> Int
+ HaskellWorks.Data.Network.Ip.Internal.Appar: blockSize128 :: Word8 -> Integer
+ HaskellWorks.Data.Network.Ip.Internal.Appar: digit :: Int -> Parser Word8
+ HaskellWorks.Data.Network.Ip.Internal.Appar: digits :: Int -> Int -> Parser Word8
+ HaskellWorks.Data.Network.Ip.Internal.Appar: fourOctetsToWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32
+ HaskellWorks.Data.Network.Ip.Internal.Appar: infixl 4 #<*>#
+ HaskellWorks.Data.Network.Ip.Internal.Appar: ipv4Address :: Parser Word32
+ HaskellWorks.Data.Network.Ip.Internal.Appar: ipv4Block :: Parser (Word32, Word8)
+ HaskellWorks.Data.Network.Ip.Internal.Appar: ipv4NetMask :: Parser Word8
+ HaskellWorks.Data.Network.Ip.Internal.Appar: octet :: Parser Word8
+ HaskellWorks.Data.Network.Ip.Internal.Appar: readsPrecOnParser :: Parser a -> Int -> String -> [(a, String)]
+ HaskellWorks.Data.Network.Ip.Internal.Appar: whitespace :: Parser ()
+ HaskellWorks.Data.Network.Ip.Internal.Appar: word32x4ToWords :: (Word32, Word32, Word32, Word32) -> [Word32]
+ HaskellWorks.Data.Network.Ip.Ip: canonicaliseIpBlock :: IpBlock v -> IpBlock Canonical
+ HaskellWorks.Data.Network.Ip.Ip: data Canonical
+ HaskellWorks.Data.Network.Ip.Ip: data Unaligned
+ HaskellWorks.Data.Network.Ip.Ipv4: data Canonical
+ HaskellWorks.Data.Network.Ip.Ipv4: data Unaligned
+ HaskellWorks.Data.Network.Ip.Ipv6: data Canonical
+ HaskellWorks.Data.Network.Ip.Ipv6: data Unaligned
Files
- hw-ip.cabal +2/−2
- src/HaskellWorks/Data/Network/Ip/Internal.hs +0/−79
- src/HaskellWorks/Data/Network/Ip/Internal/Appar.hs +95/−0
- src/HaskellWorks/Data/Network/Ip/Ip.hs +7/−0
- src/HaskellWorks/Data/Network/Ip/Ipv4.hs +6/−5
- src/HaskellWorks/Data/Network/Ip/Ipv6.hs +7/−6
- test/HaskellWorks/Data/Network/Ipv4Spec.hs +9/−9
hw-ip.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: hw-ip-version: 2.3.1.2+version: 2.3.2.0 license: BSD-3-Clause license-file: LICENSE copyright: 2018-2019 John Ky, David Turnbull, Jian Wan@@ -53,7 +53,7 @@ , text exposed-modules: HaskellWorks.Data.Network.Ip- HaskellWorks.Data.Network.Ip.Internal+ HaskellWorks.Data.Network.Ip.Internal.Appar HaskellWorks.Data.Network.Ip.Ip HaskellWorks.Data.Network.Ip.Ipv4 HaskellWorks.Data.Network.Ip.Ipv6
− src/HaskellWorks/Data/Network/Ip/Internal.hs
@@ -1,79 +0,0 @@-module HaskellWorks.Data.Network.Ip.Internal where--import Control.Applicative-import Control.Monad-import Data.Char-import Data.Word-import HaskellWorks.Data.Bits.BitWise--import qualified Text.Appar.String as AP--fourOctetsToWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32-fourOctetsToWord32 a b c d =- (fromIntegral a .<. 24) .|.- (fromIntegral b .<. 16) .|.- (fromIntegral c .<. 8) .|.- fromIntegral d-{-# INLINE fourOctetsToWord32 #-}--infixl 4 #<*>#--(#<*>#) :: AP.Parser Word8 -> AP.Parser Word8 -> AP.Parser Word8-(#<*>#) pa pb = paste <$> pa <*> pb- where paste a b = a * 10 + b--octet :: AP.Parser Word8-octet = AP.try ((digits 1 2 #<*># digit 5 ) #<*># digits 0 5)- <|> AP.try ((digits 1 2 #<*># digits 0 4) #<*># digits 0 9)- <|> AP.try (( digit 1 #<*># digits 0 9) #<*># digits 0 9)- <|> AP.try ( digits 1 9 #<*># digits 0 9)- <|> digits 0 9--whitespace :: AP.Parser ()-whitespace = void $ many (AP.satisfy isSpace)--ipv4Address :: AP.Parser Word32-ipv4Address = fourOctetsToWord32- <$> (octet <* AP.char '.')- <*> (octet <* AP.char '.')- <*> (octet <* AP.char '.')- <*> octet--ipv4NetMask :: AP.Parser Word8-ipv4NetMask = AP.try (digit 3 #<*># digits 0 2)- <|> AP.try (digit 2 #<*># digits 0 9)- <|> AP.try (digit 1 #<*># digits 0 9)- <|> digits 0 9--digit :: Int -> AP.Parser Word8-digit c = fromIntegral . (+ (-48)) . ord <$> AP.satisfy (== chr (c + 48))--digits :: Int -> Int -> AP.Parser Word8-digits c1 c2 = fromIntegral . (+ (-48)) . ord <$> AP.satisfy (\c -> c >= chr (c1 + 48) && c <= chr (c2 + 48))--ipv4Block :: AP.Parser (Word32, Word8)-ipv4Block = do- addr <- ipv4Address- _ <- AP.char '/'- mask <- ipv4NetMask- return (addr, mask)--word32x4ToWords :: (Word32, Word32, Word32, Word32) -> [Word32]-word32x4ToWords (a, b, c, d) = [a, b, c, d]--bitPower :: Word8 -> Word64-bitPower m = fromIntegral (32 - m)--blockSize :: Word8 -> Int-blockSize m = 2 ^ bitPower m--bitPower128 :: Word8 -> Integer-bitPower128 m = fromIntegral (128 - m)--blockSize128 :: Word8 -> Integer-blockSize128 m = 2 ^ bitPower128 m--readsPrecOnParser :: AP.Parser a -> Int -> String -> [(a, String)]-readsPrecOnParser p _ s = case AP.runParser (whitespace *> p) s of- (Just a, r) -> [(a, r)]- _ -> []
+ src/HaskellWorks/Data/Network/Ip/Internal/Appar.hs view
@@ -0,0 +1,95 @@+module HaskellWorks.Data.Network.Ip.Internal.Appar+ ( fourOctetsToWord32+ , (#<*>#)+ , octet+ , whitespace+ , ipv4Address+ , ipv4NetMask+ , digit+ , digits+ , ipv4Block+ , word32x4ToWords+ , bitPower+ , blockSize+ , bitPower128+ , blockSize128+ , readsPrecOnParser+ ) where++import Control.Applicative+import Control.Monad+import Data.Char+import Data.Word+import HaskellWorks.Data.Bits.BitWise++import qualified Text.Appar.String as AP++fourOctetsToWord32 :: Word8 -> Word8 -> Word8 -> Word8 -> Word32+fourOctetsToWord32 a b c d =+ (fromIntegral a .<. 24) .|.+ (fromIntegral b .<. 16) .|.+ (fromIntegral c .<. 8) .|.+ fromIntegral d+{-# INLINE fourOctetsToWord32 #-}++infixl 4 #<*>#++(#<*>#) :: AP.Parser Word8 -> AP.Parser Word8 -> AP.Parser Word8+(#<*>#) pa pb = paste <$> pa <*> pb+ where paste a b = a * 10 + b++octet :: AP.Parser Word8+octet = AP.try ((digits 1 2 #<*># digit 5 ) #<*># digits 0 5)+ <|> AP.try ((digits 1 2 #<*># digits 0 4) #<*># digits 0 9)+ <|> AP.try (( digit 1 #<*># digits 0 9) #<*># digits 0 9)+ <|> AP.try ( digits 1 9 #<*># digits 0 9)+ <|> digits 0 9++whitespace :: AP.Parser ()+whitespace = void $ many (AP.satisfy isSpace)++ipv4Address :: AP.Parser Word32+ipv4Address = fourOctetsToWord32+ <$> (octet <* AP.char '.')+ <*> (octet <* AP.char '.')+ <*> (octet <* AP.char '.')+ <*> octet++ipv4NetMask :: AP.Parser Word8+ipv4NetMask = AP.try (digit 3 #<*># digits 0 2)+ <|> AP.try (digit 2 #<*># digits 0 9)+ <|> AP.try (digit 1 #<*># digits 0 9)+ <|> digits 0 9++digit :: Int -> AP.Parser Word8+digit c = fromIntegral . (+ (-48)) . ord <$> AP.satisfy (== chr (c + 48))++digits :: Int -> Int -> AP.Parser Word8+digits c1 c2 = fromIntegral . (+ (-48)) . ord <$> AP.satisfy (\c -> c >= chr (c1 + 48) && c <= chr (c2 + 48))++ipv4Block :: AP.Parser (Word32, Word8)+ipv4Block = do+ addr <- ipv4Address+ _ <- AP.char '/'+ mask <- ipv4NetMask+ return (addr, mask)++word32x4ToWords :: (Word32, Word32, Word32, Word32) -> [Word32]+word32x4ToWords (a, b, c, d) = [a, b, c, d]++bitPower :: Word8 -> Word64+bitPower m = fromIntegral (32 - m)++blockSize :: Word8 -> Int+blockSize m = 2 ^ bitPower m++bitPower128 :: Word8 -> Integer+bitPower128 m = fromIntegral (128 - m)++blockSize128 :: Word8 -> Integer+blockSize128 m = 2 ^ bitPower128 m++readsPrecOnParser :: AP.Parser a -> Int -> String -> [(a, String)]+readsPrecOnParser p _ s = case AP.runParser (whitespace *> p) s of+ (Just a, r) -> [(a, r)]+ _ -> []
src/HaskellWorks/Data/Network/Ip/Ip.hs view
@@ -6,8 +6,10 @@ module HaskellWorks.Data.Network.Ip.Ip ( IpBlock(..)+ , Unaligned, Canonical , isCanonical , canonicalise+ , canonicaliseIpBlock , firstIpAddress , lastIpAddress ) where@@ -46,6 +48,11 @@ canonicalise :: IpBlock Unaligned -> Maybe (IpBlock Canonical) canonicalise (IpBlockV4 (V4.IpBlock a m)) = mfilter isCanonical (Just $ IpBlockV4 (V4.IpBlock a m)) canonicalise (IpBlockV6 (V6.IpBlock a m)) = mfilter isCanonical (Just $ IpBlockV6 (V6.IpBlock a m))++-- | Canonicalise the block by zero-ing out the host bits+canonicaliseIpBlock :: IpBlock v -> IpBlock Canonical+canonicaliseIpBlock (IpBlockV4 b) = IpBlockV4 (V4.canonicaliseIpBlock b)+canonicaliseIpBlock (IpBlockV6 b) = IpBlockV6 (V6.canonicaliseIpBlock b) firstIpAddress :: IpBlock Canonical -> (Word32, Word32, Word32, Word32) firstIpAddress (IpBlockV4 v4Block) = firstIpAddress (IpBlockV6 (V6.fromIpv4Block v4Block))
src/HaskellWorks/Data/Network/Ip/Ipv4.hs view
@@ -9,6 +9,7 @@ ( IpAddress(..) , IpNetMask(..) , IpBlock(..)+ , Unaligned, Canonical , bitPower , isCanonical , splitBlock@@ -41,11 +42,11 @@ import HaskellWorks.Data.Network.Ip.SafeEnum import HaskellWorks.Data.Network.Ip.Validity -import qualified Data.Bits as B-import qualified Data.Sequence as S-import qualified Data.Text as T-import qualified HaskellWorks.Data.Network.Ip.Internal as I-import qualified Text.Appar.String as AP+import qualified Data.Bits as B+import qualified Data.Sequence as S+import qualified Data.Text as T+import qualified HaskellWorks.Data.Network.Ip.Internal.Appar as I+import qualified Text.Appar.String as AP newtype IpAddress = IpAddress { word :: Word32
src/HaskellWorks/Data/Network/Ip/Ipv6.hs view
@@ -10,6 +10,7 @@ ( IpAddress(..) , IpNetMask(..) , IpBlock(..)+ , Unaligned, Canonical , fromIpv4 , fromIpv4Block , fromV4@@ -41,12 +42,12 @@ import Prelude hiding (words) import Text.Read -import qualified Data.Bits as B-import qualified Data.IP as D-import qualified Data.Text as T-import qualified HaskellWorks.Data.Network.Ip.Internal as I-import qualified HaskellWorks.Data.Network.Ip.Ipv4 as V4-import qualified HaskellWorks.Data.Network.Ip.Word128 as W+import qualified Data.Bits as B+import qualified Data.IP as D+import qualified Data.Text as T+import qualified HaskellWorks.Data.Network.Ip.Internal.Appar as I+import qualified HaskellWorks.Data.Network.Ip.Ipv4 as V4+import qualified HaskellWorks.Data.Network.Ip.Word128 as W newtype IpAddress = IpAddress W.Word128 deriving (Enum, Eq, Ord, Bounded, Generic, SafeEnum)
test/HaskellWorks/Data/Network/Ipv4Spec.hs view
@@ -3,7 +3,7 @@ module HaskellWorks.Data.Network.Ipv4Spec (spec) where -import HaskellWorks.Data.Network.Ip.Internal+import HaskellWorks.Data.Network.Ip.Internal.Appar import HaskellWorks.Data.Network.Ip.Ipv4 import HaskellWorks.Data.Network.Ip.Range import HaskellWorks.Data.Network.Ip.Validity@@ -11,14 +11,14 @@ import Hedgehog import Test.Hspec -import qualified Data.List as DL-import qualified HaskellWorks.Data.Network.Gen as G-import qualified HaskellWorks.Data.Network.Ip.Internal as I-import qualified HaskellWorks.Data.Network.Ip.Ipv4 as I-import qualified HaskellWorks.Data.Network.Ip.Range as I-import qualified Hedgehog.Gen as G-import qualified Hedgehog.Range as R-import qualified Text.Appar.String as AP+import qualified Data.List as DL+import qualified HaskellWorks.Data.Network.Gen as G+import qualified HaskellWorks.Data.Network.Ip.Internal.Appar as I+import qualified HaskellWorks.Data.Network.Ip.Ipv4 as I+import qualified HaskellWorks.Data.Network.Ip.Range as I+import qualified Hedgehog.Gen as G+import qualified Hedgehog.Range as R+import qualified Text.Appar.String as AP {-# ANN module ("HLint: ignore Redundant do" :: String) #-}