diff --git a/asif.cabal b/asif.cabal
--- a/asif.cabal
+++ b/asif.cabal
@@ -1,10 +1,7 @@
--- This file has been generated from package.yaml by hpack version 0.18.1.
---
--- see: https://github.com/sol/hpack
-
 name:           asif
-version:        4.0.1
-description:    Please see the README on Github at <https://github.com/packetloop/asif#readme>
+version:        4.1.0
+description:    Library for creating and querying segmented feeds. Please see <https://github.com/packetloop/asif#readme>
+synopsis:       Library for creating and querying segmented feeds
 category:       Services
 homepage:       https://github.com/packetloop/asif#readme
 bug-reports:    https://github.com/packetloop/asif/issues
@@ -15,7 +12,6 @@
 license-file:   LICENSE
 build-type:     Simple
 cabal-version:  >= 1.10
-
 extra-source-files:
     ChangeLog.md
     README.md
@@ -25,37 +21,6 @@
   location: https://github.com/packetloop/asif
 
 library
-  hs-source-dirs:
-      src
-  default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
-  build-depends:
-      base >= 4.7 && < 5
-    , attoparsec
-    , binary
-    , bytestring
-    , conduit
-    , conduit-combinators
-    , conduit-extra
-    , containers
-    , cpu
-    , either
-    , exceptions
-    , foldl
-    , generic-lens
-    , hw-bits
-    , hw-ip
-    , iproute
-    , lens
-    , network
-    , old-locale
-    , profunctors
-    , resourcet
-    , temporary-resourcet
-    , text
-    , thyme
-    , transformers
-    , vector
   exposed-modules:
       Arbor.File.Format.Asif
       Arbor.File.Format.Asif.ByIndex
@@ -81,17 +46,13 @@
       Arbor.File.Format.Asif.Maybe
       Arbor.File.Format.Asif.Text
       Paths_asif
-  default-language: Haskell2010
-
-executable asif
-  main-is: Main.hs
   hs-source-dirs:
-      app
+      src
   default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
-  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -threaded -rtsopts -O2 -msse4.2
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      base >= 4.7 && < 5
-    , attoparsec
+      attoparsec
+    , base >=4.7 && <5
     , binary
     , bytestring
     , conduit
@@ -116,9 +77,10 @@
     , thyme
     , transformers
     , vector
-    , asif
-    , directory
-    , optparse-applicative
+  default-language: Haskell2010
+
+executable asif
+  main-is: Main.hs
   other-modules:
       App.Commands
       App.Commands.Dump
@@ -131,18 +93,15 @@
       App.Commands.Options.Type
       App.Dump
       App.IO
-  default-language: Haskell2010
-
-test-suite asif-test
-  type: exitcode-stdio-1.0
-  main-is: Spec.hs
+      Paths_asif
   hs-source-dirs:
-      test
+      app
   default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
-  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -threaded -rtsopts -O2 -msse4.2
   build-depends:
-      base >= 4.7 && < 5
+      asif
     , attoparsec
+    , base >=4.7 && <5
     , binary
     , bytestring
     , conduit
@@ -150,6 +109,7 @@
     , conduit-extra
     , containers
     , cpu
+    , directory
     , either
     , exceptions
     , foldl
@@ -160,6 +120,7 @@
     , lens
     , network
     , old-locale
+    , optparse-applicative
     , profunctors
     , resourcet
     , temporary-resourcet
@@ -167,13 +128,15 @@
     , thyme
     , transformers
     , vector
-    , asif
-    , hspec
-    , hedgehog
-    , hw-hspec-hedgehog
+  default-language: Haskell2010
+
+test-suite asif-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
   other-modules:
       Arbor.File.Format.Asif.ByteString.BuilderSpec
       Arbor.File.Format.Asif.Data.IpSpec
+      Arbor.File.Format.Asif.ExtractSpec
       Arbor.File.Format.Asif.Format.SegmentValueSpec
       Arbor.File.Format.Asif.Format.TextSpec
       Arbor.File.Format.Asif.WriteSpec
@@ -181,4 +144,40 @@
       Arbor.TestUtils
       Gen.Feed
       TestApp
+      Paths_asif
+  hs-source-dirs:
+      test
+  default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      asif
+    , attoparsec
+    , base >=4.7 && <5
+    , binary
+    , bytestring
+    , conduit
+    , conduit-combinators
+    , conduit-extra
+    , containers
+    , cpu
+    , either
+    , exceptions
+    , foldl
+    , generic-lens
+    , hedgehog
+    , hspec
+    , hw-bits
+    , hw-hspec-hedgehog
+    , hw-ip
+    , iproute
+    , lens
+    , network
+    , old-locale
+    , profunctors
+    , resourcet
+    , temporary-resourcet
+    , text
+    , thyme
+    , transformers
+    , vector
   default-language: Haskell2010
diff --git a/src/Arbor/File/Format/Asif/Extract.hs b/src/Arbor/File/Format/Asif/Extract.hs
--- a/src/Arbor/File/Format/Asif/Extract.hs
+++ b/src/Arbor/File/Format/Asif/Extract.hs
@@ -8,26 +8,28 @@
 module Arbor.File.Format.Asif.Extract
   ( formats
   , list
+  , listLazy
   , map
   , vectorBoxed
   , vectorUnboxed
   ) where
 
-import           Arbor.File.Format.Asif.Format.Type (Format)
-import           Arbor.File.Format.Asif.Whatever
-import           Control.Lens
-import           Data.Binary.Get
-import           Data.List                          hiding (map)
-import           Data.Text                          (Text)
-import           Data.Text.Encoding                 (decodeUtf8')
-import           Data.Text.Encoding.Error
-import           Prelude                            hiding (map)
+import Arbor.File.Format.Asif.Format.Type (Format)
+import Arbor.File.Format.Asif.Whatever
+import Control.Lens
+import Data.Binary.Get
+import Data.List                          hiding (map)
+import Data.Text                          (Text)
+import Data.Text.Encoding                 (decodeUtf8')
+import Data.Text.Encoding.Error
+import Prelude                            hiding (map)
 
-import qualified Data.Binary.Get                    as G
-import qualified Data.ByteString.Lazy               as LBS
-import qualified Data.Map.Strict                    as M
-import qualified Data.Vector                        as V
-import qualified Data.Vector.Unboxed                as VU
+import qualified Data.Binary.Get      as G
+import qualified Data.ByteString.Lazy as LBS
+import qualified Data.List            as L
+import qualified Data.Map.Strict      as M
+import qualified Data.Vector          as V
+import qualified Data.Vector.Unboxed  as VU
 
 vectorBoxed :: Get a -> LBS.ByteString -> V.Vector a
 vectorBoxed g = V.unfoldr step
@@ -48,6 +50,14 @@
           if not empty
             then (:) <$> g <*> go
             else return []
+
+listLazy :: Get a -> LBS.ByteString -> [Either String a]
+listLazy g bs =
+  flip L.unfoldr bs $ \acc ->
+    if LBS.null acc then Nothing
+    else case runGetOrFail g acc of
+      Left (_, _, err)  -> Just (Left err, LBS.empty)
+      Right (bs', _, a) -> Just (Right a, bs')
 
 map :: (Ord a) => LBS.ByteString -> Get a -> LBS.ByteString -> Get b -> M.Map a b
 map ks kf vs vf = foldr (\(k, v) m -> M.insert k v m) M.empty $ zip keys values
diff --git a/test/Arbor/File/Format/Asif/ExtractSpec.hs b/test/Arbor/File/Format/Asif/ExtractSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Arbor/File/Format/Asif/ExtractSpec.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Arbor.File.Format.Asif.ExtractSpec
+  ( spec
+  ) where
+
+import Arbor.File.Format.Asif.Extract
+import Control.Lens
+
+import qualified Data.Binary.Get         as G
+import qualified Data.ByteString.Builder as BB
+import qualified Data.ByteString.Lazy    as LBS
+
+import HaskellWorks.Hspec.Hedgehog
+import Hedgehog
+import Test.Hspec
+
+import qualified Data.List      as L
+import qualified Hedgehog.Gen   as Gen
+import qualified Hedgehog.Range as Range
+
+{-# ANN module ("HLint: ignore Redundant do"  :: String) #-}
+
+spec :: Spec
+spec = describe "Arbor.File.Format.Asif.ExtractSpec" $ do
+  it "listLazy should extract correct values" $ require $ property $ do
+    ts <- forAll $ Gen.list (Range.linear 0 20) (Gen.int64 (Range.linear 0 maxBound))
+    let body = ts <&> BB.int64LE & mconcat & BB.toLazyByteString
+    listLazy G.getInt64le body === fmap Right ts
