ip 1.1.1 → 1.1.2
raw patch · 16 files changed
+85/−122 lines, 16 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Net.IP: print :: IP -> IO ()
+ Net.IPv4: fromTupleOctets :: (Word8, Word8, Word8, Word8) -> IPv4
+ Net.IPv4: print :: IPv4 -> IO ()
+ Net.IPv6: fromTupleWord16s :: (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16) -> IPv6
+ Net.IPv6: fromTupleWord32s :: (Word32, Word32, Word32, Word32) -> IPv6
+ Net.IPv6: fromWord32s :: Word32 -> Word32 -> Word32 -> Word32 -> IPv6
+ Net.IPv6: print :: IPv6 -> IO ()
+ Net.IPv6: toWord32s :: IPv6 -> (Word32, Word32, Word32, Word32)
+ Net.Mac: print :: Mac -> IO ()
Files
- ip.cabal +1/−3
- src/Data/Text/Builder/Common/Internal.hs +0/−11
- src/Data/Text/Builder/Variable.hs +4/−8
- src/Data/Word/Synthetic/Word12.hs +0/−1
- src/Net/IP.hs +7/−0
- src/Net/IPv4.hs +16/−3
- src/Net/IPv6.hs +46/−1
- src/Net/Mac.hs +7/−0
- test/Bench.hs +0/−13
- test/IPv4ByteString1.hs +0/−1
- test/IPv4DecodeText1.hs +1/−9
- test/IPv4DecodeText2.hs +1/−11
- test/IPv4Text1.hs +1/−9
- test/IPv4Text2.hs +1/−13
- test/IPv4TextVariableBuilder.hs +0/−30
- test/Naive.hs +0/−9
ip.cabal view
@@ -1,5 +1,5 @@ name: ip-version: 1.1.1+version: 1.1.2 synopsis: Library for IP and MAC addresses homepage: https://github.com/andrewthad/haskell-ip#readme license: BSD3@@ -81,7 +81,6 @@ IPv4Text1 IPv4Text2 IPv4ByteString1- -- IPv4TextVariableBuilder ghc-options: -Wall -O2 default-language: Haskell2010 @@ -112,7 +111,6 @@ IPv4DecodeText1 IPv4DecodeText2 IPv4ByteString1- IPv4TextVariableBuilder ghc-options: -Wall -O2 default-language: Haskell2010 hs-source-dirs: test
src/Data/Text/Builder/Common/Internal.hs view
@@ -3,22 +3,11 @@ import Data.Text (Text) import Control.Monad.ST import Data.Monoid-import Data.Word-import Data.Bits import Text.Printf-import Debug.Trace import Data.Char (ord)-import Data.Vector (Vector) import Data.Foldable (fold)-import qualified Data.Vector as Vector import qualified Data.Text as Text-import qualified Data.Text.Lazy as LText-import qualified Data.Text.Lazy.IO as LText-import qualified Data.Text.Lazy.Builder as TBuilder-import qualified Data.Text.Lazy.Builder.Int as TBuilder-import qualified Data.Text.IO as Text import qualified Data.Text.Array as A-import qualified Data.Text.Internal as TI import qualified Data.Text.Internal.Unsafe.Char as TC -- | This is slower that just pattern matching on the Text data constructor.
src/Data/Text/Builder/Variable.hs view
@@ -22,17 +22,13 @@ , word8 ) where -import Data.Monoid import Data.Word import Data.Text (Text)-import Text.Printf (printf) import Control.Monad.ST import Data.Char (ord) import Data.Vector (Vector)-import Data.Function (on) import Data.Maybe (fromMaybe) import qualified Data.Vector as Vector-import qualified Data.Text as Text import qualified Data.Text.Array as A import qualified Data.Text.Builder.Common.Internal as I import qualified Data.Text.Internal as TI@@ -103,21 +99,21 @@ {-# INLINE word8 #-} -- This has not yet been tested.-vector ::+_vector :: Text -- ^ Default, used when index is out of range -> Vector Text -- ^ Texts to index into -> Builder Int-vector tDef v =+_vector tDef v = let xs = Vector.map I.portableUntext v xDef = I.portableUntext tDef in Builder (Vector.maximum $ Vector.map I.portableTextLength $ Vector.cons tDef v)- $ \pos marr i -> do+ $ \_ marr i -> do let (arr,len) = fromMaybe xDef (xs Vector.!? i) finalIx = i + len A.copyI marr i arr 0 finalIx return finalIx-{-# INLINE vector #-}+{-# INLINE _vector #-} i2w :: Integral a => a -> Word16 i2w v = asciiZero + fromIntegral v
src/Data/Word/Synthetic/Word12.hs view
@@ -29,7 +29,6 @@ import Data.Bits import Data.Data import Data.Maybe-import Foreign.Storable import GHC.Arr import GHC.Base
src/Net/IP.hs view
@@ -36,10 +36,13 @@ -- ** Text , encode , decode+ -- ** Printing+ , print -- * Types , IP(..) ) where +import Prelude hiding (print) import Data.Bits import Net.IPv6 (IPv6(..)) import Net.IPv4 (IPv4(..))@@ -51,6 +54,7 @@ import qualified Net.IPv4 as IPv4 import qualified Net.IPv6 as IPv6 import qualified Data.Aeson as Aeson+import qualified Data.Text.IO as TIO case_ :: (IPv4 -> a) -> (IPv6 -> a) -> IP -> a case_ f g (IP addr@(IPv6 w1 w2)) = if w1 == 0 && (0xFFFFFFFF00000000 .&. w2 == 0x0000FFFF00000000)@@ -84,6 +88,9 @@ Nothing -> Nothing Just v6 -> Just (fromIPv6 v6) Just v4 -> Just (fromIPv4 v4)++print :: IP -> IO ()+print = TIO.putStrLn . encode -- | A 32-bit 'IPv4' address or a 128-bit 'IPv6' address. Internally, this -- is just represented as an 'IPv6' address. The functions provided
src/Net/IPv4.hs view
@@ -25,6 +25,7 @@ ( -- * Conversion Functions ipv4 , fromOctets+ , fromTupleOctets , toOctets -- * Special IP Addresses , any@@ -40,7 +41,7 @@ , decode , builder , reader- , parser+ , parser -- ** UTF-8 ByteString , encodeUtf8 , decodeUtf8@@ -50,11 +51,13 @@ -- $string , encodeString , decodeString+ -- ** Printing+ , print -- * Types , IPv4(..) ) where -import Prelude hiding (any)+import Prelude hiding (any, print) import Data.Bits ((.&.),(.|.),shiftR,shiftL,unsafeShiftR) import Data.Word import Data.Hashable@@ -94,6 +97,7 @@ import qualified Data.Aeson.Types as Aeson import qualified Data.ByteString.Builder as BB import qualified Data.Text.Array as TArray+import qualified Data.Text.IO as TIO #if MIN_VERSION_aeson(1,0,0) import Data.Aeson (ToJSONKey(..),FromJSONKey(..),@@ -131,6 +135,10 @@ fromOctets a b c d = fromOctets' (fromIntegral a) (fromIntegral b) (fromIntegral c) (fromIntegral d) +-- | An uncurried variant of 'fromOctets'.+fromTupleOctets :: (Word8,Word8,Word8,Word8) -> IPv4+fromTupleOctets (a,b,c,d) = fromOctets a b c d+ -- | Convert an 'IPv4' address into a quadruple of octets. The first -- element in the quadruple is the most significant octet. The last -- element is the least significant octet.@@ -319,7 +327,10 @@ decodeString = decode . Text.pack --- | A 32-bit Internet Protocol version 4 address.+-- | A 32-bit Internet Protocol version 4 address. To use this with the+-- @network@ library, it is necessary to use @Network.Socket.htonl@ to+-- convert the underlying 'Word32' from host byte order to network byte+-- order. newtype IPv4 = IPv4 { getIPv4 :: Word32 } deriving (Eq,Ord,Enum,Bounded,Hashable,Generic,Prim,Bits,FiniteBits,Storable) @@ -345,6 +356,8 @@ d <- step readPrec return (fromOctets a b c d) +print :: IPv4 -> IO ()+print = TIO.putStrLn . encode newtype instance UVector.MVector s IPv4 = MV_IPv4 (PVector.MVector s IPv4) newtype instance UVector.Vector IPv4 = V_IPv4 (PVector.Vector IPv4)
src/Net/IPv6.hs view
@@ -9,7 +9,11 @@ , ipv6 , fromOctets , fromWord16s+ , fromWord32s+ , fromTupleWord16s+ , fromTupleWord32s , toWord16s+ , toWord32s -- * Special IP Addresses , any , loopback@@ -18,9 +22,11 @@ , encode , decode , parser+ -- ** Printing+ , print ) where -import Prelude hiding (any)+import Prelude hiding (any, print) import Data.Bits import Data.List (intercalate, group) import Data.Word@@ -30,6 +36,7 @@ import Text.Read (Read(..),Lexeme(Ident),lexP,parens) import Text.ParserCombinators.ReadPrec (prec,step) import qualified Data.Text as Text+import qualified Data.Text.IO as TIO import qualified Data.Attoparsec.Text as Atto import qualified Data.Aeson as Aeson import qualified Data.Attoparsec.Text as AT@@ -70,6 +77,9 @@ where (a,b,c,d,e,f,g,h) = toWord16s addr +print :: IPv6 -> IO ()+print = TIO.putStrLn . encode+ showHexWord16 :: Word16 -> ShowS showHexWord16 w = showString "0x"@@ -150,6 +160,7 @@ (fromIntegral e) (fromIntegral f) (fromIntegral g) (fromIntegral h) in IPv6 w1 w2 +-- | Convert an 'IPv6' to eight 16-bit words. toWord16s :: IPv6 -> (Word16,Word16,Word16,Word16,Word16,Word16,Word16,Word16) toWord16s (IPv6 a b) = ( fromIntegral (unsafeShiftR a 48)@@ -162,6 +173,31 @@ , fromIntegral b ) +-- | Uncurried variant of 'fromWord16s'.+fromTupleWord16s :: (Word16,Word16,Word16,Word16,Word16,Word16,Word16,Word16) -> IPv6+fromTupleWord16s (a,b,c,d,e,f,g,h) = fromWord16s a b c d e f g h++-- | Build an 'IPv6' from four 32-bit words. The leftmost argument+-- is the high word and the rightword is the low word.+fromWord32s :: Word32 -> Word32 -> Word32 -> Word32 -> IPv6+fromWord32s a b c d =+ let !(w1,w2) = fromWord32sV6+ (fromIntegral a) (fromIntegral b) (fromIntegral c) (fromIntegral d)+ in IPv6 w1 w2++-- | Uncurried variant of 'fromWord32s'.+fromTupleWord32s :: (Word32,Word32,Word32,Word32) -> IPv6+fromTupleWord32s (a,b,c,d) = fromWord32s a b c d++-- | Convert an 'IPv6' to four 32-bit words.+toWord32s :: IPv6 -> (Word32,Word32,Word32,Word32)+toWord32s (IPv6 a b) =+ ( fromIntegral (unsafeShiftR a 32)+ , fromIntegral a+ , fromIntegral (unsafeShiftR b 32)+ , fromIntegral b+ )+ loopback :: IPv6 loopback = IPv6 0 1 @@ -311,6 +347,12 @@ , fromWord16Word64 e f g h ) +fromWord32sV6 :: Word64 -> Word64 -> Word64 -> Word64 -> (Word64,Word64)+fromWord32sV6 a b c d =+ ( fromWord32Word64 a b+ , fromWord32Word64 c d+ )+ fromOctetsWord64 :: Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64@@ -333,4 +375,7 @@ .|. unsafeShiftL c 16 .|. d )++fromWord32Word64 :: Word64 -> Word64 -> Word64+fromWord32Word64 a b = fromIntegral (unsafeShiftL a 32 .|. b)
src/Net/Mac.hs view
@@ -34,12 +34,15 @@ , parserWithUtf8 -- ** ByteString , decodeBytes+ -- ** Printing+ , print -- * Types , Mac(..) , MacCodec(..) , MacGrouping(..) ) where +import Prelude hiding (print) import Data.Word import Data.Bits ((.|.),unsafeShiftL,unsafeShiftR,(.&.)) import Data.Text (Text)@@ -64,6 +67,7 @@ import qualified Data.ByteString.Builder.Fixed as BFB import qualified Data.Aeson as Aeson import qualified Data.Aeson.Types as Aeson+import qualified Data.Text.IO as TIO #if MIN_VERSION_aeson(1,0,0) import Data.Aeson (ToJSONKey(..),FromJSONKey(..),@@ -555,6 +559,9 @@ Ident "mac" <- lexP w <- step readPrec return (mac w)++print :: Mac -> IO ()+print = TIO.putStrLn . encode showHexWord48 :: Word64 -> ShowS showHexWord48 w = showString "0x" . go 11
test/Bench.hs view
@@ -2,20 +2,7 @@ import Criterion.Main import Net.Types (IPv4(..),MacGrouping(..),MacCodec(..))-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)-import Data.Monoid ((<>))-import Data.Text.Lazy.Builder.Int (decimal)-import Data.Text.Internal (Text(..))-import Data.Word-import Data.ByteString (ByteString)-import Control.Monad.ST import qualified Data.Text as Text-import qualified Data.ByteString.Char8 as BC8-import qualified Data.ByteString as ByteString-import qualified Data.ByteString.Unsafe as ByteString-import qualified Data.Text.Lazy as LText-import qualified Data.Text.Lazy.Builder as TBuilder-import qualified Data.Text.Array as TArray import qualified Net.Mac as Mac import qualified Net.IPv4 as IPv4
test/IPv4ByteString1.hs view
@@ -1,7 +1,6 @@ module IPv4ByteString1 where import Net.Types (IPv4(..))-import Net.IPv4 import Data.ByteString.Internal as I import Data.Bits
test/IPv4DecodeText1.hs view
@@ -1,20 +1,12 @@ module IPv4DecodeText1 where import Net.Types-import Data.Monoid ((<>)) import Data.Word-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)-import Control.Monad.ST import Data.Text.Internal (Text(..))-import Data.Text.Lazy.Builder.Int (decimal) import Control.Monad+import Data.Bits ((.|.),shiftL) import qualified Data.Text as Text-import qualified Data.Text.Lazy as LText-import qualified Data.Attoparsec.Text as AT-import qualified Data.Text.Array as TArray-import qualified Data.Text.Lazy.Builder as TBuilder import qualified Data.Text.Read as TextRead-import qualified Data.Text.Lazy.Builder.Int as TBuilder stripDecimal :: Text -> Either String Text stripDecimal t = case Text.uncons t of
test/IPv4DecodeText2.hs view
@@ -1,20 +1,10 @@ module IPv4DecodeText2 where import Net.Types-import Data.Monoid ((<>)) import Data.Word-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)-import Control.Monad.ST+import Data.Bits (shiftL,(.|.)) import Data.Text.Internal (Text(..))-import Data.Text.Lazy.Builder.Int (decimal)-import Control.Monad-import qualified Data.Text as Text-import qualified Data.Text.Lazy as LText import qualified Data.Attoparsec.Text as AT-import qualified Data.Text.Array as TArray-import qualified Data.Text.Lazy.Builder as TBuilder-import qualified Data.Text.Read as TextRead-import qualified Data.Text.Lazy.Builder.Int as TBuilder dotDecimalParser :: AT.Parser Word32 dotDecimalParser = fromOctets'
test/IPv4Text1.hs view
@@ -2,22 +2,15 @@ import Net.Types (IPv4(..)) import Data.Text (Text)-import qualified Net.IPv4 as IPv4-import qualified Data.Text as Text-import Text.Read (readMaybe)-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement) import Data.Monoid ((<>))-import Data.Text.Lazy.Builder.Int (decimal) import Data.Text.Internal (Text(..)) import Data.Word import Data.ByteString (ByteString) import Control.Monad.ST-import Data.Text.Encoding (encodeUtf8)+import Data.Bits (shiftR,(.&.)) import qualified Data.ByteString.Char8 as BC8 import qualified Data.ByteString as ByteString import qualified Data.ByteString.Unsafe as ByteString-import qualified Data.Text.Lazy as LText-import qualified Data.Text.Lazy.Builder as TBuilder import qualified Data.Text.Array as TArray ------------------------@@ -34,7 +27,6 @@ w2 = fromIntegral $ 255 .&. shiftR w 16 w3 = fromIntegral $ 255 .&. shiftR w 8 w4 = fromIntegral $ 255 .&. w- dot = 46 (arr,len) = runST $ do marr <- TArray.new 15 i1 <- putAndCount 0 w1 marr
test/IPv4Text2.hs view
@@ -2,23 +2,11 @@ import Net.Types (IPv4(..)) import Data.Text (Text)-import qualified Net.IPv4 as IPv4-import qualified Data.Text as Text-import Text.Read (readMaybe)-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)+import Data.Bits ((.&.),shiftR) import Data.Monoid ((<>)) import Data.Text.Lazy.Builder.Int (decimal)-import Data.Text.Internal (Text(..))-import Data.Word-import Data.ByteString (ByteString)-import Control.Monad.ST-import Data.Text.Encoding (encodeUtf8)-import qualified Data.ByteString.Char8 as BC8-import qualified Data.ByteString as ByteString-import qualified Data.ByteString.Unsafe as ByteString import qualified Data.Text.Lazy as LText import qualified Data.Text.Lazy.Builder as TBuilder-import qualified Data.Text.Array as TArray ----------------------------------------- -- Text Builder implementation. This ends
− test/IPv4TextVariableBuilder.hs
@@ -1,30 +0,0 @@-module IPv4TextVariableBuilder where--import Net.Types (IPv4(..))-import Data.Text (Text)-import Data.Monoid-import Data.Word-import Data.Bits-import qualified Net.IPv4 as IPv4-import qualified Data.Text as Text-import qualified Data.Text.Builder.Variable as VB--encode :: IPv4 -> Text-encode = VB.run variableBuilder--variableBuilder :: VB.Builder IPv4-variableBuilder =- VB.contramap (word8At 24) VB.word8- <> VB.staticCharBmp '.'- <> VB.contramap (word8At 16) VB.word8- <> VB.staticCharBmp '.'- <> VB.contramap (word8At 8) VB.word8- <> VB.staticCharBmp '.'- <> VB.contramap (word8At 0) VB.word8--word8At :: Int -> IPv4 -> Word8-word8At i (IPv4 w) = fromIntegral (unsafeShiftR w i)-{-# INLINE word8At #-}---
test/Naive.hs view
@@ -5,17 +5,8 @@ import qualified Net.IPv4 as IPv4 import qualified Data.Text as Text import Text.Read (readMaybe)-import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)-import Data.Monoid ((<>))-import Data.Text.Lazy.Builder.Int (decimal)-import Data.Text.Internal (Text(..))-import Data.Word import Data.ByteString (ByteString)-import Control.Monad.ST import Data.Text.Encoding (encodeUtf8)-import qualified Data.ByteString.Char8 as BC8-import qualified Data.ByteString as ByteString-import qualified Data.Text.Lazy as LText encodeByteString :: IPv4 -> ByteString encodeByteString = encodeUtf8 . encodeText