diff --git a/core/HaskellWorks/Data/String.hs b/core/HaskellWorks/Data/String.hs
new file mode 100644
--- /dev/null
+++ b/core/HaskellWorks/Data/String.hs
@@ -0,0 +1,8 @@
+module HaskellWorks.Data.String
+  ( unlines
+  , unwords
+  , words
+  , lines
+  ) where
+
+import           Data.String
diff --git a/core/HaskellWorks/Error.hs b/core/HaskellWorks/Error.hs
--- a/core/HaskellWorks/Error.hs
+++ b/core/HaskellWorks/Error.hs
@@ -1,8 +1,8 @@
 module HaskellWorks.Error
-  ( onLeft
-  , onNothing
-  , onLeftM
-  , onNothingM
+  ( onLeft,
+    onNothing,
+    onLeftM,
+    onNothingM,
   ) where
 
 import           HaskellWorks.Polysemy.Prelude
diff --git a/core/HaskellWorks/Error/Types.hs b/core/HaskellWorks/Error/Types.hs
--- a/core/HaskellWorks/Error/Types.hs
+++ b/core/HaskellWorks/Error/Types.hs
@@ -1,8 +1,8 @@
 {-# LANGUAGE DeriveGeneric #-}
 
 module HaskellWorks.Error.Types
-  ( GenericError(..)
-  , TimedOut(..)
+  ( GenericError(..),
+    TimedOut(..),
   ) where
 
 import           HaskellWorks.Polysemy.Prelude
diff --git a/core/HaskellWorks/IO/Network/Port.hs b/core/HaskellWorks/IO/Network/Port.hs
--- a/core/HaskellWorks/IO/Network/Port.hs
+++ b/core/HaskellWorks/IO/Network/Port.hs
@@ -1,9 +1,9 @@
 {-# LANGUAGE TypeApplications #-}
 
 module HaskellWorks.IO.Network.Port
-  ( randomPort
-  , reserveRandomPort
-  , portInUse
+  ( randomPort,
+    reserveRandomPort,
+    portInUse,
   ) where
 
 import           Control.Exception
diff --git a/core/HaskellWorks/IO/Network/Socket.hs b/core/HaskellWorks/IO/Network/Socket.hs
--- a/core/HaskellWorks/IO/Network/Socket.hs
+++ b/core/HaskellWorks/IO/Network/Socket.hs
@@ -2,11 +2,11 @@
 {-# LANGUAGE TypeApplications    #-}
 
 module HaskellWorks.IO.Network.Socket
-  ( doesSocketExist
-  , isPortOpen
-  , canConnect
-  , listenOn
-  , allocateRandomPorts
+  ( doesSocketExist,
+    isPortOpen,
+    canConnect,
+    listenOn,
+    allocateRandomPorts,
   ) where
 
 import           Control.Exception  (IOException, handle)
diff --git a/core/HaskellWorks/IO/Process.hs b/core/HaskellWorks/IO/Process.hs
--- a/core/HaskellWorks/IO/Process.hs
+++ b/core/HaskellWorks/IO/Process.hs
@@ -1,6 +1,6 @@
 module HaskellWorks.IO.Process
-  ( maybeWaitForProcess
-  , waitSecondsForProcess
+  ( maybeWaitForProcess,
+    waitSecondsForProcess,
   ) where
 
 import           Control.Concurrent       as IO
diff --git a/core/HaskellWorks/Polysemy/Cabal.hs b/core/HaskellWorks/Polysemy/Cabal.hs
--- a/core/HaskellWorks/Polysemy/Cabal.hs
+++ b/core/HaskellWorks/Polysemy/Cabal.hs
@@ -1,7 +1,7 @@
 module HaskellWorks.Polysemy.Cabal
-  ( findDefaultPlanJsonFile
-  , getPlanJsonFile
-  , binDist
+  ( findDefaultPlanJsonFile,
+    getPlanJsonFile,
+    binDist,
   ) where
 
 import           HaskellWorks.Polysemy.Cabal.Types
diff --git a/core/HaskellWorks/Polysemy/Cabal/Types.hs b/core/HaskellWorks/Polysemy/Cabal/Types.hs
--- a/core/HaskellWorks/Polysemy/Cabal/Types.hs
+++ b/core/HaskellWorks/Polysemy/Cabal/Types.hs
@@ -2,8 +2,8 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module HaskellWorks.Polysemy.Cabal.Types
-  ( Plan(..)
-  , Component(..)
+  ( Plan(..),
+    Component(..),
   ) where
 
 import           Control.Applicative
diff --git a/core/HaskellWorks/Polysemy/Data/Aeson.hs b/core/HaskellWorks/Polysemy/Data/Aeson.hs
--- a/core/HaskellWorks/Polysemy/Data/Aeson.hs
+++ b/core/HaskellWorks/Polysemy/Data/Aeson.hs
@@ -1,6 +1,6 @@
 module HaskellWorks.Polysemy.Data.Aeson
-  ( AesonDecodeError(..)
-  , aesonDecode
+  ( AesonDecodeError(..),
+    aesonDecode,
   ) where
 
 import qualified Data.Aeson                                 as Aeson
diff --git a/core/HaskellWorks/Polysemy/Data/Text.hs b/core/HaskellWorks/Polysemy/Data/Text.hs
--- a/core/HaskellWorks/Polysemy/Data/Text.hs
+++ b/core/HaskellWorks/Polysemy/Data/Text.hs
@@ -1,143 +1,143 @@
 module HaskellWorks.Polysemy.Data.Text
-  ( Text
+  ( Text,
 
-  -- * Creation and elimination
-  , pack
-  , unpack
-  , singleton
-  , empty
+    -- * Creation and elimination
+    pack,
+    unpack,
+    singleton,
+    empty,
 
-  -- * Basic interface
-  , length
-  , compareLength
-  , null
+    -- * Basic interface
+    length,
+    compareLength,
+    null,
 
-  -- * Transformations
-  , map
-  , intercalate
-  , intersperse
-  , transpose
-  , reverse
-  , replace
+    -- * Transformations
+    map,
+    intercalate,
+    intersperse,
+    transpose,
+    reverse,
+    replace,
 
-  -- ** Case conversion
-  -- $case
-  , toCaseFold
-  , toLower
-  , toUpper
-  , toTitle
+    -- ** Case conversion
+    -- $case
+    toCaseFold,
+    toLower,
+    toUpper,
+    toTitle,
 
-  -- ** Justification
-  , justifyLeft
-  , justifyRight
-  , center
+    -- ** Justification
+    justifyLeft,
+    justifyRight,
+    center,
 
-  -- * Folds
-  , foldl
-  , foldl'
-  , foldl1
-  , foldl1'
-  , foldr
-  , foldr'
-  , foldr1
+    -- * Folds
+    foldl,
+    foldl',
+    foldl1,
+    foldl1',
+    foldr,
+    foldr',
+    foldr1,
 
-  -- ** Special folds
-  , concat
-  , concatMap
-  , any
-  , all
-  , maximum
-  , minimum
-  , isAscii
+    -- ** Special folds
+    concat,
+    concatMap,
+    any,
+    all,
+    maximum,
+    minimum,
+    isAscii,
 
-  -- * Construction
+    -- * Construction
 
-  -- ** Scans
-  , scanl
-  , scanl1
-  , scanr
-  , scanr1
+    -- ** Scans
+    scanl,
+    scanl1,
+    scanr,
+    scanr1,
 
-  -- ** Accumulating maps
-  , mapAccumL
-  , mapAccumR
+    -- ** Accumulating maps
+    mapAccumL,
+    mapAccumR,
 
-  -- ** Generation and unfolding
-  , replicate
-  , unfoldr
-  , unfoldrN
+    -- ** Generation and unfolding
+    replicate,
+    unfoldr,
+    unfoldrN,
 
-  -- * Substrings
+    -- * Substrings
 
-  -- ** Breaking strings
-  , take
-  , takeEnd
-  , drop
-  , dropEnd
-  , takeWhile
-  , takeWhileEnd
-  , dropWhile
-  , dropWhileEnd
-  , dropAround
-  , strip
-  , stripStart
-  , stripEnd
-  , splitAt
-  , breakOn
-  , breakOnEnd
-  , break
-  , span
-  , spanM
-  , spanEndM
-  , group
-  , groupBy
-  , inits
-  , tails
+    -- ** Breaking strings
+    take,
+    takeEnd,
+    drop,
+    dropEnd,
+    takeWhile,
+    takeWhileEnd,
+    dropWhile,
+    dropWhileEnd,
+    dropAround,
+    strip,
+    stripStart,
+    stripEnd,
+    splitAt,
+    breakOn,
+    breakOnEnd,
+    break,
+    span,
+    spanM,
+    spanEndM,
+    group,
+    groupBy,
+    inits,
+    tails,
 
-  -- ** Breaking into many substrings
-  -- $split
-  , splitOn
-  , split
-  , chunksOf
+    -- ** Breaking into many substrings
+    -- $split
+    splitOn,
+    split,
+    chunksOf,
 
-  -- ** Breaking into lines and words
-  , lines
-  --, lines'
-  , words
-  , unlines
-  , unwords
+    -- ** Breaking into lines and words
+    lines,
+    --, lines'
+    words,
+    unlines,
+    unwords,
 
-  -- * Predicates
-  , isPrefixOf
-  , isSuffixOf
-  , isInfixOf
+    -- * Predicates
+    isPrefixOf,
+    isSuffixOf,
+    isInfixOf,
 
-  -- ** View patterns
-  , stripPrefix
-  , stripSuffix
-  , commonPrefixes
+    -- ** View patterns
+    stripPrefix,
+    stripSuffix,
+    commonPrefixes,
 
-  -- * Searching
-  , filter
-  , breakOnAll
-  , find
-  , elem
-  , partition
+    -- * Searching
+    filter,
+    breakOnAll,
+    find,
+    elem,
+    partition,
 
-  -- , findSubstring
+    -- , findSubstring
 
-  -- * Indexing
-  -- $index
-  , index
-  , findIndex
-  , count
+    -- * Indexing
+    -- $index
+    index,
+    findIndex,
+    count,
 
-  -- * Zipping
-  , zip
-  , zipWith
+    -- * Zipping
+    zip,
+    zipWith,
 
-  -- * File reading
-  , readFile
+    -- * File reading
+    readFile,
 
   ) where
 
diff --git a/core/HaskellWorks/Polysemy/Data/Text/Lazy.hs b/core/HaskellWorks/Polysemy/Data/Text/Lazy.hs
--- a/core/HaskellWorks/Polysemy/Data/Text/Lazy.hs
+++ b/core/HaskellWorks/Polysemy/Data/Text/Lazy.hs
@@ -1,140 +1,140 @@
 module HaskellWorks.Polysemy.Data.Text.Lazy
-  ( LT.Text
+  ( LT.Text,
 
-  -- * Creation and elimination
-  , LT.pack
-  , LT.unpack
-  , LT.singleton
-  , LT.empty
+    -- * Creation and elimination
+    LT.pack,
+    LT.unpack,
+    LT.singleton,
+    LT.empty,
 
-  -- * Basic interface
-  , LT.length
-  , LT.compareLength
+    -- * Basic interface
+    LT.length,
+    LT.compareLength,
 
-  -- * Transformations
-  , LT.map
-  , LT.intercalate
-  , LT.intersperse
-  , LT.transpose
-  , LT.reverse
-  , LT.replace
+    -- * Transformations
+    LT.map,
+    LT.intercalate,
+    LT.intersperse,
+    LT.transpose,
+    LT.reverse,
+    LT.replace,
 
-  -- ** Case conversion
-  -- $case
-  , LT.toCaseFold
-  , LT.toLower
-  , LT.toUpper
-  , LT.toTitle
+    -- ** Case conversion
+    -- $case
+    LT.toCaseFold,
+    LT.toLower,
+    LT.toUpper,
+    LT.toTitle,
 
-  -- ** Justification
-  , LT.justifyLeft
-  , LT.justifyRight
-  , LT.center
+    -- ** Justification
+    LT.justifyLeft,
+    LT.justifyRight,
+    LT.center,
 
-  -- * Folds
-  , LT.foldl
-  , LT.foldl'
-  , LT.foldl1
-  , LT.foldl1'
-  , LT.foldr
-  , LT.foldr1
+    -- * Folds
+    LT.foldl,
+    LT.foldl',
+    LT.foldl1,
+    LT.foldl1',
+    LT.foldr,
+    LT.foldr1,
 
-  -- ** Special folds
-  , LT.concat
-  , LT.concatMap
-  , LT.any
-  , LT.all
-  , LT.maximum
-  , LT.minimum
-  , LT.isAscii
+    -- ** Special folds
+    LT.concat,
+    LT.concatMap,
+    LT.any,
+    LT.all,
+    LT.maximum,
+    LT.minimum,
+    LT.isAscii,
 
-  -- * Construction
+    -- * Construction
 
-  -- ** Scans
-  , LT.scanl
-  , LT.scanl1
-  , LT.scanr
-  , LT.scanr1
+    -- ** Scans
+    LT.scanl,
+    LT.scanl1,
+    LT.scanr,
+    LT.scanr1,
 
-  -- ** Accumulating maps
-  , LT.mapAccumL
-  , LT.mapAccumR
+    -- ** Accumulating maps
+    LT.mapAccumL,
+    LT.mapAccumR,
 
-  -- ** Generation and unfolding
-  , LT.replicate
-  , LT.unfoldr
-  , LT.unfoldrN
+    -- ** Generation and unfolding
+    LT.replicate,
+    LT.unfoldr,
+    LT.unfoldrN,
 
-  -- * Substrings
+    -- * Substrings
 
-  -- ** Breaking strings
-  , LT.take
-  , LT.takeEnd
-  , LT.drop
-  , LT.dropEnd
-  , LT.takeWhile
-  , LT.takeWhileEnd
-  , LT.dropWhile
-  , LT.dropWhileEnd
-  , LT.dropAround
-  , LT.strip
-  , LT.stripStart
-  , LT.stripEnd
-  , LT.splitAt
-  , LT.breakOn
-  , LT.breakOnEnd
-  , LT.break
-  , LT.span
-  , LT.spanM
-  , LT.spanEndM
-  , LT.group
-  , LT.groupBy
-  , LT.inits
-  , LT.tails
+    -- ** Breaking strings
+    LT.take,
+    LT.takeEnd,
+    LT.drop,
+    LT.dropEnd,
+    LT.takeWhile,
+    LT.takeWhileEnd,
+    LT.dropWhile,
+    LT.dropWhileEnd,
+    LT.dropAround,
+    LT.strip,
+    LT.stripStart,
+    LT.stripEnd,
+    LT.splitAt,
+    LT.breakOn,
+    LT.breakOnEnd,
+    LT.break,
+    LT.span,
+    LT.spanM,
+    LT.spanEndM,
+    LT.group,
+    LT.groupBy,
+    LT.inits,
+    LT.tails,
 
-  -- ** Breaking into many substrings
-  -- $split
-  , LT.splitOn
-  , LT.split
-  , LT.chunksOf
+    -- ** Breaking into many substrings
+    -- $split
+    LT.splitOn,
+    LT.split,
+    LT.chunksOf,
 
-  -- ** Breaking into lines and words
-  , LT.lines
-  --, LT.lines'
-  , LT.words
-  , LT.unlines
-  , LT.unwords
+    -- ** Breaking into lines and words
+    LT.lines,
+    --, LT.lines'
+    LT.words,
+    LT.unlines,
+    LT.unwords,
 
-  -- * Predicates
-  , LT.isPrefixOf
-  , LT.isSuffixOf
-  , LT.isInfixOf
+    -- * Predicates
+    LT.isPrefixOf,
+    LT.isSuffixOf,
+    LT.isInfixOf,
 
-  -- ** View patterns
-  , LT.stripPrefix
-  , LT.stripSuffix
-  , LT.commonPrefixes
+    -- ** View patterns
+    LT.stripPrefix,
+    LT.stripSuffix,
+    LT.commonPrefixes,
 
-  -- * Searching
-  , LT.filter
-  , LT.breakOnAll
-  , LT.find
-  , LT.elem
-  , LT.partition
+    -- * Searching
+    LT.filter,
+    LT.breakOnAll,
+    LT.find,
+    LT.elem,
+    LT.partition,
 
-  -- , LT.findSubstring
+    -- , LT.findSubstring
 
-  -- * Indexing
-  -- $index
-  , LT.index
-  , LT.count
+    -- * Indexing
+    -- $index
+    LT.index,
+    LT.count,
 
-  -- * Zipping
-  , LT.zip
-  , LT.zipWith
+    -- * Zipping
+    LT.zip,
+    LT.zipWith,
 
-  -- * File reading
-  , readFile
+    -- * File reading
+    readFile,
 
   ) where
 
diff --git a/core/HaskellWorks/Polysemy/Data/Text/Strict.hs b/core/HaskellWorks/Polysemy/Data/Text/Strict.hs
--- a/core/HaskellWorks/Polysemy/Data/Text/Strict.hs
+++ b/core/HaskellWorks/Polysemy/Data/Text/Strict.hs
@@ -1,141 +1,141 @@
 module HaskellWorks.Polysemy.Data.Text.Strict
-  ( T.Text
+  ( T.Text,
 
-  -- * Creation and elimination
-  , T.pack
-  , T.unpack
-  , T.singleton
-  , T.empty
+    -- * Creation and elimination
+    T.pack,
+    T.unpack,
+    T.singleton,
+    T.empty,
 
-  -- * Basic interface
-  , T.length
-  , T.compareLength
-  , T.null
+    -- * Basic interface
+    T.length,
+    T.compareLength,
+    T.null,
 
-  -- * Transformations
-  , T.map
-  , T.intercalate
-  , T.intersperse
-  , T.transpose
-  , T.reverse
-  , T.replace
+    -- * Transformations
+    T.map,
+    T.intercalate,
+    T.intersperse,
+    T.transpose,
+    T.reverse,
+    T.replace,
 
-  -- ** Case conversion
-  -- $case
-  , T.toCaseFold
-  , T.toLower
-  , T.toUpper
-  , T.toTitle
+    -- ** Case conversion
+    -- $case
+    T.toCaseFold,
+    T.toLower,
+    T.toUpper,
+    T.toTitle,
 
-  -- ** Justification
-  , T.justifyLeft
-  , T.justifyRight
-  , T.center
+    -- ** Justification
+    T.justifyLeft,
+    T.justifyRight,
+    T.center,
 
-  -- * Folds
-  , T.foldl
-  , T.foldl'
-  , T.foldl1
-  , T.foldl1'
-  , T.foldr
-  , T.foldr'
-  , T.foldr1
+    -- * Folds
+    T.foldl,
+    T.foldl',
+    T.foldl1,
+    T.foldl1',
+    T.foldr,
+    T.foldr',
+    T.foldr1,
 
-  -- ** Special folds
-  , T.concat
-  , T.concatMap
-  , T.any
-  , T.all
-  , T.maximum
-  , T.minimum
-  , T.isAscii
+    -- ** Special folds
+    T.concat,
+    T.concatMap,
+    T.any,
+    T.all,
+    T.maximum,
+    T.minimum,
+    T.isAscii,
 
-  -- * Construction
+    -- * Construction
 
-  -- ** Scans
-  , T.scanl
-  , T.scanl1
-  , T.scanr
-  , T.scanr1
+    -- ** Scans
+    T.scanl,
+    T.scanl1,
+    T.scanr,
+    T.scanr1,
 
-  -- ** Accumulating maps
-  , T.mapAccumL
-  , T.mapAccumR
+    -- ** Accumulating maps
+    T.mapAccumL,
+    T.mapAccumR,
 
-  -- ** Generation and unfolding
-  , T.replicate
-  , T.unfoldr
-  , T.unfoldrN
+    -- ** Generation and unfolding
+    T.replicate,
+    T.unfoldr,
+    T.unfoldrN,
 
-  -- * Substrings
+    -- * Substrings
 
-  -- ** Breaking strings
-  , T.take
-  , T.takeEnd
-  , T.drop
-  , T.dropEnd
-  , T.takeWhile
-  , T.takeWhileEnd
-  , T.dropWhile
-  , T.dropWhileEnd
-  , T.dropAround
-  , T.strip
-  , T.stripStart
-  , T.stripEnd
-  , T.splitAt
-  , T.breakOn
-  , T.breakOnEnd
-  , T.break
-  , T.span
-  , T.spanM
-  , T.spanEndM
-  , T.group
-  , T.groupBy
-  , T.inits
-  , T.tails
+    -- ** Breaking strings
+    T.take,
+    T.takeEnd,
+    T.drop,
+    T.dropEnd,
+    T.takeWhile,
+    T.takeWhileEnd,
+    T.dropWhile,
+    T.dropWhileEnd,
+    T.dropAround,
+    T.strip,
+    T.stripStart,
+    T.stripEnd,
+    T.splitAt,
+    T.breakOn,
+    T.breakOnEnd,
+    T.break,
+    T.span,
+    T.spanM,
+    T.spanEndM,
+    T.group,
+    T.groupBy,
+    T.inits,
+    T.tails,
 
-  -- ** Breaking into many substrings
-  -- $split
-  , T.splitOn
-  , T.split
-  , T.chunksOf
+    -- ** Breaking into many substrings
+    -- $split
+    T.splitOn,
+    T.split,
+    T.chunksOf,
 
-  -- ** Breaking into lines and words
-  , T.lines
-  --, T.lines'
-  , T.words
-  , T.unlines
-  , T.unwords
+    -- ** Breaking into lines and words
+    T.lines,
+    --, T.lines'
+    T.words,
+    T.unlines,
+    T.unwords,
 
-  -- * Predicates
-  , T.isPrefixOf
-  , T.isSuffixOf
-  , T.isInfixOf
+    -- * Predicates
+    T.isPrefixOf,
+    T.isSuffixOf,
+    T.isInfixOf,
 
-  -- ** View patterns
-  , T.stripPrefix
-  , T.stripSuffix
-  , T.commonPrefixes
+    -- ** View patterns
+    T.stripPrefix,
+    T.stripSuffix,
+    T.commonPrefixes,
 
-  -- * Searching
-  , T.filter
-  , T.breakOnAll
-  , T.find
-  , T.elem
-  , T.partition
+    -- * Searching
+    T.filter,
+    T.breakOnAll,
+    T.find,
+    T.elem,
+    T.partition,
 
-  -- * Indexing
-  -- $index
-  , T.index
-  , T.findIndex
-  , T.count
+    -- * Indexing
+    -- $index
+    T.index,
+    T.findIndex,
+    T.count,
 
-  -- * Zipping
-  , T.zip
-  , T.zipWith
+    -- * Zipping
+    T.zip,
+    T.zipWith,
 
-  -- * File reading
-  , readFile
+    -- * File reading
+    readFile,
 
   ) where
 
diff --git a/core/HaskellWorks/Polysemy/Error.hs b/core/HaskellWorks/Polysemy/Error.hs
--- a/core/HaskellWorks/Polysemy/Error.hs
+++ b/core/HaskellWorks/Polysemy/Error.hs
@@ -1,9 +1,9 @@
 module HaskellWorks.Polysemy.Error
-  ( module HaskellWorks.Error
-  , trap
-  , trap_
-  , embedRunExceptT
-  , embedThrowExceptT
+  ( module HaskellWorks.Error,
+    trap,
+    trap_,
+    embedRunExceptT,
+    embedThrowExceptT,
   ) where
 
 import           Control.Monad.Except
diff --git a/core/HaskellWorks/Polysemy/FilePath.hs b/core/HaskellWorks/Polysemy/FilePath.hs
--- a/core/HaskellWorks/Polysemy/FilePath.hs
+++ b/core/HaskellWorks/Polysemy/FilePath.hs
@@ -1,6 +1,6 @@
 module HaskellWorks.Polysemy.FilePath
-  ( exeSuffix
-  , addExeSuffix
+  ( exeSuffix,
+    addExeSuffix,
   ) where
 
 import qualified HaskellWorks.Polysemy.OS      as OS
diff --git a/core/HaskellWorks/Polysemy/OS.hs b/core/HaskellWorks/Polysemy/OS.hs
--- a/core/HaskellWorks/Polysemy/OS.hs
+++ b/core/HaskellWorks/Polysemy/OS.hs
@@ -1,5 +1,5 @@
 module HaskellWorks.Polysemy.OS
-  ( isWin32
+  ( isWin32,
   ) where
 
 import           Data.Bool
diff --git a/core/HaskellWorks/Polysemy/Stack.hs b/core/HaskellWorks/Polysemy/Stack.hs
--- a/core/HaskellWorks/Polysemy/Stack.hs
+++ b/core/HaskellWorks/Polysemy/Stack.hs
@@ -1,5 +1,5 @@
 module HaskellWorks.Polysemy.Stack
-  ( callerModuleName
+  ( callerModuleName,
   ) where
 
 import           GHC.Stack                     (callStack, getCallStack,
diff --git a/core/HaskellWorks/Polysemy/String.hs b/core/HaskellWorks/Polysemy/String.hs
--- a/core/HaskellWorks/Polysemy/String.hs
+++ b/core/HaskellWorks/Polysemy/String.hs
@@ -1,5 +1,5 @@
 module HaskellWorks.Polysemy.String
-  ( ToString(..)
+  ( ToString(..),
   ) where
 
 
diff --git a/core/HaskellWorks/Polysemy/System/IO.hs b/core/HaskellWorks/Polysemy/System/IO.hs
--- a/core/HaskellWorks/Polysemy/System/IO.hs
+++ b/core/HaskellWorks/Polysemy/System/IO.hs
@@ -110,7 +110,6 @@
 import           System.IO                     (BufferMode, Handle, HandlePosn,
                                                 IOMode, NewlineMode, SeekMode,
                                                 TextEncoding)
-import           Text.Read
 
 import           Polysemy
 import           Polysemy.Error
diff --git a/core/HaskellWorks/Prelude.hs b/core/HaskellWorks/Prelude.hs
--- a/core/HaskellWorks/Prelude.hs
+++ b/core/HaskellWorks/Prelude.hs
@@ -1,158 +1,170 @@
 module HaskellWorks.Prelude
-  ( Bool(..)
-  , Char(..)
-  , Maybe(..)
-  , Either(..)
+  ( Bool(..),
+    Char(..),
+    Maybe(..),
+    Either(..),
 
-  , String
-  , Text
-  , ByteString
-  , Int
-  , Int8
-  , Int16
-  , Int32
-  , Int64
-  , Integer
-  , Word
-  , Word8
-  , Word16
-  , Word32
-  , Word64
-  , Float
-  , Double
-  , FilePath
-  , Void
+    String,
+    Text,
+    ByteString,
+    Int,
+    Int8,
+    Int16,
+    Int32,
+    Int64,
+    Integer,
+    Word,
+    Word8,
+    Word16,
+    Word32,
+    Word64,
+    Float,
+    Double,
+    FilePath,
+    Void,
 
-  , Eq(..)
-  , Ord(..)
-  , Num(..)
-  , Show(..)
-  , IsString(..)
-  , tshow
+    Eq(..),
+    Ord(..),
+    Num(..),
+    Show(..),
+    IsString(..),
+    tshow,
 
-  , bool
-  , const
+    bool,
+    const,
 
-  , absurd
-  , vacuous
+    absurd,
+    vacuous,
 
-  , either
-  , lefts
-  , rights
-  , isLeft
-  , isRight
-  , fromLeft
-  , fromRight
+    either,
+    lefts,
+    rights,
+    isLeft,
+    isRight,
+    fromLeft,
+    fromRight,
 
-  , maybe
-  , isJust
-  , isNothing
-  , fromMaybe
-  , listToMaybe
-  , maybeToList
-  , catMaybes
-  , mapMaybe
+    maybe,
+    isJust,
+    isNothing,
+    fromMaybe,
+    listToMaybe,
+    maybeToList,
+    catMaybes,
+    mapMaybe,
 
-  , fst
-  , flip
-  , snd
-  , id
-  , seq
-  , curry
-  , uncurry
-  , ($!)
-  , ($)
-  , (&)
-  , not
-  , otherwise
-  , (&&)
-  , (||)
-  , (.)
-  , (</>)
+    fst,
+    flip,
+    snd,
+    id,
+    seq,
+    curry,
+    uncurry,
+    ($!),
+    ($),
+    (&),
+    not,
+    otherwise,
+    (&&),
+    (||),
+    (.),
+    (</>),
 
-  , void
-  , mapM_
-  , forM
-  , forM_
-  , sequence_
-  , (=<<)
-  , (>=>)
-  , (<=<)
-  , forever
-  , join
-  , msum
-  , mfilter
-  , filterM
-  , foldM
-  , foldM_
-  , replicateM
-  , replicateM_
-  , guard
-  , when
-  , unless
-  , liftM
-  , liftM2
-  , liftM3
-  , liftM4
-  , liftM5
-  , ap
-  , (<$!>)
+    void,
+    mapM_,
+    forM,
+    forM_,
+    sequence_,
+    (=<<),
+    (>=>),
+    (<=<),
+    forever,
+    join,
+    msum,
+    mfilter,
+    filterM,
+    foldM,
+    foldM_,
+    replicateM,
+    replicateM_,
+    guard,
+    when,
+    unless,
+    liftM,
+    liftM2,
+    liftM3,
+    liftM4,
+    liftM5,
+    ap,
+    (<$!>),
 
-  , (<$>)
+    (<$>),
 
-  , (<**>)
-  , liftA
-  , liftA3
-  , optional
-  , asum
+    (<**>),
+    liftA,
+    liftA3,
+    optional,
+    asum,
 
-  , for_
+    for_,
 
-  , Fractional(..)
-  , Real(..)
-  , RealFrac(..)
-  , Ratio(..)
-  , Rational
-  , fromIntegral
-  , realToFrac
-  , even
-  , odd
-  , numericEnumFrom
-  , numericEnumFromThen
-  , numericEnumFromTo
-  , numericEnumFromThenTo
-  , integralEnumFrom
-  , integralEnumFromThen
-  , integralEnumFromTo
-  , integralEnumFromThenTo
-  , numerator
-  , denominator
-  , (%)
+    zip,
+    zip3,
+    zipWith,
+    zipWith3,
+    unzip,
+    unzip3,
 
-  , Monad(..)
-  , MonadFail(..)
-  , MonadPlus(..)
-  , Applicative(..)
-  , Alternative(..)
-  , Contravariant(..)
-  , Divisible(..)
-  , Functor(..)
-  , Bifunctor(..)
-  , Semigroup(..)
-  , Monoid(..)
-  , Foldable(..)
-  , Traversable(..)
+    Fractional(..),
+    Floating(..),
+    Integral(..),
+    Read(..),
+    Real(..),
+    RealFrac(..),
+    RealFloat(..),
+    Ratio(..),
+    Rational,
+    fromIntegral,
+    realToFrac,
+    even,
+    odd,
+    numericEnumFrom,
+    numericEnumFromThen,
+    numericEnumFromTo,
+    numericEnumFromThenTo,
+    integralEnumFrom,
+    integralEnumFromThen,
+    integralEnumFromTo,
+    integralEnumFromThenTo,
+    numerator,
+    denominator,
+    (%),
 
-  , IO
+    Monad(..),
+    MonadFail(..),
+    MonadPlus(..),
+    Applicative(..),
+    Alternative(..),
+    Contravariant(..),
+    Divisible(..),
+    Functor(..),
+    Bifunctor(..),
+    Semigroup(..),
+    Monoid(..),
+    Foldable(..),
+    Traversable(..),
 
-  , CallStack
-  , HasCallStack
-  , withFrozenCallStack
+    IO,
 
-  , Generic
+    CallStack,
+    HasCallStack,
+    withFrozenCallStack,
 
-  , IOException
-  , SomeException(..)
+    Generic,
+
+    IOException,
+    IOError,
+    SomeException(..),
   ) where
 
 import           Control.Applicative
@@ -160,7 +172,7 @@
 import           Control.Monad
 import           Data.Bifunctor
 import           Data.Bool
-import           Data.ByteString
+import           Data.ByteString                      (ByteString)
 import           Data.Char
 import           Data.Either
 import           Data.Eq
@@ -174,7 +186,7 @@
 import           Data.Ord
 import           Data.Semigroup
 import           Data.String
-import           Data.Text
+import           Data.Text                            (Text)
 import           Data.Traversable
 import           Data.Tuple
 import           Data.Void
@@ -184,8 +196,8 @@
 import           GHC.Num
 import           GHC.Real
 import           GHC.Stack
+import           Prelude
 import           System.FilePath
-import           Text.Show
 
 import qualified Data.Text                            as T
 
diff --git a/core/HaskellWorks/Unsafe.hs b/core/HaskellWorks/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/core/HaskellWorks/Unsafe.hs
@@ -0,0 +1,6 @@
+module HaskellWorks.Unsafe
+  ( error
+  , undefined
+  ) where
+
+import           Prelude
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
@@ -76,6 +76,7 @@
     jotYamlM_,
     jotShowIO,
     jotShowIO_,
+    jotShowRead,
     jotEach,
     jotEach_,
     jotEachM,
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Assert.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Assert.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Assert.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Assert.hs
@@ -69,11 +69,13 @@
 import qualified Prettyprinter                                  as PP
 import qualified Prettyprinter.Render.String                    as PP
 
+import           Control.Monad.IO.Class                         (MonadIO (..))
 import           HaskellWorks.Polysemy.System.IO                as IO
 import           HaskellWorks.Polysemy.System.Process
 import           Polysemy
 import           Polysemy.Error
 import           Polysemy.Log
+import qualified System.IO                                      as IOIO
 
 (===) :: forall a r. ()
   => Member Hedgehog r
@@ -277,7 +279,9 @@
       let msg = LT.unpack $ LT.decodeUtf8 $ J.encodePretty e
       failMessage GHC.callStack msg
 
-trapFailYaml :: forall e a r. ()
+trapFailYaml :: forall e a r m. ()
+  => MonadIO m
+  => Member (Embed m) r
   => Member Hedgehog r
   => HasCallStack
   => ToJSON e
@@ -289,6 +293,7 @@
     Right a -> pure a
     Left e  -> do
       let msg = T.unpack $ T.decodeUtf8 $ Y.encode e
+      embed $ liftIO $ IOIO.putStrLn msg
       failMessage GHC.callStack msg
 
 requireHead :: forall a r. ()
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
@@ -2,24 +2,24 @@
 {-# LANGUAGE TemplateHaskell #-}
 
 module HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog
-  ( Hedgehog
+  ( Hedgehog,
 
-  , assertEquals
-  , catchAssertion
-  , eval
-  , evalM
-  , evalIO
-  , writeLog
-  , failWith
-  , failWithCustom
-  , throwAssertion
-  , trapAssertion
+    assertEquals,
+    catchAssertion,
+    eval,
+    evalM,
+    evalIO,
+    writeLog,
+    failWith,
+    failWithCustom,
+    throwAssertion,
+    trapAssertion,
 
-  , hedgehogToMonadTestFinal
-  , hedgehogToPropertyFinal
-  , hedgehogToTestFinal
+    hedgehogToMonadTestFinal,
+    hedgehogToPropertyFinal,
+    hedgehogToTestFinal,
 
-  , catchExToPropertyFinal
+    catchExToPropertyFinal,
 
   ) where
 
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog/Internal.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog/Internal.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog/Internal.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog/Internal.hs
@@ -1,20 +1,20 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE StandaloneDeriving         #-}
 
 module HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog.Internal
-  ( MonadAssertion(..)
-  , failWithCustom
+  ( MonadAssertion(..),
+    failWithCustom,
   ) where
 
 import           HaskellWorks.Polysemy.Prelude
-import qualified Hedgehog                      as H
-import qualified Hedgehog.Internal.Property    as H
-import qualified Hedgehog.Internal.Source      as H
+import qualified Hedgehog                              as H
+import qualified Hedgehog.Internal.Property            as H
+import qualified Hedgehog.Internal.Source              as H
 
-import qualified Control.Monad.Trans.Except as E
-import qualified Control.Monad.Trans.Resource as IO
-import qualified Control.Monad.Trans.Resource.Internal as IO
 import           Control.Monad.Trans.Class
+import qualified Control.Monad.Trans.Except            as E
+import qualified Control.Monad.Trans.Resource          as IO
+import qualified Control.Monad.Trans.Resource.Internal as IO
 
 failWithCustom :: ()
   => H.MonadTest m
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Log.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Log.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Log.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Log.hs
@@ -1,6 +1,6 @@
 module HaskellWorks.Polysemy.Hedgehog.Effect.Log
-  ( interpretDataLogHedgehog
-  , getLogEntryCallStack
+  ( interpretDataLogHedgehog,
+    getLogEntryCallStack,
   ) where
 
 import qualified Data.Text                                      as Text
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Eval.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Eval.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Eval.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Eval.hs
@@ -1,9 +1,9 @@
 module HaskellWorks.Polysemy.Hedgehog.Eval
-  ( evalIO_
-  , evalM_
-  , eval
-  , evalM
-  , evalIO
+  ( evalIO_,
+    evalM_,
+    eval,
+    evalM,
+    evalIO,
 
   ) where
 
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Jot.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Jot.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Jot.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Jot.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE GADTs        #-}
+{-# LANGUAGE BangPatterns        #-}
+{-# LANGUAGE GADTs               #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Polysemy.Hedgehog.Jot
   ( jotShow,
@@ -19,6 +20,7 @@
     jotShowM_,
     jotShowIO,
     jotShowIO_,
+    jotShowRead,
     jotJson,
     jotJson_,
     jotJsonM,
@@ -61,6 +63,7 @@
 import qualified Data.Yaml                                      as Y
 import qualified GHC.Stack                                      as GHC
 import           HaskellWorks.Polysemy.Prelude
+import           Text.Read                                      (read)
 
 import qualified Hedgehog.Internal.Property                     as H
 import qualified Hedgehog.Internal.Source                       as H
@@ -243,6 +246,19 @@
   !a <- evalIO f
   jotWithCallstack GHC.callStack (show a)
   return ()
+
+-- | Annotate the given value.
+jotShowRead :: forall a r. ()
+  => HasCallStack
+  => Member Hedgehog r
+  => Read a
+  => Show a
+  => String
+  -> Sem r a
+jotShowRead s = GHC.withFrozenCallStack $ do
+  !a <- eval (read @a s)
+  jotWithCallstack GHC.callStack (show a)
+  return a
 
 -- | Annotate the given value as JSON.
 jotJson :: forall a r. ()
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
@@ -1,7 +1,6 @@
 module HaskellWorks.Polysemy.Hedgehog.Property
-  ( Property
-  , propertyOnce
-
+  ( Property,
+    propertyOnce,
   ) where
 
 import qualified GHC.Stack                                      as GHC
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs
@@ -1,6 +1,6 @@
 module HaskellWorks.Polysemy.Hedgehog.Test
-  ( Property
-  , test
+  ( Property,
+    test,
 
   ) where
 
diff --git a/hw-polysemy.cabal b/hw-polysemy.cabal
--- a/hw-polysemy.cabal
+++ b/hw-polysemy.cabal
@@ -1,6 +1,6 @@
 cabal-version:          3.4
 name:                   hw-polysemy
-version:                0.2.14.11
+version:                0.2.14.12
 synopsis:               Opinionated polysemy library
 description:            Opinionated polysemy library.
 license:                Apache-2.0
@@ -128,6 +128,7 @@
     exposed-modules:    HaskellWorks.IO.Win32.NamedPipe
 
   exposed-modules:      HaskellWorks.Control.Monad
+                        HaskellWorks.Data.String
                         HaskellWorks.Error
                         HaskellWorks.Error.Types
                         HaskellWorks.IO.Network
@@ -167,6 +168,7 @@
                         HaskellWorks.Polysemy.System.IO.Temp
                         HaskellWorks.Polysemy.System.Process
                         HaskellWorks.Prelude
+                        HaskellWorks.Unsafe
   hs-source-dirs:       core
   default-language:     Haskell2010
 
diff --git a/test/HaskellWorks/Polysemy/HedgehogSpec.hs b/test/HaskellWorks/Polysemy/HedgehogSpec.hs
--- a/test/HaskellWorks/Polysemy/HedgehogSpec.hs
+++ b/test/HaskellWorks/Polysemy/HedgehogSpec.hs
@@ -3,8 +3,8 @@
 {-# LANGUAGE TypeApplications #-}
 
 module HaskellWorks.Polysemy.HedgehogSpec
-  ( hprop_example_property
-  , hprop_example_test
+  ( hprop_example_property,
+    hprop_example_test,
   ) where
 
 import           HaskellWorks.Polysemy.Prelude
diff --git a/test/HaskellWorks/Polysemy/TestContainers/LocalStackSpec.hs b/test/HaskellWorks/Polysemy/TestContainers/LocalStackSpec.hs
--- a/test/HaskellWorks/Polysemy/TestContainers/LocalStackSpec.hs
+++ b/test/HaskellWorks/Polysemy/TestContainers/LocalStackSpec.hs
@@ -4,7 +4,7 @@
 {- HLINT ignore "Use let" -}
 
 module HaskellWorks.Polysemy.TestContainers.LocalStackSpec
-  ( tasty_local_stack
+  ( tasty_local_stack,
   ) where
 
 import           Prelude
diff --git a/testcontainers-localstack/HaskellWorks/Polysemy/Amazonka/LocalStack.hs b/testcontainers-localstack/HaskellWorks/Polysemy/Amazonka/LocalStack.hs
--- a/testcontainers-localstack/HaskellWorks/Polysemy/Amazonka/LocalStack.hs
+++ b/testcontainers-localstack/HaskellWorks/Polysemy/Amazonka/LocalStack.hs
@@ -1,9 +1,9 @@
 {- HLINT ignore "Use let" -}
 
 module HaskellWorks.Polysemy.Amazonka.LocalStack
-  ( runReaderLocalAwsEnvDiscover
-  , getLocalStackEndpoint
-  , inspectContainer
+  ( runReaderLocalAwsEnvDiscover,
+    getLocalStackEndpoint,
+    inspectContainer,
   ) where
 
 import qualified Amazonka                                     as AWS
