diff --git a/hw-ip.cabal b/hw-ip.cabal
--- a/hw-ip.cabal
+++ b/hw-ip.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.2
 name: hw-ip
-version: 2.3.3.0
+version: 2.3.4.0
 license: BSD-3-Clause
 license-file: LICENSE
 copyright: 2018-2019 John Ky, David Turnbull, Jian Wan
diff --git a/src/HaskellWorks/Data/Network/Ip/Ip.hs b/src/HaskellWorks/Data/Network/Ip/Ip.hs
--- a/src/HaskellWorks/Data/Network/Ip/Ip.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Ip.hs
@@ -11,6 +11,7 @@
   , isCanonical
   , canonicalise
   , canonicaliseIpBlock
+  , blockToRange
   , firstIpAddress
   , lastIpAddress
   ) where
@@ -19,6 +20,7 @@
 import Data.Word
 import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
+import HaskellWorks.Data.Network.Ip.Range    (Range (..))
 import HaskellWorks.Data.Network.Ip.Validity
 import Text.Read
 
@@ -70,6 +72,10 @@
 canonicaliseIpBlock :: IpBlock v -> IpBlock Canonical
 canonicaliseIpBlock (IpBlockV4 b) = IpBlockV4 (V4.canonicaliseIpBlock b)
 canonicaliseIpBlock (IpBlockV6 b) = IpBlockV6 (V6.canonicaliseIpBlock b)
+
+blockToRange :: IpBlock Canonical -> Range IpAddress
+blockToRange (IpBlockV4 b) = let Range s e = V4.blockToRange b in Range (IpAddressV4 s) (IpAddressV4 e)
+blockToRange (IpBlockV6 b) = let Range s e = V6.blockToRange b in Range (IpAddressV6 s) (IpAddressV6 e)
 
 firstIpAddress :: IpBlock Canonical -> (Word32, Word32, Word32, Word32)
 firstIpAddress (IpBlockV4 v4Block)                          = firstIpAddress (IpBlockV6 (V6.fromIpv4Block v4Block))
diff --git a/src/HaskellWorks/Data/Network/Ip/Range.hs b/src/HaskellWorks/Data/Network/Ip/Range.hs
--- a/src/HaskellWorks/Data/Network/Ip/Range.hs
+++ b/src/HaskellWorks/Data/Network/Ip/Range.hs
@@ -1,9 +1,11 @@
 {-# LANGUAGE DeriveGeneric     #-}
 {-# LANGUAGE MonoLocalBinds    #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TupleSections     #-}
 
 module HaskellWorks.Data.Network.Ip.Range where
 
+import Data.List                             (unfoldr)
 import GHC.Generics
 import HaskellWorks.Data.Network.Ip.SafeEnum
 import Prelude                               hiding (last)
@@ -33,3 +35,6 @@
 
 instance Ord a => Contains (Range a) where
   contains l r = first l <= first r && last l >= last r
+
+rangeToList :: (SafeEnum a, Ord a) => Range a -> [a]
+rangeToList (Range a b) = takeWhile (<= b) $ unfoldr (\x -> (x,) <$> safeSucc x) a
