diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
-*~
 /dist/
 /dist-newstyle/
-cabal.project.local
+/*result*/
+/cabal.project.local*
 shell.nix
-/result/
diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -26,3 +26,10 @@
 ## 0.2.0.0  -- 2023-08-26
 
 * Updated to toml-parser >=1.1.  This is a breaking change.
+
+## 0.3.0.0  -- 2024-02-27
+
+* Updated to toml-parser-2.0.0.0. This is a breaking change due to the
+  new toml-parser using Text and different constructor names. It also
+  adds new prisms supporting annotations used by the new toml-parser
+  version for tracking file locations.
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2017-2023 Henry Till
+Copyright (c) 2017-2024 Henry Till
 
 Permission to use, copy, modify, and/or distribute this software for any purpose
 with or without fee is hereby granted, provided that the above copyright notice
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,4 +5,4 @@
 
 Lenses for [toml-parser](https://hackage.haskell.org/package/toml-parser).
 
-See the [tests](https://github.com/henrytill/lens-toml-parser/blob/master/tests/Main.hs) for usage examples.
+See the [tests](https://github.com/henrytill/lens-toml-parser/blob/master/test/Main.hs) for usage examples.
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,2 +1,3 @@
 import Distribution.Simple
+
 main = defaultMain
diff --git a/lens-toml-parser.cabal b/lens-toml-parser.cabal
--- a/lens-toml-parser.cabal
+++ b/lens-toml-parser.cabal
@@ -1,8 +1,8 @@
--- Initial lens-toml-parser.cabal generated by cabal init.  For further 
+-- Initial lens-toml-parser.cabal generated by cabal init.  For further
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                lens-toml-parser
-version:             0.2.0.0
+version:             0.3.0.0
 synopsis:            Lenses for toml-parser
 description:         This library provides lenses for toml-parser.
 license:             ISC
@@ -10,11 +10,11 @@
 author:              Henry Till
 maintainer:          henrytill@gmail.com
 homepage:            https://github.com/henrytill/lens-toml-parser
-copyright:           Copyright (c) 2017-2023, Henry Till
+copyright:           Copyright (c) 2017-2024, Henry Till
 category:            Language, Lenses
 build-type:          Simple
 cabal-version:       >=1.10
-tested-with:         GHC ==9.2.8 || ==9.4.4 || ==9.6.2
+tested-with:         GHC ==9.4.8 || ==9.6.4 || ==9.8.2
 
 extra-source-files:
   .gitignore
@@ -28,12 +28,13 @@
 
 library
   exposed-modules:     Toml.Lens
-  -- other-modules:       
-  -- other-extensions:    
-  build-depends:       base        >=4.8 && <5
-                     , time        >=1.5 && <1.14
-                     , profunctors >=5.2 && <5.7
-                     , toml-parser >=1.1 && <1.4
+  -- other-modules:
+  -- other-extensions:
+  build-depends:       base        >=4.14 && <5
+                     , profunctors >=5.2  && <5.7
+                     , text        >=0.2  && <3
+                     , time        >=1.9  && <1.13
+                     , toml-parser >=2.0  && <2.1
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options:         -Wall
@@ -41,21 +42,13 @@
 test-suite tests
   type:                exitcode-stdio-1.0
   main-is:             Main.hs
-  build-depends:       base        >=4.8 && <5
-                     , containers  >=0.5 && <0.7
-                     , dwergaz     >=0.2 && <0.3
-                     , toml-parser >=1.1 && <1.4
-                     , lens-family >=2.1 && <2.2
+  build-depends:       base        >=4.14 && <5
+                     , containers  >=0.5  && <0.8
+                     , dwergaz     >=0.2  && <0.3
+                     , lens-family >=2.1  && <2.2
+                     , text        >=0.2  && <3
+                     , toml-parser >=2.0  && <2.1
                      , lens-toml-parser
-  hs-source-dirs:      tests
-  default-language:    Haskell2010
-  ghc-options:         -Wall
-
-test-suite hlint
-  type:                exitcode-stdio-1.0
-  main-is:             HLint.hs
-  build-depends:       base
-                     , hlint >=3.0 && <4
-  hs-source-dirs:      tests
+  hs-source-dirs:      test
   default-language:    Haskell2010
   ghc-options:         -Wall
diff --git a/src/Toml/Lens.hs b/src/Toml/Lens.hs
--- a/src/Toml/Lens.hs
+++ b/src/Toml/Lens.hs
@@ -1,30 +1,43 @@
 -- |
 -- Module      : Toml.Lens
 -- Description : Lenses for toml-parser
--- Copyright   : (c) 2017-2022, Henry Till
+-- Copyright   : (c) 2017-2024, Henry Till
 -- License     : ISC
 -- Maintainer  : henrytill@gmail.com
 -- Stability   : experimental
 --
 -- Lenses for <https://hackage.haskell.org/package/toml-parser toml-parser>.
---
 module Toml.Lens
-  ( _Table
-  , _Array
-  , _Float
-  , _Integer
-  , _String
-  , _Bool
-  , _ZonedTime
-  , _LocalTime
-  , _Day
-  , _TimeOfDay
-  ) where
+  ( -- * Unannotated
+    _Table,
+    _List,
+    _Double,
+    _Integer,
+    _Text,
+    _Bool,
+    _ZonedTime,
+    _LocalTime,
+    _Day,
+    _TimeOfDay,
 
-import           Data.Profunctor
-import qualified Data.Time       as Time
+    -- * Annotated
+    _Table',
+    _List',
+    _Double',
+    _Integer',
+    _Text',
+    _Bool',
+    _ZonedTime',
+    _LocalTime',
+    _Day',
+    _TimeOfDay',
+  )
+where
 
-import           Toml
+import Data.Profunctor
+import Data.Text (Text)
+import qualified Data.Time as Time
+import Toml
 
 --
 -- With help from:
@@ -39,121 +52,231 @@
 -- @
 --
 
-prism
-  :: (Choice p, Applicative f)
-  => (b -> t)
-  -> (s -> Either t a)
-  -> p a (f b)
-  -> p s (f t)
+prism ::
+  (Choice p, Applicative f) =>
+  (b -> t) ->
+  (s -> Either t a) ->
+  p a (f b) ->
+  p s (f t)
 prism bt seta = dimap seta (either pure (fmap bt)) . right'
 {-# INLINE prism #-}
 
 -- | @_Table :: Prism' Value Table@
-_Table
-  :: (Choice p, Applicative f)
-  => p Table (f Table)
-  -> p Value (f Value)
+_Table ::
+  (Choice p, Applicative f) =>
+  p Table (f Table) ->
+  p Value (f Value)
 _Table =
-  prism Table $ \ n -> case n of
+  prism Table $ \n -> case n of
     Table v -> Right v
-    _       -> Left n
+    _ -> Left n
 {-# INLINE _Table #-}
 
--- | @_Array :: Prism' Value [Value]@
-_Array
-  :: (Choice p, Applicative f)
-  => p [Value] (f [Value])
-  -> p Value (f Value)
-_Array =
-  prism Array $ \ n -> case n of
-    Array v -> Right v
-    _       -> Left n
-{-# INLINE _Array #-}
+-- | @_List :: Prism' Value [Value]@
+_List ::
+  (Choice p, Applicative f) =>
+  p [Value] (f [Value]) ->
+  p Value (f Value)
+_List =
+  prism List $ \n -> case n of
+    List v -> Right v
+    _ -> Left n
+{-# INLINE _List #-}
 
--- | @_Float :: Prism' Value Double@
-_Float
-  :: (Choice p, Applicative f)
-  => p Double (f Double)
-  -> p Value (f Value)
-_Float =
-  prism Float $ \ n -> case n of
-    Float v -> Right v
-    _       -> Left n
-{-# INLINE _Float #-}
+-- | @_Double :: Prism' Value Double@
+_Double ::
+  (Choice p, Applicative f) =>
+  p Double (f Double) ->
+  p Value (f Value)
+_Double =
+  prism Double $ \n -> case n of
+    Double v -> Right v
+    _ -> Left n
+{-# INLINE _Double #-}
 
 -- | @_Integer :: Prism' Value Integer@
-_Integer
-  :: (Choice p, Applicative f)
-  => p Integer (f Integer)
-  -> p Value (f Value)
+_Integer ::
+  (Choice p, Applicative f) =>
+  p Integer (f Integer) ->
+  p Value (f Value)
 _Integer =
-  prism Integer $ \ n -> case n of
+  prism Integer $ \n -> case n of
     Integer v -> Right v
-    _         -> Left n
+    _ -> Left n
 {-# INLINE _Integer #-}
 
--- | @_String :: Prism' Value String@
-_String
-  :: (Choice p, Applicative f)
-  => p String (f String)
-  -> p Value (f Value)
-_String =
-  prism String $ \ n -> case n of
-    String v -> Right v
-    _        -> Left n
-{-# INLINE _String #-}
+-- | @_Text :: Prism' Value Text@
+_Text ::
+  (Choice p, Applicative f) =>
+  p Text (f Text) ->
+  p Value (f Value)
+_Text =
+  prism Text $ \n -> case n of
+    Text v -> Right v
+    _ -> Left n
+{-# INLINE _Text #-}
 
 -- | @_Bool :: Prism' Value Bool@
-_Bool
-  :: (Choice p, Applicative f)
-  => p Bool (f Bool)
-  -> p Value (f Value)
+_Bool ::
+  (Choice p, Applicative f) =>
+  p Bool (f Bool) ->
+  p Value (f Value)
 _Bool =
-  prism Bool $ \ n -> case n of
+  prism Bool $ \n -> case n of
     Bool v -> Right v
-    _      -> Left n
+    _ -> Left n
 {-# INLINE _Bool #-}
 
 -- | @_ZonedTime :: Prism' Value Time.ZonedTime@
-_ZonedTime
-  :: (Choice p, Applicative f)
-  => p Time.ZonedTime (f Time.ZonedTime)
-  -> p Value (f Value)
+_ZonedTime ::
+  (Choice p, Applicative f) =>
+  p Time.ZonedTime (f Time.ZonedTime) ->
+  p Value (f Value)
 _ZonedTime =
-  prism ZonedTime $ \ n -> case n of
+  prism ZonedTime $ \n -> case n of
     ZonedTime v -> Right v
-    _           -> Left n
+    _ -> Left n
 {-# INLINE _ZonedTime #-}
 
 -- | @_LocalTime :: Prism' Value Time.LocalTime@
-_LocalTime
-  :: (Choice p, Applicative f)
-  => p Time.LocalTime (f Time.LocalTime)
-  -> p Value (f Value)
+_LocalTime ::
+  (Choice p, Applicative f) =>
+  p Time.LocalTime (f Time.LocalTime) ->
+  p Value (f Value)
 _LocalTime =
-  prism LocalTime $ \ n -> case n of
+  prism LocalTime $ \n -> case n of
     LocalTime v -> Right v
-    _           -> Left n
+    _ -> Left n
 {-# INLINE _LocalTime #-}
 
 -- | @_Day :: Prism' Value Time.Day@
-_Day
-  :: (Choice p, Applicative f)
-  => p Time.Day (f Time.Day)
-  -> p Value (f Value)
+_Day ::
+  (Choice p, Applicative f) =>
+  p Time.Day (f Time.Day) ->
+  p Value (f Value)
 _Day =
-  prism Day $ \ n -> case n of
+  prism Day $ \n -> case n of
     Day v -> Right v
-    _     -> Left n
+    _ -> Left n
 {-# INLINE _Day #-}
 
 -- | @_TimeOfDay :: Prism' Value Time.TimeOfDay@
-_TimeOfDay
-  :: (Choice p, Applicative f)
-  => p Time.TimeOfDay (f Time.TimeOfDay)
-  -> p Value (f Value)
+_TimeOfDay ::
+  (Choice p, Applicative f) =>
+  p Time.TimeOfDay (f Time.TimeOfDay) ->
+  p Value (f Value)
 _TimeOfDay =
-  prism TimeOfDay $ \ n -> case n of
+  prism TimeOfDay $ \n -> case n of
     TimeOfDay v -> Right v
-    _           -> Left n
+    _ -> Left n
 {-# INLINE _TimeOfDay #-}
+
+-- | @_Table' :: Prism' (Value' a) (a, Table' a)@
+_Table' ::
+  (Choice p, Applicative f) =>
+  p (a, Table' a) (f (a, Table' a)) ->
+  p (Value' a) (f (Value' a))
+_Table' =
+  prism (uncurry Table') $ \n -> case n of
+    Table' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Table' #-}
+
+-- | @_Array' :: Prism' (Value' a) (a, [Value' a])@
+_List' ::
+  (Choice p, Applicative f) =>
+  p (a, [Value' a]) (f (a, [Value' a])) ->
+  p (Value' a) (f (Value' a))
+_List' =
+  prism (uncurry List') $ \n -> case n of
+    List' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _List' #-}
+
+-- | @_Double' :: Prism' (Value' a) (a, Double)@
+_Double' ::
+  (Choice p, Applicative f) =>
+  p (a, Double) (f (a, Double)) ->
+  p (Value' a) (f (Value' a))
+_Double' =
+  prism (uncurry Double') $ \n -> case n of
+    Double' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Double' #-}
+
+-- | @_Integer' :: Prism' (Value' a) (a, Integer)@
+_Integer' ::
+  (Choice p, Applicative f) =>
+  p (a, Integer) (f (a, Integer)) ->
+  p (Value' a) (f (Value' a))
+_Integer' =
+  prism (uncurry Integer') $ \n -> case n of
+    Integer' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Integer' #-}
+
+-- | @_Text' :: Prism' (Value' a) (a, Text)@
+_Text' ::
+  (Choice p, Applicative f) =>
+  p (a, Text) (f (a, Text)) ->
+  p (Value' a) (f (Value' a))
+_Text' =
+  prism (uncurry Text') $ \n -> case n of
+    Text' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Text' #-}
+
+-- | @_Bool' :: Prism' (Value' a) (a, Bool)@
+_Bool' ::
+  (Choice p, Applicative f) =>
+  p (a, Bool) (f (a, Bool)) ->
+  p (Value' a) (f (Value' a))
+_Bool' =
+  prism (uncurry Bool') $ \n -> case n of
+    Bool' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Bool' #-}
+
+-- | @_ZonedTime' :: Prism' (Value' a) (a, Time.ZonedTime)@
+_ZonedTime' ::
+  (Choice p, Applicative f) =>
+  p (a, Time.ZonedTime) (f (a, Time.ZonedTime)) ->
+  p (Value' a) (f (Value' a))
+_ZonedTime' =
+  prism (uncurry ZonedTime') $ \n -> case n of
+    ZonedTime' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _ZonedTime' #-}
+
+-- | @_LocalTime' :: Prism' (Value' a) (a, Time.LocalTime)@
+_LocalTime' ::
+  (Choice p, Applicative f) =>
+  p (a, Time.LocalTime) (f (a, Time.LocalTime)) ->
+  p (Value' a) (f (Value' a))
+_LocalTime' =
+  prism (uncurry LocalTime') $ \n -> case n of
+    LocalTime' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _LocalTime' #-}
+
+-- | @_Day' :: Prism' (Value' a) (a, Time.Day)@
+_Day' ::
+  (Choice p, Applicative f) =>
+  p (a, Time.Day) (f (a, Time.Day)) ->
+  p (Value' a) (f (Value' a))
+_Day' =
+  prism (uncurry Day') $ \n -> case n of
+    Day' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _Day' #-}
+
+-- | @_TimeOfDay' :: Prism' (Value' a) (a, Time.TimeOfDay)@
+_TimeOfDay' ::
+  (Choice p, Applicative f) =>
+  p (a, Time.TimeOfDay) (f (a, Time.TimeOfDay)) ->
+  p (Value' a) (f (Value' a))
+_TimeOfDay' =
+  prism (uncurry TimeOfDay') $ \n -> case n of
+    TimeOfDay' a v -> Right (a, v)
+    _ -> Left n
+{-# INLINE _TimeOfDay' #-}
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Main (main) where
+
+import Control.Monad (unless)
+import Data.Map.Strict (Map)
+import Data.Text (Text)
+import qualified Data.Text.IO as TIO
+import Lens.Family2
+import Lens.Family2.Stock (at, just_, _2)
+import Lens.Family2.Unchecked (adapter)
+import System.Exit (exitFailure)
+import Test.Dwergaz
+import Toml (Table, Table' (..), Value, Value')
+import qualified Toml
+import Toml.Lens
+
+allEqual :: (Eq a) => [a] -> Bool
+allEqual (x : xs) = all (== x) xs
+allEqual [] = error "allEqual: empty list"
+
+table :: Adapter' (Table' a) (Map Text (a, Value' a))
+table = adapter unTable MkTable
+  where
+    unTable (MkTable t) = t
+
+valueAt ::
+  (Applicative f) =>
+  Text ->
+  (Value -> f Value) ->
+  Table ->
+  f Table
+valueAt k = under table . at k . just_ . _2
+
+mapAt ::
+  (Applicative f) =>
+  Text ->
+  (Table -> f Table) ->
+  Table ->
+  f Table
+mapAt k = valueAt k . _Table
+
+testTableKey :: Table -> Test
+testTableKey kv =
+  Expect
+    "'key' from 'table' == Just \"value\""
+    (==)
+    expected
+    actual
+  where
+    expected = Just "value"
+    actual = kv ^? mapAt "table" . valueAt "key" . _Text
+
+testTableZoo :: Table -> Test
+testTableZoo kv =
+  Expect
+    "'zoo' from 'table' == Nothing"
+    (==)
+    expected
+    actual
+  where
+    expected = Nothing
+    actual = kv ^? mapAt "table" . valueAt "zoo" . _Text
+
+testTableSubtableKey :: Table -> Test
+testTableSubtableKey kv =
+  Expect
+    "'key' from 'subtable' from 'table' == Just \"another value\""
+    (==)
+    expected
+    actual
+  where
+    expected = Just "another value"
+    actual = kv ^? mapAt "table" . mapAt "subtable" . valueAt "key" . _Text
+
+testTableInlineNameFirst :: Table -> Test
+testTableInlineNameFirst kv =
+  Expect
+    "'first' from 'name' from 'inline' from 'table' == \"Tom\""
+    (==)
+    expected
+    actual
+  where
+    expected = Just "Tom"
+    actual = kv ^? mapAt "table" . mapAt "inline" . mapAt "name" . valueAt "first" . _Text
+
+testTableInlinePointY :: Table -> Test
+testTableInlinePointY kv =
+  Expect
+    "'y' from 'point' from 'inline' from 'table' == Just 2"
+    (==)
+    expected
+    actual
+  where
+    expected = Just 2
+    actual = kv ^? mapAt "table" . mapAt "inline" . mapAt "point" . valueAt "y" . _Integer
+
+testStringBasicBasic :: Table -> Test
+testStringBasicBasic kv =
+  Expect
+    "'basic' from 'basic' from 'string' == <some escaped nonsense>"
+    (==)
+    expected
+    actual
+  where
+    expected = Just "I'm a string. \"You can quote me\". Name\tJos\233\nLocation\tSF."
+    actual = kv ^? mapAt "string" . mapAt "basic" . valueAt "basic" . _Text
+
+testStringMultiline :: Table -> Test
+testStringMultiline kv =
+  Predicate
+    "'key1', 'key2', and 'key3' from 'multiline' from 'string' are all the same"
+    allEqual
+    [actual1, actual2, actual3]
+  where
+    actual1 = kv ^? mapAt "string" . mapAt "multiline" . valueAt "key1" . _Text
+    actual2 = kv ^? mapAt "string" . mapAt "multiline" . valueAt "key2" . _Text
+    actual3 = kv ^? mapAt "string" . mapAt "multiline" . valueAt "key3" . _Text
+
+testStringMultilineContinued :: Table -> Test
+testStringMultilineContinued kv =
+  Predicate
+    "'key1', 'key2', and 'key3' from 'continued' from 'multiline' from 'string' are all the same"
+    allEqual
+    [actual1, actual2, actual3]
+  where
+    actual1 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . valueAt "key1" . _Text
+    actual2 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . valueAt "key2" . _Text
+    actual3 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . valueAt "key3" . _Text
+
+testArrayKey1 :: Table -> Test
+testArrayKey1 kv =
+  Expect
+    "'key1' from 'array' == [1, 2, 3]"
+    (==)
+    expected
+    actual
+  where
+    expected = [1, 2, 3]
+    actual = kv ^.. mapAt "array" . valueAt "key1" . _List . traverse . _Integer
+
+runTests :: Table -> [Result]
+runTests kv = runTest . ($ kv) <$> tests
+  where
+    tests =
+      [ testTableKey,
+        testTableZoo,
+        testTableSubtableKey,
+        testTableInlineNameFirst,
+        testTableInlinePointY,
+        testStringBasicBasic,
+        testStringMultiline,
+        testStringMultilineContinued,
+        testArrayKey1
+      ]
+
+readTomlFile :: String -> IO Table
+readTomlFile file = TIO.readFile file >>= parse >>= handleError
+  where
+    parse = pure . Toml.parse
+    handleError = either (error . show) (pure . Toml.forgetTableAnns)
+
+main :: IO ()
+main = do
+  ex <- readTomlFile "./example/example-v0.4.0.toml"
+  let rs = runTests ex
+  mapM_ print rs
+  unless (all isPassed rs) exitFailure
diff --git a/tests/HLint.hs b/tests/HLint.hs
deleted file mode 100644
--- a/tests/HLint.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module Main (main) where
-
-import           Control.Monad
-import           Language.Haskell.HLint
-import           System.Environment
-import           System.Exit
-
-main :: IO ()
-main = do
-  args  <- getArgs
-  hints <- hlint $ ["src", "tests"] ++ args
-  unless (null hints) exitFailure
diff --git a/tests/Main.hs b/tests/Main.hs
deleted file mode 100644
--- a/tests/Main.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-module Main (main) where
-
-import           Control.Monad      (unless)
-import           System.Exit        (exitFailure)
-
-import           Lens.Family2
-import           Lens.Family2.Stock (at, just_)
-import           Test.Dwergaz
-import qualified Toml
-import           Toml               (Table, Value)
-
-import           Toml.Lens
-
-
-allEqual :: Eq a => [a] -> Bool
-allEqual (x:xs) = all (== x) xs
-allEqual []     = error "allEqual: empty list"
-
-mapAt
-  :: Applicative f
-  => String
-  -> (Table -> f Table)
-  -> Table
-  -> f Table
-mapAt k = at k . just_ . _Table
-
-arrayAt
-  :: Applicative f
-  => String
-  -> ([Value] -> f [Value])
-  -> Table
-  -> f Table
-arrayAt k = at k . just_ . _Array
-
-testTableKey :: Table -> Test
-testTableKey kv
-  = Expect "'key' from 'table' == Just \"value\""
-           (==) expected actual
-  where
-    expected = Just "value"
-    actual   = kv ^? mapAt "table" . at "key" . just_ . _String
-
-testTableZoo :: Table -> Test
-testTableZoo kv
-  = Expect "'zoo' from 'table' == Nothing"
-           (==) expected actual
-  where
-    expected = Nothing
-    actual   = kv ^? mapAt "table" . at "zoo" . just_ . _String
-
-testTableSubtableKey :: Table -> Test
-testTableSubtableKey kv
-  = Expect "'key' from 'subtable' from 'table' == Just \"another value\""
-           (==) expected actual
-  where
-    expected = Just "another value"
-    actual   = kv ^? mapAt "table" . mapAt "subtable" . at "key" . just_ . _String
-
-testTableInlineNameFirst :: Table -> Test
-testTableInlineNameFirst kv
-  = Expect "'first' from 'name' from 'inline' from 'table' == \"Tom\""
-           (==) expected actual
-  where
-    expected = Just "Tom"
-    actual   = kv ^? mapAt "table" . mapAt "inline" . mapAt "name" . at "first" . just_ . _String
-
-testTableInlinePointY :: Table -> Test
-testTableInlinePointY kv
-  = Expect "'y' from 'point' from 'inline' from 'table' == Just 2"
-           (==) expected actual
-  where
-    expected = Just 2
-    actual   = kv ^? mapAt "table" . mapAt "inline" . mapAt "point" . at "y" . just_ . _Integer
-
-testStringBasicBasic :: Table -> Test
-testStringBasicBasic kv
-  = Expect "'basic' from 'basic' from 'string' == <some escaped nonsense>"
-           (==) expected actual
-  where
-    expected = Just "I'm a string. \"You can quote me\". Name\tJos\233\nLocation\tSF."
-    actual   = kv ^? mapAt "string" . mapAt "basic" . at "basic" . just_ . _String
-
-testStringMultiline :: Table -> Test
-testStringMultiline kv
-  = Predicate "'key1', 'key2', and 'key3' from 'multiline' from 'string' are all the same"
-              allEqual
-              [actual1, actual2, actual3]
-  where
-    actual1 = kv ^? mapAt "string" . mapAt "multiline" . at "key1" . just_ . _String
-    actual2 = kv ^? mapAt "string" . mapAt "multiline" . at "key2" . just_ . _String
-    actual3 = kv ^? mapAt "string" . mapAt "multiline" . at "key3" . just_ . _String
-
-testStringMultilineContinued :: Table -> Test
-testStringMultilineContinued kv
-  = Predicate "'key1', 'key2', and 'key3' from 'continued' from 'multiline' from 'string' are all the same"
-              allEqual
-              [actual1, actual2, actual3]
-  where
-    actual1 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . at "key1" . just_ . _String
-    actual2 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . at "key2" . just_ . _String
-    actual3 = kv ^? mapAt "string" . mapAt "multiline" . mapAt "continued" . at "key3" . just_ . _String
-
-testArrayKey1 :: Table -> Test
-testArrayKey1 kv
-  = Expect "'key1' from 'array' == [1, 2, 3]"
-           (==) expected actual
-  where
-    expected = [1, 2, 3]
-    actual   = kv ^.. mapAt "array" . arrayAt "key1" . traverse . _Integer
-
-runTests :: Table -> [Result]
-runTests kv = runTest . ($ kv) <$> tests
-  where
-    tests = [ testTableKey
-            , testTableZoo
-            , testTableSubtableKey
-            , testTableInlineNameFirst
-            , testTableInlinePointY
-            , testStringBasicBasic
-            , testStringMultiline
-            , testStringMultilineContinued
-            , testArrayKey1
-            ]
-
-readTomlFile :: String -> IO Table
-readTomlFile file = readFile file >>= parse >>= handleError
-  where
-    parse       = pure . Toml.parse
-    handleError = either (error . show) pure
-
-main :: IO ()
-main =  do
-  ex <- readTomlFile "./example/example-v0.4.0.toml"
-  let rs = runTests ex
-  mapM_ print rs
-  unless (all isPassed rs) exitFailure
