diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,77 @@
+CSIRO Open Source Software License Agreement (variation of the BSD / MIT
+License)
+
+Copyright (c) 2016, Commonwealth Scientific and Industrial Research Organisation
+(CSIRO) ABN 41 687 119 230.
+
+All rights reserved. CSIRO is willing to grant you a license to this
+aemo-webservice on the following terms, except where otherwise indicated for
+third party material.
+
+Redistribution and use of this software in source and binary forms, with or
+without modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+  list of conditions and the following disclaimer in the documentation and/or
+  other materials provided with the distribution.
+
+* Neither the name of CSIRO nor the names of its contributors may be used to
+  endorse or promote products derived from this software without specific prior
+  written permission of CSIRO.
+
+EXCEPT AS EXPRESSLY STATED IN THIS AGREEMENT AND TO THE FULL EXTENT PERMITTED BY
+APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS-IS". CSIRO MAKES NO
+REPRESENTATIONS, WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY REPRESENTATIONS, WARRANTIES OR CONDITIONS
+REGARDING THE CONTENTS OR ACCURACY OF THE SOFTWARE, OR OF TITLE,
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, THE ABSENCE
+OF LATENT OR OTHER DEFECTS, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+DISCOVERABLE.
+
+TO THE FULL EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL CSIRO BE
+LIABLE ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, IN AN ACTION FOR
+BREACH OF CONTRACT, NEGLIGENCE OR OTHERWISE) FOR ANY CLAIM, LOSS, DAMAGES OR
+OTHER LIABILITY HOWSOEVER INCURRED.  WITHOUT LIMITING THE SCOPE OF THE PREVIOUS
+SENTENCE THE EXCLUSION OF LIABILITY SHALL INCLUDE: LOSS OF PRODUCTION OR
+OPERATION TIME, LOSS, DAMAGE OR CORRUPTION OF DATA OR RECORDS; OR LOSS OF
+ANTICIPATED SAVINGS, OPPORTUNITY, REVENUE, PROFIT OR GOODWILL, OR OTHER ECONOMIC
+LOSS; OR ANY SPECIAL, INCIDENTAL, INDIRECT, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+DAMAGES, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, ACCESS OF THE
+SOFTWARE OR ANY OTHER DEALINGS WITH THE SOFTWARE, EVEN IF CSIRO HAS BEEN ADVISED
+OF THE POSSIBILITY OF SUCH CLAIM, LOSS, DAMAGES OR OTHER LIABILITY.
+
+APPLICABLE LEGISLATION SUCH AS THE AUSTRALIAN CONSUMER LAW MAY APPLY
+REPRESENTATIONS, WARRANTIES, OR CONDITIONS, OR IMPOSES OBLIGATIONS OR LIABILITY
+ON CSIRO THAT CANNOT BE EXCLUDED, RESTRICTED OR MODIFIED TO THE FULL EXTENT SET
+OUT IN THE EXPRESS TERMS OF THIS CLAUSE ABOVE "CONSUMER GUARANTEES".  TO THE
+EXTENT THAT SUCH CONSUMER GUARANTEES CONTINUE TO APPLY, THEN TO THE FULL EXTENT
+PERMITTED BY THE APPLICABLE LEGISLATION, THE LIABILITY OF CSIRO UNDER THE
+RELEVANT CONSUMER GUARANTEE IS LIMITED (WHERE PERMITTED AT CSIRO'S OPTION) TO
+ONE OF FOLLOWING REMEDIES OR SUBSTANTIALLY EQUIVALENT REMEDIES:
+
+(a)               THE REPLACEMENT OF THE SOFTWARE, THE SUPPLY OF EQUIVALENT
+                  SOFTWARE, OR SUPPLYING RELEVANT SERVICES AGAIN;
+(b)               THE REPAIR OF THE SOFTWARE;
+(c)               THE PAYMENT OF THE COST OF REPLACING THE
+                  SOFTWARE, OF ACQUIRING EQUIVALENT SOFTWARE, HAVING THE
+                  RELEVANT SERVICES SUPPLIED AGAIN, OR HAVING THE SOFTWARE
+                  REPAIRED.
+
+IN THIS CLAUSE, CSIRO INCLUDES ANY THIRD PARTY AUTHOR OR OWNER OF ANY PART OF
+THE SOFTWARE OR MATERIAL DISTRIBUTED WITH IT.  CSIRO MAY ENFORCE ANY RIGHTS ON
+BEHALF OF THE RELEVANT THIRD PARTY.
+
+Third Party Components
+
+The following third party components are distributed with the Software.  You
+agree to comply with the license terms for these components as part of accessing
+the Software.  Other third party software may also be identified in separate
+files distributed with the Software.
+
+___________________________________________________________________
+
+___________________________________________________________________
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,44 @@
+#!/usr/bin/env runhaskell
+\begin{code}
+{-# OPTIONS_GHC -Wall #-}
+module Main (main) where
+
+import Data.List ( nub )
+import Data.Version ( showVersion )
+import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName )
+import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )
+import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )
+import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose )
+import Distribution.Simple.BuildPaths ( autogenModulesDir )
+import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag )
+import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) )
+import Distribution.Verbosity ( Verbosity )
+import System.FilePath ( (</>) )
+
+main :: IO ()
+main = defaultMainWithHooks simpleUserHooks
+  { buildHook = \pkg lbi hooks flags -> do
+     generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi
+     buildHook simpleUserHooks pkg lbi hooks flags
+  }
+
+generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()
+generateBuildModule verbosity pkg lbi = do
+  let dir = autogenModulesDir lbi
+  createDirectoryIfMissingVerbose verbosity True dir
+  withLibLBI pkg lbi $ \_ libcfg -> do
+    withTestLBI pkg lbi $ \suite suitecfg -> do
+      rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines
+        [ "module Build_" ++ testName suite ++ " where"
+        , "deps :: [String]"
+        , "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg))
+        ]
+  where
+    formatdeps = map (formatone . snd)
+    formatone p = case packageName p of
+      PackageName n -> n ++ "-" ++ showVersion (packageVersion p)
+
+testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]
+testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys
+
+\end{code}
diff --git a/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,3 @@
+0.2.0
+
+* Initial release.
diff --git a/papa-base-export.cabal b/papa-base-export.cabal
new file mode 100644
--- /dev/null
+++ b/papa-base-export.cabal
@@ -0,0 +1,88 @@
+name:               papa-base-export
+version:            0.2.0
+license:            BSD3
+license-file:       LICENSE
+author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
+maintainer:         Tony Morris
+copyright:          Copyright (c) 2017, Commonwealth Scientific and Industrial Research Organisation (CSIRO) ABN 41 687 119 230.
+synopsis:           Prelude with only useful functions
+category:           Prelude
+description:        Prelude with only useful functions
+homepage:           https://github.com/data61/papa-base-export
+bug-reports:        https://github.com/data61/papa-base-export/issues
+cabal-version:      >= 1.10
+build-type:         Custom
+extra-source-files: changelog
+
+source-repository   head
+  type:             git
+  location:         git@github.com:data61/papa-base-export.git
+
+flag                small_base
+  description:      Choose the new, split-up base package.
+
+library
+  default-language:
+                    Haskell2010
+
+  build-depends:
+                    base >= 4.8 && < 5
+                    
+  ghc-options:
+                    -Wall
+
+  default-extensions:
+                    NoImplicitPrelude
+
+  hs-source-dirs:
+                    src
+
+  exposed-modules:
+                    Papa.Base.Export
+                    Papa.Base.Export.Control.Applicative
+                    Papa.Base.Export.Control.Category
+                    Papa.Base.Export.Control.Monad
+                    Papa.Base.Export.Data.Bool
+                    Papa.Base.Export.Data.Char
+                    Papa.Base.Export.Data.Either
+                    Papa.Base.Export.Data.Eq
+                    Papa.Base.Export.Data.Foldable
+                    Papa.Base.Export.Data.Function
+                    Papa.Base.Export.Data.Functor
+                    Papa.Base.Export.Data.Int
+                    Papa.Base.Export.Data.List
+                    Papa.Base.Export.Data.List.NonEmpty
+                    Papa.Base.Export.Data.Maybe
+                    Papa.Base.Export.Data.Monoid
+                    Papa.Base.Export.Data.Ord
+                    Papa.Base.Export.Data.Ratio
+                    Papa.Base.Export.Data.Semigroup
+                    Papa.Base.Export.Data.String
+                    Papa.Base.Export.Data.Traversable
+                    Papa.Base.Export.Data.Void
+                    Papa.Base.Export.Prelude
+
+test-suite doctests
+  type:
+                    exitcode-stdio-1.0
+
+  main-is:
+                    doctests.hs
+
+  default-language:
+                    Haskell2010
+
+  build-depends:
+                    base < 5 && >= 3
+                    , doctest >= 0.9.7
+                    , filepath >= 1.3
+                    , directory >= 1.1
+                    , QuickCheck >= 2.0
+                    , template-haskell >= 2.8
+
+  ghc-options:
+                    -Wall
+                    -threaded
+
+  hs-source-dirs:
+                    test
diff --git a/src/Papa/Base/Export.hs b/src/Papa/Base/Export.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export(
+  module P
+) where
+
+import Papa.Base.Export.Control.Applicative as P
+import Papa.Base.Export.Control.Category as P
+import Papa.Base.Export.Control.Monad as P
+import Papa.Base.Export.Data.Bool as P
+import Papa.Base.Export.Data.Char as P
+import Papa.Base.Export.Data.Either as P
+import Papa.Base.Export.Data.Eq as P
+import Papa.Base.Export.Data.Foldable as P
+import Papa.Base.Export.Data.Function as P
+import Papa.Base.Export.Data.Functor as P
+import Papa.Base.Export.Data.Int as P
+import Papa.Base.Export.Data.List as P
+import Papa.Base.Export.Data.List.NonEmpty as P
+import Papa.Base.Export.Data.Maybe as P
+import Papa.Base.Export.Data.Monoid as P
+import Papa.Base.Export.Data.Ord as P
+import Papa.Base.Export.Data.Ratio as P
+import Papa.Base.Export.Data.Semigroup as P
+import Papa.Base.Export.Data.String as P
+import Papa.Base.Export.Data.Traversable as P
+import Papa.Base.Export.Data.Void as P
+import Papa.Base.Export.Prelude as P
+
diff --git a/src/Papa/Base/Export/Control/Applicative.hs b/src/Papa/Base/Export/Control/Applicative.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Control/Applicative.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Control.Applicative(
+  module P
+) where
+
+import Control.Applicative as P(
+    Applicative(pure, (<*>), (*>), (<*))
+  , Alternative(empty, (<|>), some, many)
+  , Const(getConst)
+  , WrappedMonad(unwrapMonad)
+  , WrappedArrow(unwrapArrow)
+  , ZipList(getZipList)
+  , (<$>)
+  , (<$)
+  , (<**>)
+  , liftA
+  , liftA2
+  , liftA3
+  , optional
+  )
diff --git a/src/Papa/Base/Export/Control/Category.hs b/src/Papa/Base/Export/Control/Category.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Control/Category.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Control.Category(
+  module P
+) where
+
+import Control.Category as P(
+    Category(id, (.))
+  )
diff --git a/src/Papa/Base/Export/Control/Monad.hs b/src/Papa/Base/Export/Control/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Control/Monad.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Control.Monad(
+  module P
+) where
+
+import Control.Monad as P(
+    Functor(fmap)
+  , Monad((>>=))
+  , MonadPlus(mzero, mplus)
+  , forever
+  , void
+  , msum
+  , mfilter
+  , filterM
+  , foldM
+  , foldM_
+  , replicateM
+  , replicateM_
+  , guard
+  , when
+  , unless
+  , (<$!>)
+  )
+
diff --git a/src/Papa/Base/Export/Data/Bool.hs b/src/Papa/Base/Export/Data/Bool.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Bool.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Bool(
+  module P
+) where
+
+import Data.Bool as P(
+    (&&)
+  , (||)
+  , not
+  , otherwise
+  , bool
+  )
+
diff --git a/src/Papa/Base/Export/Data/Char.hs b/src/Papa/Base/Export/Data/Char.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Char.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Char(
+  module P
+) where
+
+import Data.Char as P(
+    Char
+  , isControl
+  , isSpace
+  , isLower
+  , isUpper
+  , isAlpha
+  , isAlphaNum
+  , isPrint
+  , isDigit
+  , isOctDigit
+  , isHexDigit
+  , isLetter
+  , isMark
+  , isNumber
+  , isPunctuation
+  , isSymbol
+  , isSeparator
+  , isAscii
+  , isLatin1
+  , isAsciiUpper
+  , isAsciiLower
+  , GeneralCategory(UppercaseLetter, LowercaseLetter, TitlecaseLetter, ModifierLetter, OtherLetter, NonSpacingMark, SpacingCombiningMark, EnclosingMark, DecimalNumber, LetterNumber, OtherNumber, ConnectorPunctuation, DashPunctuation, OpenPunctuation, ClosePunctuation, InitialQuote, FinalQuote, OtherPunctuation, MathSymbol, CurrencySymbol, ModifierSymbol, OtherSymbol, Space, LineSeparator, ParagraphSeparator, Control, Format, Surrogate, PrivateUse, NotAssigned)
+  , toUpper
+  , toLower
+  , toTitle
+  , ord
+  , chr
+  )
+
diff --git a/src/Papa/Base/Export/Data/Either.hs b/src/Papa/Base/Export/Data/Either.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Either.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Either(
+  module P
+) where
+
+import Data.Either as P(
+    Either(Left, Right)
+  , either
+  , isLeft
+  , isRight
+  , partitionEithers
+  )
+
diff --git a/src/Papa/Base/Export/Data/Eq.hs b/src/Papa/Base/Export/Data/Eq.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Eq.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Eq(
+  module P
+) where
+
+import Data.Eq as P(
+    Eq((==), (/=))
+  )
+
diff --git a/src/Papa/Base/Export/Data/Foldable.hs b/src/Papa/Base/Export/Data/Foldable.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Foldable.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Foldable(
+  module P
+) where
+
+import Data.Foldable as P(
+    Foldable(fold, foldMap, foldr, foldr', foldl, foldl', toList, null, elem, sum, product)
+  , foldrM
+  , foldlM
+  , traverse_
+  , for_
+  , sequenceA_
+  , asum
+  , and
+  , or
+  , any
+  , all
+  , notElem
+  , find
+  )
diff --git a/src/Papa/Base/Export/Data/Function.hs b/src/Papa/Base/Export/Data/Function.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Function.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Function(
+  module P
+) where
+
+import Data.Function as P(
+    ($)
+  , (&)
+  , fix
+  , on
+  )
+
diff --git a/src/Papa/Base/Export/Data/Functor.hs b/src/Papa/Base/Export/Data/Functor.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Functor.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Functor(
+  module P
+) where
+
+import Data.Functor as P(
+    Functor(fmap, (<$))
+  , ($>)
+  , (<$>)
+  , void
+  )
diff --git a/src/Papa/Base/Export/Data/Int.hs b/src/Papa/Base/Export/Data/Int.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Int.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Int(
+  module P
+) where
+
+import Data.Int as P(
+    Int
+  , Int8
+  , Int16
+  , Int32
+  , Int64
+  )
+
diff --git a/src/Papa/Base/Export/Data/List.hs b/src/Papa/Base/Export/Data/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/List.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.List(
+  module P
+) where
+
+import Data.List as P(
+    null
+  , length
+  , reverse
+  , intersperse
+  , intercalate
+  , transpose
+  , subsequences
+  , permutations
+  , foldl
+  , foldl'
+  , foldr
+  , and
+  , or
+  , any
+  , all
+  , sum
+  , product
+  , mapAccumL
+  , mapAccumR
+  , replicate
+  , cycle
+  , take
+  , drop
+  , splitAt
+  , takeWhile
+  , dropWhile
+  , dropWhileEnd
+  , span
+  , break
+  , stripPrefix
+  , isPrefixOf
+  , isSuffixOf
+  , isInfixOf
+  , isSubsequenceOf
+  , elem
+  , notElem
+  , find
+  , partition
+  , lines
+  , words
+  , unlines
+  , unwords
+  , nub
+  , delete
+  , (\\)
+  , union
+  , intersect
+  , sort
+  , sortOn
+  , nubBy
+  , deleteBy
+  , deleteFirstsBy
+  , unionBy
+  , intersectBy
+  , sortBy
+  , insertBy
+  , genericLength
+  , genericTake
+  , genericDrop
+  , genericSplitAt
+  , genericReplicate
+  )
diff --git a/src/Papa/Base/Export/Data/List/NonEmpty.hs b/src/Papa/Base/Export/Data/List/NonEmpty.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/List/NonEmpty.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.List.NonEmpty(
+  module P
+) where
+
+import Data.List.NonEmpty as P(
+    NonEmpty((:|))
+  , scanl
+  , scanr
+  , scanl1
+  , scanr1
+  , inits
+  , tails
+  , iterate
+  , repeat
+  , unfold
+  , insert
+  , some1
+  , group
+  , groupBy
+  , groupWith
+  , groupAllWith
+  , group1
+  , groupBy1
+  , groupWith1
+  , groupAllWith1
+  , nonEmpty
+  , xor
+  )
diff --git a/src/Papa/Base/Export/Data/Maybe.hs b/src/Papa/Base/Export/Data/Maybe.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Maybe.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Maybe(
+  module P
+) where
+
+import Data.Maybe as P(
+    Maybe(Nothing, Just)
+  , maybe
+  , isJust
+  , isNothing
+  , fromMaybe
+  )
+
diff --git a/src/Papa/Base/Export/Data/Monoid.hs b/src/Papa/Base/Export/Data/Monoid.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Monoid.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Monoid(
+  module P  
+) where
+
+import Data.Monoid as P(
+    Monoid(mempty, mappend)
+  , Dual(getDual)
+  , Endo(appEndo)
+  , All(getAll)
+  , Any(getAny)
+  , Sum(getSum)
+  , Product(getProduct)
+  )
diff --git a/src/Papa/Base/Export/Data/Ord.hs b/src/Papa/Base/Export/Data/Ord.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Ord.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Ord(
+  module P
+) where
+
+import Data.Ord as P(
+    Ord(compare, (<), (<=), (>), (>=), max, min)
+  , Down(Down)
+  , comparing
+  )
diff --git a/src/Papa/Base/Export/Data/Ratio.hs b/src/Papa/Base/Export/Data/Ratio.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Ratio.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Ratio(
+  module P
+) where
+
+import Data.Ratio as P(
+    Ratio
+  , Rational
+  , (%)
+  , numerator
+  , denominator
+  , approxRational
+  )
diff --git a/src/Papa/Base/Export/Data/Semigroup.hs b/src/Papa/Base/Export/Data/Semigroup.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Semigroup.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Semigroup(
+  module P
+) where
+
+import Data.Semigroup as P(
+    Semigroup((<>), sconcat, stimes)
+  , stimesMonoid
+  , stimesIdempotent
+  , stimesIdempotentMonoid
+  , mtimesDefault
+  , Min(getMin)
+  , Max(getMax)
+  , First(getFirst)
+  , Last(getLast)
+  , WrappedMonoid(unwrapMonoid)
+  , Monoid(mempty, mappend)
+  , Dual(getDual)
+  , Endo(appEndo)
+  , All(getAll)
+  , Any(getAny)
+  , Sum(getSum)
+  , Product(getProduct)
+  , Option(getOption)
+  , option
+  , diff
+  , cycle1
+  , WrappedMonoid(unwrapMonoid)
+  , Arg(Arg)
+  , ArgMin
+  , ArgMax
+  )
+
diff --git a/src/Papa/Base/Export/Data/String.hs b/src/Papa/Base/Export/Data/String.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/String.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.String(
+  module P
+) where
+
+import Data.String as P(
+    String
+  , lines
+  , words
+  , unlines
+  , unwords
+  )
diff --git a/src/Papa/Base/Export/Data/Traversable.hs b/src/Papa/Base/Export/Data/Traversable.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Traversable.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Traversable(
+  module P
+) where
+
+import Data.Traversable as P(
+    Traversable(traverse, sequenceA)
+  , for
+  , mapAccumL
+  , fmapDefault
+  , foldMapDefault
+  )
diff --git a/src/Papa/Base/Export/Data/Void.hs b/src/Papa/Base/Export/Data/Void.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Data/Void.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Data.Void(
+  module P
+) where
+
+import Data.Void as P(
+    Void
+  , absurd
+  , vacuous
+  )
+
diff --git a/src/Papa/Base/Export/Prelude.hs b/src/Papa/Base/Export/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/src/Papa/Base/Export/Prelude.hs
@@ -0,0 +1,265 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+module Papa.Base.Export.Prelude(
+  module Prelude
+) where
+
+import Prelude as Prelude(
+--  (!!)                       Papa.Prelude.Lens.Data.List
+    Monad
+  , encodeFloat
+--, map                        Papa.Core.Data.Functor
+--, scanr                      Papa.Prelude.Semigroups.Data.List
+  , ($)
+  , Monoid 
+--, enumFrom
+--, mapM                       Papa.Core.Data.Traversable
+--, scanr1
+--, ($!) 
+--, enumFromThen
+--, mapM_                      Papa.Core.Data.Foldable
+--, seq
+  , (&&)
+  , Num 
+--, enumFromThenTo
+--, mappend                    Papa.Prelude.Semigroups.Data.List
+--, sequence                   Papa.Core.Data.Traversable
+  , (*)
+  , Ord 
+--, enumFromTo
+  , max 
+  , sequenceA
+  , (**)
+  , Ordering(
+      LT
+    , EQ
+    , GT
+    )
+--, error 
+--, maxBound
+--, sequence_                  Papa.Core.Data.Foldable
+--, (*>)                       Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , Rational
+--, errorWithoutStackTrace
+--, maximum                    Papa.Prelude.Semigroups.Data.List
+  , show
+  , (+) 
+--, Read 
+  , even 
+  , maybe 
+--, showChar
+--, (++)                       Papa.Prelude.Semigroups.Data.List
+--, ReadS 
+  , exp 
+--, mconcat                    Papa.Core.Data.Monoid
+--, showList
+  , (-) 
+  , Real 
+  , exponent
+  , mempty 
+  , showParen
+--, (.)                        Papa.Prelude.Semigroupoids.Data.Semigroupoid
+  , RealFloat
+--, fail 
+  , min 
+--, showString
+  , (/) 
+--, RealFrac
+  , filter 
+--, minBound
+  , shows
+  , (/=) 
+--, flip                       Papa.Core.Data.Functor
+--, minimum                    Papa.Prelude.Semigroups.Data.List
+  , showsPrec
+  , (<) 
+  , Show 
+  , floatDigits
+  , mod 
+  , significand
+  , (<$) 
+  , ShowS 
+  , floatRadix
+  , negate 
+  , signum
+  , (<$>)
+--, String 
+  , floatRange
+  , not 
+  , sin
+--, (<*)                       Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , Traversable
+  , floor 
+  , notElem 
+  , sinh
+  , (<*>)
+  , fmap 
+  , null 
+--, snd                        Papa.Prelude.Lens.Data.Tuple
+  , (<=)
+  , Word 
+  , foldMap 
+  , odd 
+  , span
+--, (=<<)                      Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , (^)
+  , foldl
+--, or 
+  , splitAt
+  , (==) 
+  , (^^) 
+--, foldl1                     Papa.Prelude.Semigroups.Data.List 
+  , otherwise
+  , sqrt
+  , (>) 
+  , abs 
+  , foldr 
+  , pi 
+  , subtract
+  , (>=) 
+  , acos 
+--, foldr1                     Papa.Prelude.Semigroups.Data.List
+--, pred 
+--, succ
+--, (>>)                       Papa.Prelude.Semigroupoids.Data.Functor.Apply
+  , acosh 
+--, fromEnum
+--, print 
+  , sum
+--, (>>=)                      Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , all 
+  , fromInteger
+  , product 
+--, tail                       Papa.Prelude.Lens.Data.List
+  , Applicative
+  , and 
+  , fromIntegral
+  , properFraction
+  , take
+  , Bool(
+      False
+    , True
+    ) 
+  , any 
+  , fromRational
+  , pure 
+  , takeWhile
+--, Bounded 
+  , appendFile
+--, fst                        Papa.Prelude.Lens.Data.Tuple
+  , putChar 
+  , tan
+  , Char 
+--, asTypeOf
+  , gcd 
+  , putStr 
+  , tanh
+  , Double 
+  , asin 
+  , getChar 
+  , putStrLn
+--, toEnum
+  , asinh 
+  , getContents
+  , quot 
+  , toInteger
+  , Either(
+      Left
+    , Right
+    ) 
+  , atan 
+  , getLine 
+  , quotRem 
+  , toRational
+  , Enum 
+  , atan2 
+--, head                       Papa.Prelude.Lens.Data.List 
+--, read 
+  , traverse
+  , Eq 
+  , atanh 
+--, id                         Papa.Core.Control.Category
+  , readFile
+  , truncate
+  , break 
+--, init                       Papa.Prelude.Lens.Data.List
+  , readIO 
+  , uncurry
+  , FilePath
+  , ceiling 
+  , interact
+--, readList
+--, undefined
+  , Float 
+  , compare 
+  , ioError 
+--, readLn 
+  , unlines
+  , Floating
+--, concat                     Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , isDenormalized
+--, readParen
+  , until
+  , Foldable
+--, concatMap                  Papa.Prelude.Semigroupoids.Data.Functor.Bind
+  , isIEEE 
+--, reads 
+  , unwords
+  , Fractional
+--, const                      Papa.Core.Control.Applicative
+  , isInfinite
+--, readsPrec
+--, unzip                      Papa.Core.Data.Functor
+  , Functor
+  , cos 
+  , isNaN 
+  , realToFrac
+  , unzip3
+  , cosh 
+  , isNegativeZero
+  , recip 
+--, userError
+  , IO 
+  , curry 
+--, iterate 
+  , rem 
+  , words
+  , IOError 
+  , cycle 
+--, last                       Papa.Prelude.Lens.Data.List
+--, repeat 
+  , writeFile
+  , Int 
+  , decodeFloat
+  , lcm 
+  , replicate
+  , zip
+  , Integer 
+--, div 
+--, length 
+--, return                     Papa.Core.Control.Applicative
+  , zip3
+  , Integral
+  , divMod
+--, lex 
+--, reverse                    Papa.Core.Data.List
+  , zipWith
+  , drop 
+  , lines 
+  , round 
+  , zipWith3
+  , dropWhile
+  , log 
+  , scaleFloat
+  , (||)
+  , either 
+  , logBase 
+--, scanl                      Papa.Prelude.Semigroups.Data.List
+  , Maybe(
+      Nothing
+    , Just
+    ) 
+  , elem 
+--, lookup                     Papa.Core.Data.List
+--, scanl1
+ ) 
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,32 @@
+module Main where
+
+import Build_doctests (deps)
+import Control.Applicative
+import Control.Monad
+import Data.List
+import System.Directory
+import System.FilePath
+import Test.DocTest
+
+main ::
+  IO ()
+main =
+  getSources >>= \sources -> doctest $
+      "-isrc"
+    : "-idist/build/autogen"
+    : "-optP-include"
+    : "-optPdist/build/autogen/cabal_macros.h"
+    : "-hide-all-packages"
+    : map ("-package="++) deps ++ sources
+
+getSources :: IO [FilePath]
+getSources = filter (isSuffixOf ".hs") <$> go "src"
+  where
+    go dir = do
+      (dirs, files) <- getFilesAndDirectories dir
+      (files ++) . concat <$> mapM go dirs
+
+getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])
+getFilesAndDirectories dir = do
+  c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir
+  (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c
