network-ip 0.2.1.1 → 0.3
raw patch · 3 files changed
+166/−81 lines, 3 filesdep +data-serializerdep −binarydep −cerealdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: data-serializer
Dependencies removed: binary, cereal
Dependency ranges changed: base
API changes (from Hackage documentation)
- Network.IP.Addr: data IP
- Network.IP.Addr: inetHost :: InetAddr a -> a
- Network.IP.Addr: inetPort :: InetAddr a -> {-# UNPACK #-} !InetPort
- Network.IP.Addr: instance Binary (NetAddr IP)
- Network.IP.Addr: instance Binary IP
- Network.IP.Addr: instance Binary IP4
- Network.IP.Addr: instance Binary IP6
- Network.IP.Addr: instance Binary InetPort
- Network.IP.Addr: instance Binary Net4Addr
- Network.IP.Addr: instance Binary Net6Addr
- Network.IP.Addr: instance Binary a => Binary (InetAddr a)
- Network.IP.Addr: instance Bits IP4
- Network.IP.Addr: instance Bits IP6
- Network.IP.Addr: instance Bits InetPort
- Network.IP.Addr: instance Bounded IP4
- Network.IP.Addr: instance Bounded IP6
- Network.IP.Addr: instance Bounded InetPort
- Network.IP.Addr: instance Default IP4
- Network.IP.Addr: instance Default IP6
- Network.IP.Addr: instance Enum IP4
- Network.IP.Addr: instance Enum IP6
- Network.IP.Addr: instance Enum InetPort
- Network.IP.Addr: instance Enum Range4
- Network.IP.Addr: instance Enum Range6
- Network.IP.Addr: instance Eq IP
- Network.IP.Addr: instance Eq IP4
- Network.IP.Addr: instance Eq IP6
- Network.IP.Addr: instance Eq InetPort
- Network.IP.Addr: instance Eq Range4
- Network.IP.Addr: instance Eq Range6
- Network.IP.Addr: instance Eq a => Eq (InetAddr a)
- Network.IP.Addr: instance Eq a => Eq (NetAddr a)
- Network.IP.Addr: instance Functor InetAddr
- Network.IP.Addr: instance Hashable IP4
- Network.IP.Addr: instance Hashable IP6
- Network.IP.Addr: instance Hashable InetPort
- Network.IP.Addr: instance Hashable a => Hashable (InetAddr a)
- Network.IP.Addr: instance Integral InetPort
- Network.IP.Addr: instance IsNetAddr (NetAddr IP)
- Network.IP.Addr: instance IsNetAddr Net4Addr
- Network.IP.Addr: instance IsNetAddr Net6Addr
- Network.IP.Addr: instance Ix IP4
- Network.IP.Addr: instance Ix IP6
- Network.IP.Addr: instance Ix InetPort
- Network.IP.Addr: instance Num IP4
- Network.IP.Addr: instance Num IP6
- Network.IP.Addr: instance Num InetPort
- Network.IP.Addr: instance Ord IP
- Network.IP.Addr: instance Ord IP4
- Network.IP.Addr: instance Ord IP6
- Network.IP.Addr: instance Ord InetPort
- Network.IP.Addr: instance Ord Range4
- Network.IP.Addr: instance Ord Range6
- Network.IP.Addr: instance Ord a => Ord (InetAddr a)
- Network.IP.Addr: instance Printable (InetAddr IP)
- Network.IP.Addr: instance Printable IP
- Network.IP.Addr: instance Printable IP4
- Network.IP.Addr: instance Printable IP6
- Network.IP.Addr: instance Printable Inet4Addr
- Network.IP.Addr: instance Printable Inet6Addr
- Network.IP.Addr: instance Printable InetPort
- Network.IP.Addr: instance Printable a => Printable (NetAddr a)
- Network.IP.Addr: instance Read (NetAddr IP)
- Network.IP.Addr: instance Read IP
- Network.IP.Addr: instance Read IP4
- Network.IP.Addr: instance Read IP6
- Network.IP.Addr: instance Read InetPort
- Network.IP.Addr: instance Read Net4Addr
- Network.IP.Addr: instance Read Net6Addr
- Network.IP.Addr: instance Read Range4
- Network.IP.Addr: instance Read Range6
- Network.IP.Addr: instance Read a => Read (InetAddr a)
- Network.IP.Addr: instance Real InetPort
- Network.IP.Addr: instance Serialize (NetAddr IP)
- Network.IP.Addr: instance Serialize IP
- Network.IP.Addr: instance Serialize IP4
- Network.IP.Addr: instance Serialize IP6
- Network.IP.Addr: instance Serialize InetPort
- Network.IP.Addr: instance Serialize Net4Addr
- Network.IP.Addr: instance Serialize Net6Addr
- Network.IP.Addr: instance Serialize a => Serialize (InetAddr a)
- Network.IP.Addr: instance Show IP
- Network.IP.Addr: instance Show IP4
- Network.IP.Addr: instance Show IP6
- Network.IP.Addr: instance Show InetPort
- Network.IP.Addr: instance Show Range4
- Network.IP.Addr: instance Show Range6
- Network.IP.Addr: instance Show a => Show (InetAddr a)
- Network.IP.Addr: instance Show a => Show (NetAddr a)
- Network.IP.Addr: instance Storable IP4
- Network.IP.Addr: instance Storable IP6
- Network.IP.Addr: instance Storable InetPort
- Network.IP.Addr: instance Textual (InetAddr IP)
- Network.IP.Addr: instance Textual (NetAddr IP)
- Network.IP.Addr: instance Textual IP
- Network.IP.Addr: instance Textual IP4
- Network.IP.Addr: instance Textual IP6
- Network.IP.Addr: instance Textual Inet4Addr
- Network.IP.Addr: instance Textual Inet6Addr
- Network.IP.Addr: instance Textual InetPort
- Network.IP.Addr: instance Textual Net4Addr
- Network.IP.Addr: instance Textual Net6Addr
- Network.IP.Addr: instance Typeable IP
- Network.IP.Addr: instance Typeable IP4
- Network.IP.Addr: instance Typeable IP6
- Network.IP.Addr: instance Typeable InetPort
- Network.IP.Addr: instance Typeable Range4
- Network.IP.Addr: instance Typeable Range6
- Network.IP.Addr: instance Typeable1 InetAddr
- Network.IP.Addr: instance Typeable1 NetAddr
- Network.IP.Addr: unIP4 :: IP4 -> Word32
- Network.IP.Addr: unIP6 :: IP6 -> Word128
- Network.IP.Addr: unInetPort :: InetPort -> Word16
+ Network.IP.Addr: [inetHost] :: InetAddr a -> a
+ Network.IP.Addr: [inetPort] :: InetAddr a -> {-# UNPACK #-} !InetPort
+ Network.IP.Addr: [unIP4] :: IP4 -> Word32
+ Network.IP.Addr: [unIP6] :: IP6 -> Word128
+ Network.IP.Addr: [unInetPort] :: InetPort -> Word16
+ Network.IP.Addr: anIP46 :: Proxy IP46
+ Network.IP.Addr: anIP46Of :: Proxy t₄ -> Proxy t₆ -> Proxy (IP46 t₄ t₆)
+ Network.IP.Addr: data IP46 t₄ t₆
+ Network.IP.Addr: fromInetAddr46 :: IP46 (InetAddr IP4) (InetAddr IP6) -> InetAddr IP
+ Network.IP.Addr: fromNetAddr46 :: IP46 (NetAddr IP4) (NetAddr IP6) -> NetAddr IP
+ Network.IP.Addr: getNetAddr :: (IsNetAddr n, Deserializable (NetHost n), Deserializer μ) => μ n
+ Network.IP.Addr: instance (Data.Data.Data t₄, Data.Data.Data t₆) => Data.Data.Data (Network.IP.Addr.IP46 t₄ t₆)
+ Network.IP.Addr: instance (GHC.Classes.Eq t₄, GHC.Classes.Eq t₆) => GHC.Classes.Eq (Network.IP.Addr.IP46 t₄ t₆)
+ Network.IP.Addr: instance (GHC.Classes.Ord t₄, GHC.Classes.Ord t₆) => GHC.Classes.Ord (Network.IP.Addr.IP46 t₄ t₆)
+ Network.IP.Addr: instance (GHC.Read.Read t₄, GHC.Read.Read t₆) => GHC.Read.Read (Network.IP.Addr.IP46 t₄ t₆)
+ Network.IP.Addr: instance (GHC.Show.Show t₄, GHC.Show.Show t₆) => GHC.Show.Show (Network.IP.Addr.IP46 t₄ t₆)
+ Network.IP.Addr: instance Data.Bits.Bits Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Bits.Bits Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Bits.Bits Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Data.Data Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Data.Data Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Data.Data Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Data.Data Network.IP.Addr.Range4
+ Network.IP.Addr: instance Data.Data.Data Network.IP.Addr.Range6
+ Network.IP.Addr: instance Data.Data.Data a => Data.Data.Data (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance Data.Data.Data a => Data.Data.Data (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance Data.Default.Class.Default Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Default.Class.Default Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Deserializer.Deserializable (Network.IP.Addr.NetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.IP
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.Net4Addr
+ Network.IP.Addr: instance Data.Deserializer.Deserializable Network.IP.Addr.Net6Addr
+ Network.IP.Addr: instance Data.Deserializer.Deserializable a => Data.Deserializer.Deserializable (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance Data.Hashable.Class.Hashable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Hashable.Class.Hashable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Hashable.Class.Hashable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Hashable.Class.Hashable a => Data.Hashable.Class.Hashable (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance Data.Serializer.Serializable Network.IP.Addr.IP
+ Network.IP.Addr: instance Data.Serializer.Serializable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Serializer.Serializable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Serializer.Serializable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Serializer.Serializable a => Data.Serializer.Serializable (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance Data.Serializer.Serializable a => Data.Serializer.Serializable (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance Data.Serializer.SizedSerializable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Serializer.SizedSerializable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Serializer.SizedSerializable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Serializer.SizedSerializable a => Data.Serializer.SizedSerializable (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance Data.Serializer.SizedSerializable a => Data.Serializer.SizedSerializable (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance Data.Textual.Printable (Network.IP.Addr.InetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.IP
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.Inet4Addr
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.Inet6Addr
+ Network.IP.Addr: instance Data.Textual.Printable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Textual.Printable a => Data.Textual.Printable (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance Data.Textual.Textual (Network.IP.Addr.InetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance Data.Textual.Textual (Network.IP.Addr.NetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.IP
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.IP4
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.IP6
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.Inet4Addr
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.Inet6Addr
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.InetPort
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.Net4Addr
+ Network.IP.Addr: instance Data.Textual.Textual Network.IP.Addr.Net6Addr
+ Network.IP.Addr: instance Foreign.Storable.Storable Network.IP.Addr.IP4
+ Network.IP.Addr: instance Foreign.Storable.Storable Network.IP.Addr.IP6
+ Network.IP.Addr: instance Foreign.Storable.Storable Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Arr.Ix Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Arr.Ix Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Arr.Ix Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Base.Functor Network.IP.Addr.InetAddr
+ Network.IP.Addr: instance GHC.Classes.Eq Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Classes.Eq Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Classes.Eq Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Classes.Eq Network.IP.Addr.Range4
+ Network.IP.Addr: instance GHC.Classes.Eq Network.IP.Addr.Range6
+ Network.IP.Addr: instance GHC.Classes.Eq a => GHC.Classes.Eq (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance GHC.Classes.Eq a => GHC.Classes.Eq (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance GHC.Classes.Ord Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Classes.Ord Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Classes.Ord Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Classes.Ord Network.IP.Addr.Range4
+ Network.IP.Addr: instance GHC.Classes.Ord Network.IP.Addr.Range6
+ Network.IP.Addr: instance GHC.Classes.Ord a => GHC.Classes.Ord (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance GHC.Enum.Bounded Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Enum.Bounded Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Enum.Bounded Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Enum.Enum Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Enum.Enum Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Enum.Enum Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Enum.Enum Network.IP.Addr.Range4
+ Network.IP.Addr: instance GHC.Enum.Enum Network.IP.Addr.Range6
+ Network.IP.Addr: instance GHC.Num.Num Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Num.Num Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Num.Num Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Read.Read (Network.IP.Addr.NetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.Net4Addr
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.Net6Addr
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.Range4
+ Network.IP.Addr: instance GHC.Read.Read Network.IP.Addr.Range6
+ Network.IP.Addr: instance GHC.Read.Read a => GHC.Read.Read (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance GHC.Real.Integral Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Real.Real Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Show.Show Network.IP.Addr.IP4
+ Network.IP.Addr: instance GHC.Show.Show Network.IP.Addr.IP6
+ Network.IP.Addr: instance GHC.Show.Show Network.IP.Addr.InetPort
+ Network.IP.Addr: instance GHC.Show.Show Network.IP.Addr.Range4
+ Network.IP.Addr: instance GHC.Show.Show Network.IP.Addr.Range6
+ Network.IP.Addr: instance GHC.Show.Show a => GHC.Show.Show (Network.IP.Addr.InetAddr a)
+ Network.IP.Addr: instance GHC.Show.Show a => GHC.Show.Show (Network.IP.Addr.NetAddr a)
+ Network.IP.Addr: instance Network.IP.Addr.IsNetAddr (Network.IP.Addr.NetAddr Network.IP.Addr.IP)
+ Network.IP.Addr: instance Network.IP.Addr.IsNetAddr Network.IP.Addr.Net4Addr
+ Network.IP.Addr: instance Network.IP.Addr.IsNetAddr Network.IP.Addr.Net6Addr
+ Network.IP.Addr: putNetAddr :: (IsNetAddr n, Serializable (NetHost n), Serializer s) => n -> s
+ Network.IP.Addr: toInetAddr46 :: InetAddr IP -> IP46 (InetAddr IP4) (InetAddr IP6)
+ Network.IP.Addr: toNetAddr46 :: NetAddr IP -> IP46 (NetAddr IP4) (NetAddr IP6)
+ Network.IP.Addr: type IP = IP46 IP4 IP6
+ Network.IP.Addr: type family NetHost n;
+ Network.IP.Addr: }
- Network.IP.Addr: IPv4 :: {-# UNPACK #-} !IP4 -> IP
+ Network.IP.Addr: IPv4 :: t₄ -> IP46 t₄ t₆
- Network.IP.Addr: IPv6 :: {-# UNPACK #-} !IP6 -> IP
+ Network.IP.Addr: IPv6 :: t₆ -> IP46 t₄ t₆
- Network.IP.Addr: class IsNetAddr n where type family NetHost n
+ Network.IP.Addr: class IsNetAddr n where type NetHost n where {
Files
- LICENSE +1/−1
- network-ip.cabal +13/−15
- src/Network/IP/Addr.hs +152/−65
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2011-2013 Mikhail Vorozhtsov+Copyright (c) 2011-2016 Mikhail Vorozhtsov All rights reserved. Redistribution and use in source and binary forms, with or without
network-ip.cabal view
@@ -1,5 +1,5 @@ Name: network-ip-Version: 0.2.1.1+Version: 0.3 Category: Network Stability: experimental Synopsis: Internet Protocol data structures@@ -11,7 +11,7 @@ Author: Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com> Maintainer: Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>-Copyright: 2011-2013 Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>+Copyright: 2011-2016 Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com> License: BSD3 License-File: LICENSE @@ -24,18 +24,16 @@ Library Default-Language: Haskell2010- Build-Depends:- base >= 4.3 && < 5,- data-default-class,- data-endian >= 0.0.1,- data-dword >= 0.2,- type-hint >= 0.1,- hashable >= 1.1,- binary >= 0.5,- cereal >= 0.3,- text-printer >= 0.4,- data-textual >= 0.3,- parsers >= 0.5+ Build-Depends: base >= 4.3 && < 5+ , data-default-class+ , data-endian >= 0.0.1+ , data-dword >= 0.2+ , type-hint >= 0.1+ , hashable >= 1.1+ , data-serializer >= 0.2+ , text-printer >= 0.4+ , data-textual >= 0.3+ , parsers >= 0.5 Hs-Source-Dirs: src GHC-Options: -Wall Exposed-Modules:@@ -45,7 +43,7 @@ Default-Language: Haskell2010 Type: exitcode-stdio-1.0 Build-Depends:- base >= 4 && < 5,+ base, tasty >= 0.4, tasty-quickcheck >= 0.3, data-dword,
src/Network/IP/Addr.hs view
@@ -15,8 +15,8 @@ -- | Internet Protocol addressing. module Network.IP.Addr ( - -- * Host address- -- ** IPv4 address+ -- * Host address+ -- ** IPv4 address IP4(..) , anIP4 , ip4ToOctets@@ -28,7 +28,7 @@ , broadcastIP4 , Range4(..) , ip4Range- -- ** IPv6 address+ -- ** IPv6 address , IP6(..) , anIP6 , ip6ToWords@@ -39,8 +39,11 @@ , loopbackIP6 , Range6(..) , ip6Range- -- ** IP address- , IP(..)+ -- ** IP address+ , IP46(..)+ , anIP46+ , anIP46Of+ , IP , anIP -- * Network address , IsNetAddr(..)@@ -54,10 +57,14 @@ , aNetAddrIP , net4Addr , net6Addr+ , toNetAddr46+ , fromNetAddr46 , printNetAddr , net4Parser , net6Parser , netParser+ , putNetAddr+ , getNetAddr -- * Port number , InetPort(..) , anInetPort@@ -70,10 +77,13 @@ , anInet4Addr , anInet6Addr , anInetAddrIP+ , toInetAddr46+ , fromInetAddr46 ) where import Prelude hiding (print) import Data.Typeable (Typeable, Typeable1)+import Data.Data (Data) import Data.Word import Data.Bits import Data.DoubleWord (BinaryWord(..), DoubleWord(..), Word128)@@ -81,10 +91,10 @@ import Data.Endian import Data.Default.Class import Data.Hashable-import Data.Binary (Binary)-import qualified Data.Binary as B-import Data.Serialize (Serialize)-import qualified Data.Serialize as S+import Data.Serializer (Serializer, Serializable, SizedSerializable)+import qualified Data.Serializer as S+import Data.Deserializer (Deserializer, Deserializable)+import qualified Data.Deserializer as D import Text.Printer (Printer, (<>)) import qualified Text.Printer as P import qualified Text.Printer.Integral as P@@ -102,8 +112,7 @@ -- | IPv4 address. newtype IP4 = IP4 { unIP4 ∷ Word32 }- deriving (Typeable, Eq, Ord, Bounded, Enum, Ix, Num, Bits, Hashable,- Binary, Serialize)+ deriving (Typeable, Data, Eq, Ord, Bounded, Enum, Ix, Num, Bits, Hashable) -- | 'IP4' proxy value. anIP4 ∷ Proxy IP4@@ -153,6 +162,18 @@ peek p = IP4 . fromBigEndian <$> peek (castPtr p) poke p = poke (castPtr p) . toBigEndian . unIP4 +instance Serializable IP4 where+ put = S.word32B . unIP4+ {-# INLINE put #-}++instance SizedSerializable IP4 where+ size _ = 4+ {-# INLINE size #-}++instance Deserializable IP4 where+ get = IP4 <$> D.word32B <?> "IPv4 address"+ {-# INLINE get #-}+ -- | The octets of an IPv4 address. ip4ToOctets ∷ IP4 → (Word8, Word8, Word8, Word8) ip4ToOctets (IP4 w) = ( fromIntegral $ w `shiftR` 24@@ -217,7 +238,7 @@ | MulticastIP4 -- ^ Multicast address. | FutureUseIP4 -- ^ Future use. | BroadcastIP4 -- ^ Limited broadcast.- deriving (Typeable, Show, Read, Eq, Ord, Enum)+ deriving (Typeable, Data, Show, Read, Eq, Ord, Enum) -- | Determine the address range type. ip4Range ∷ IP4 → Range4@@ -251,7 +272,7 @@ -- | IPv6 address. newtype IP6 = IP6 { unIP6 ∷ Word128 }- deriving (Typeable, Eq, Ord, Bounded, Enum, Ix, Num, Bits, Hashable)+ deriving (Typeable, Data, Eq, Ord, Bounded, Enum, Ix, Num, Bits, Hashable) -- | 'IP6' proxy value. anIP6 ∷ Proxy IP6@@ -350,18 +371,17 @@ poke (castPtr p) $ toBigEndian $ hiWord w poke (castPtr p) $ toBigEndian $ loWord w -instance Binary IP6 where- get = fmap IP6 $ fromHiAndLo <$> B.get <*> B.get- put (IP6 w) = do- B.put $ hiWord w- B.put $ loWord w+instance Serializable IP6 where+ put (IP6 w) = S.word64B (hiWord w) <> S.word64B (loWord w)+ {-# INLINE put #-} -instance Serialize IP6 where- get = fmap IP6 $ fromHiAndLo <$> S.get <*> S.get- put (IP6 w) = do- S.put $ hiWord w- S.put $ loWord w+instance SizedSerializable IP6 where+ size _ = 16+ {-# INLINE size #-} +instance Deserializable IP6 where+ get = fmap IP6 $ fromHiAndLo <$> D.get <*> D.get <?> "IPv6 address"+ -- | The 16-bit pieces of an IPv6 address. ip6ToWords ∷ IP6 → (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)@@ -446,7 +466,7 @@ | UniqueLocalIP6 -- ^ Unique local address. | LinkLocalIP6 -- ^ Link local address. | MulticastIP6 -- ^ Multicast address.- deriving (Typeable, Show, Read, Eq, Ord, Enum)+ deriving (Typeable, Data, Show, Read, Eq, Ord, Enum) -- | Determine the address range type. ip6Range ∷ IP6 → Range6@@ -480,11 +500,22 @@ w2 = loWord q1 w3 = hiWord q2 --- IP address.-data IP = IPv4 {-# UNPACK #-} !IP4- | IPv6 {-# UNPACK #-} !IP6- deriving (Typeable, Eq, Ord, Show, Read)+-- | IPv4- or IPv6-specific data.+data IP46 t₄ t₆ = IPv4 t₄+ | IPv6 t₆+ deriving (Typeable, Data, Eq, Ord, Show, Read) +-- | 'IP46' proxy value.+anIP46 ∷ Proxy IP46+anIP46 = Proxy++-- | 'IP46' /t₄/ /t₆/ proxy value.+anIP46Of ∷ Proxy t₄ → Proxy t₆ → Proxy (IP46 t₄ t₆)+anIP46Of _ _ = Proxy++-- | IP address.+type IP = IP46 IP4 IP6+ -- | 'IP' proxy value. anIP ∷ Proxy IP anIP = Proxy@@ -498,16 +529,13 @@ textual = try (IPv4 <$> textual) <|> (IPv6 <$> textual) {-# INLINABLE textual #-} -instance Binary IP where- get = B.get >>= return . either IPv4 IPv6- put (IPv4 a) = B.put (Left a ∷ Either IP4 IP6)- put (IPv6 a) = B.put (Right a ∷ Either IP4 IP6)--instance Serialize IP where- get = S.get >>= return . either IPv4 IPv6+instance Serializable IP where put (IPv4 a) = S.put (Left a ∷ Either IP4 IP6) put (IPv6 a) = S.put (Right a ∷ Either IP4 IP6) +instance Deserializable IP where+ get = D.get >>= return . either IPv4 IPv6 <?> "IP address"+ -- | Network address. class IsNetAddr n where -- | The address type.@@ -531,11 +559,17 @@ → n -- ^ Network address → Bool --- | Network address: host address + network mask length.+-- | Network address: host address + network prefix length. data NetAddr a = NetAddr a {-# UNPACK #-} !Word8- deriving (Typeable, Eq)+ deriving Eq +deriving instance Typeable1 InetAddr+deriving instance Data a ⇒ Data (NetAddr a)++-- | IPv4 network address. type Net4Addr = NetAddr IP4++-- | IPv6 network address. type Net6Addr = NetAddr IP6 -- | 'NetAddr' proxy value.@@ -602,29 +636,25 @@ textual = netParser {-# INLINE textual #-} -instance Binary Net4Addr where- get = netAddr <$> B.get <*> B.get- put (NetAddr a w) = B.put a >> B.put w--instance Binary Net6Addr where- get = netAddr <$> B.get <*> B.get- put (NetAddr a w) = B.put a >> B.put w+instance Serializable a ⇒ Serializable (NetAddr a) where+ put (NetAddr a w) = S.put a <> S.put w+ {-# INLINE put #-} -instance Binary (NetAddr IP) where- get = netAddr <$> B.get <*> B.get- put (NetAddr a w) = B.put a >> B.put w+instance SizedSerializable a ⇒ SizedSerializable (NetAddr a) where+ size _ = S.size (Proxy ∷ Proxy a) + 1+ {-# INLINE size #-} -instance Serialize Net4Addr where- get = netAddr <$> S.get <*> S.get- put (NetAddr a w) = S.put a >> S.put w+instance Deserializable Net4Addr where+ get = getNetAddr <?> "IPv4 network address"+ {-# INLINE get #-} -instance Serialize Net6Addr where- get = netAddr <$> S.get <*> S.get- put (NetAddr a w) = S.put a >> S.put w+instance Deserializable Net6Addr where+ get = getNetAddr <?> "IPv6 network address"+ {-# INLINE get #-} -instance Serialize (NetAddr IP) where- get = netAddr <$> S.get <*> S.get- put (NetAddr a w) = S.put a >> S.put w+instance Deserializable (NetAddr IP) where+ get = getNetAddr <?> "IP network address"+ {-# INLINE get #-} instance IsNetAddr Net4Addr where type NetHost Net4Addr = IP4@@ -702,14 +732,28 @@ where l = 128 - fromIntegral w inNetwork _ _ = False +-- | An alias for 'netAddr'. net4Addr ∷ IP4 → Word8 → Net4Addr net4Addr = netAddr {-# INLINE net4Addr #-} +-- | An alias for 'netAddr'. net6Addr ∷ IP6 → Word8 → Net6Addr net6Addr = netAddr {-# INLINE net6Addr #-} +-- | Pull 'IP46' from a 'NetAddr'.+toNetAddr46 ∷ NetAddr IP → IP46 (NetAddr IP4) (NetAddr IP6)+toNetAddr46 (NetAddr (IPv4 a) w) = IPv4 (NetAddr a w)+toNetAddr46 (NetAddr (IPv6 a) w) = IPv6 (NetAddr a w)+{-# INLINABLE toNetAddr46 #-}++-- | Push 'IP46' into a 'NetAddr'.+fromNetAddr46 ∷ IP46 (NetAddr IP4) (NetAddr IP6) → NetAddr IP+fromNetAddr46 (IPv4 (NetAddr a w)) = NetAddr (IPv4 a) w+fromNetAddr46 (IPv6 (NetAddr a w)) = NetAddr (IPv6 a) w+{-# INLINABLE fromNetAddr46 #-}+ -- | Print network address (CIDR notation). printNetAddr ∷ (IsNetAddr n, Printable (NetHost n), Printer p) ⇒ n → p printNetAddr n = print (netHost n) <> P.char7 '/' <> print (netLength n)@@ -750,10 +794,22 @@ mask (IPv4 _) = ip4Mask mask (IPv6 _) = ip6Mask +-- | Serialize a network address (host address followed by 8-bit+-- prefix length).+putNetAddr ∷ (IsNetAddr n, Serializable (NetHost n), Serializer s) ⇒ n → s+putNetAddr n = S.put (netHost n) <> S.put (netPrefix n)+{-# INLINE putNetAddr #-}++-- | Deserialize a network address (host address followed by 8-bit+-- prefix length).+getNetAddr ∷ (IsNetAddr n, Deserializable (NetHost n), Deserializer μ) ⇒ μ n+getNetAddr = netAddr <$> D.get <*> D.get+{-# INLINE getNetAddr #-}+ -- | Port number. newtype InetPort = InetPort { unInetPort ∷ Word16 }- deriving (Typeable, Eq, Ord, Bounded, Enum, Ix, Num, Real, Integral, Bits,- Hashable, Binary, Serialize, Printable)+ deriving (Typeable, Data, Eq, Ord, Bounded, Enum, Ix, Num, Real, Integral,+ Bits, Hashable, Printable) -- | 'InetPort' proxy value. anInetPort ∷ Proxy InetPort@@ -761,7 +817,7 @@ instance Show InetPort where showsPrec p (InetPort w) = showsPrec p w- {-# INLINE show #-}+ {-# INLINE showsPrec #-} instance Read InetPort where readsPrec p = fmap (\(w, s) → (InetPort w, s)) . readsPrec p@@ -776,14 +832,30 @@ peek p = InetPort . fromBigEndian <$> peek (castPtr p) poke p = poke (castPtr p) . toBigEndian . unInetPort +instance Serializable InetPort where+ put = S.word16B . unInetPort+ {-# INLINE put #-}++instance SizedSerializable InetPort where+ size _ = 2+ {-# INLINE size #-}++instance Deserializable InetPort where+ get = InetPort <$> D.word16B <?> "port number"+ {-# INLINE get #-}+ -- | Socket address: host address + port number. data InetAddr a = InetAddr { inetHost ∷ a , inetPort ∷ {-# UNPACK #-} !InetPort } deriving (Eq, Ord, Show, Read) deriving instance Typeable1 InetAddr+deriving instance Data a ⇒ Data (InetAddr a) +-- | IPv4 socket address. type Inet4Addr = InetAddr IP4++-- | IPv6 socket address. type Inet6Addr = InetAddr IP6 -- | 'InetAddr' proxy value.@@ -852,11 +924,26 @@ {-# INLINE hash #-} #endif -instance Binary a ⇒ Binary (InetAddr a) where- get = InetAddr <$> B.get <*> B.get- put (InetAddr a p) = B.put a >> B.put p+instance Serializable a ⇒ Serializable (InetAddr a) where+ put (InetAddr a p) = S.put a <> S.put p+ {-# INLINE put #-} -instance Serialize a ⇒ Serialize (InetAddr a) where- get = InetAddr <$> S.get <*> S.get- put (InetAddr a p) = S.put a >> S.put p+instance SizedSerializable a ⇒ SizedSerializable (InetAddr a) where+ size _ = S.size (Proxy ∷ Proxy a) + 2+ {-# INLINE size #-} +instance Deserializable a ⇒ Deserializable (InetAddr a) where+ get = InetAddr <$> (D.get <?> "host address") <*> D.get <?> "socket address"+ {-# INLINE get #-}++-- | Pull 'IP46' from an 'InetAddr'.+toInetAddr46 ∷ InetAddr IP → IP46 (InetAddr IP4) (InetAddr IP6)+toInetAddr46 (InetAddr (IPv4 a) w) = IPv4 (InetAddr a w)+toInetAddr46 (InetAddr (IPv6 a) w) = IPv6 (InetAddr a w)+{-# INLINABLE toInetAddr46 #-}++-- | Push 'IP46' into an 'InetAddr'.+fromInetAddr46 ∷ IP46 (InetAddr IP4) (InetAddr IP6) → InetAddr IP+fromInetAddr46 (IPv4 (InetAddr a w)) = InetAddr (IPv4 a) w+fromInetAddr46 (IPv6 (InetAddr a w)) = InetAddr (IPv6 a) w+{-# INLINABLE fromInetAddr46 #-}