diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -23,11 +23,21 @@
 
 When submitting a pull request, please follow the following guidelines:
 
-- Add at least a test to `tests/purs/passing/` and possibly to `tests/purs/failing/`.
+- Add tests according to the next section
 - Build the binaries and libraries with `stack build --fast`. The `--fast` flag is recommended but not required; it disables optimizations, which can speed things up quite a bit.
 - Make sure that all test suites are passing. Run the test suites with `stack test --fast`.
 - Please try to keep changes small and isolated: smaller pull requests which only address one issue are much easier to review.
 - For any code change, please append a copyright and licensing notice to the [CONTRIBUTORS.md](CONTRIBUTORS.md) file if your name is not in there already.
+
+### Writing Tests
+
+When writing tests, try to have at least one passing test and one failing test, if applicable.
+
+- Passing tests go in `tests/purs/passing/`
+- Failing tests go in `tests/purs/failing/`
+- Tests that check warnings go in `tests/purs/warning/`
+
+Passing tests may produce warnings. Tests in `tests/purs/warning/` can ensure no warning is emitted by having no annotations and an empty `.out` file. 
 
 ### Running Tests
 
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -44,6 +44,7 @@
 | [@kleeneplus](https://github.com/dgendill) | Dominick Gendill | [MIT license](http://opensource.org/licenses/MIT) |
 | [@ealmansi](https://github.com/ealmansi) | Emilio Almansi | MIT license |
 | [@eamelink](https://github.com/eamelink) | Erik Bakker | MIT license |
+| [@EMattfolk](https://github.com/EMattfolk) | Erik Mattfolk | [MIT license](http://opensource.org/licenses/MIT) |
 | [@epost](https://github.com/epost) | Erik Post | MIT license |
 | [@erdeszt](https://github.com/erdeszt) | Tibor Erdesz | [MIT license](http://opensource.org/licenses/MIT) |
 | [@etrepum](https://github.com/etrepum) | Bob Ippolito | [MIT license](http://opensource.org/licenses/MIT) |
@@ -75,6 +76,7 @@
 | [@matthewleon](https://github.com/matthewleon) | Matthew Leon | [MIT license](http://opensource.org/licenses/MIT) |
 | [@mcoffin](https://github.com/mcoffin) | Matt Coffin | [MIT license](http://opensource.org/licenses/MIT) |
 | [@mhcurylo](https://github.com/mhcurylo) | Mateusz Curylo | [MIT license](http://opensource.org/licenses/MIT) |
+| [@mikesol](https://github.com/mikesol) | Mike Solomon | [MIT license](http://opensource.org/licenses/MIT) |
 | [@MiracleBlue](https://github.com/MiracleBlue) | Nicholas Kircher | [MIT license](http://opensource.org/licenses/MIT) |
 | [@mrkgnao](https://github.com/mrkgnao) | Soham Chowdhury | [MIT license](http://opensource.org/licenses/MIT) |
 | [@mgmeier](https://github.com/mgmeier) | Michael Gilliland | [MIT license](http://opensource.org/licenses/MIT) |
@@ -157,6 +159,7 @@
 | [@i-am-the-slime](https://github.com/i-am-the-slime) | Mark Eibes | [MIT license](http://opensource.org/licenses/MIT) |
 | [@sd-yip](https://github.com/sd-yip) | Nicholas Yip | [MIT license](http://opensource.org/licenses/MIT) |
 | [@j-nava](https://github.com/j-nava) | Jesse Nava | [MIT license](http://opensource.org/licenses/MIT) |
+| [@imcotton](https://github.com/imcotton) | Cotton Hou | [MIT license](http://opensource.org/licenses/MIT) |
 
 ### Contributors using Modified Terms
 
diff --git a/INSTALL.md b/INSTALL.md
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -4,12 +4,12 @@
 
 ## Requirements
 
-The PureScript compiler is built using GHC 8.10.7, and should be able to run on any operating system supported by GHC 8.10.7. In particular:
+The PureScript compiler is built using GHC 9.2.3, and should be able to run on any operating system supported by GHC 9.2.3. In particular:
 
 * for Windows users, versions predating Vista are not officially supported,
 * for macOS / OS X users, versions predating Mac OS X 10.7 (Lion) are not officially supported.
 
-See also <https://www.haskell.org/ghc/download_ghc_8_10_7.html> for more details about the operating systems which GHC 8.10.7 supports.
+See also <https://www.haskell.org/ghc/download_ghc_9_2_3.html> for more details about the operating systems which GHC 9.2.3 supports.
 
 ## Official prebuilt binaries
 
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -47,6 +47,7 @@
   call-stack
   case-insensitive
   cborg
+  cereal
   cheapskate
   clock
   colour
@@ -71,7 +72,6 @@
   dlist
   easy-file
   edit-distance
-  enclosed-exceptions
   exceptions
   fast-logger
   file-embed
@@ -84,7 +84,7 @@
   happy
   hashable
   haskeline
-  hinotify
+  hfsevents
   http-types
   indexed-traversable
   indexed-traversable-instances
@@ -129,7 +129,6 @@
   semigroupoids
   semigroups
   serialise
-  shelly
   sourcemap
   split
   splitmix
@@ -1275,6 +1274,39 @@
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+cereal LICENSE file:
+
+  Copyright (c) Lennart Kolmodin, Galois, Inc.
+
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+  2. 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.
+
+  3. Neither the name of the author nor the names of his contributors
+     may be used to endorse or promote products derived from this software
+     without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+  POSSIBILITY OF SUCH DAMAGE.
+
 cheapskate LICENSE file:
 
   Copyright (c) 2013, John MacFarlane
@@ -2008,29 +2040,6 @@
   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-enclosed-exceptions LICENSE file:
-
-  Copyright (c) 2012 Michael Snoyman, http://www.yesodweb.com/
-
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  "Software"), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
-
-  The above copyright notice and this permission notice shall be
-  included in all copies or substantial portions of the Software.
-
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
 exceptions LICENSE file:
 
   Copyright 2013-2015 Edward Kmett
@@ -2447,38 +2456,38 @@
   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-hinotify LICENSE file:
+hfsevents LICENSE file:
 
-  Copyright (c) Lennart Kolmodin
+  Copyright (c) 2012, Luite Stegeman
 
   All rights reserved.
 
   Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
+  modification, are permitted provided that the following conditions are met:
 
-  1. Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
+      * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
 
-  2. 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.
+      * 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.
 
-  3. Neither the name of the author nor the names of his contributors
-     may be used to endorse or promote products derived from this software
-     without specific prior written permission.
+      * Neither the name of Luite Stegeman nor the names of other
+        contributors may be used to endorse or promote products derived
+        from this software without specific prior written permission.
 
-  THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
-  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
-  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-  POSSIBILITY OF SUCH DAMAGE.
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 http-types LICENSE file:
 
@@ -3905,39 +3914,6 @@
         with the distribution.
 
       * Neither the name of Duncan Coutts nor the names of other
-        contributors may be used to endorse or promote products derived
-        from this software without specific prior written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-shelly LICENSE file:
-
-  Copyright (c) 2017, Petr Rockai <me@mornfall.net>
-
-  All rights reserved.
-
-  Redistribution and use 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 Petr Rockai nor the names of other
         contributors may be used to endorse or promote products derived
         from this software without specific prior written permission.
 
diff --git a/app/Command/Compile.hs b/app/Command/Compile.hs
--- a/app/Command/Compile.hs
+++ b/app/Command/Compile.hs
@@ -33,11 +33,11 @@
   }
 
 -- | Arguments: verbose, use JSON, warnings, errors
-printWarningsAndErrors :: Bool -> Bool -> P.MultipleErrors -> Either P.MultipleErrors a -> IO ()
-printWarningsAndErrors verbose False warnings errors = do
+printWarningsAndErrors :: Bool -> Bool -> [(FilePath, T.Text)] -> P.MultipleErrors -> Either P.MultipleErrors a -> IO ()
+printWarningsAndErrors verbose False files warnings errors = do
   pwd <- getCurrentDirectory
   cc <- bool Nothing (Just P.defaultCodeColor) <$> ANSI.hSupportsANSI stdout
-  let ppeOpts = P.defaultPPEOptions { P.ppeCodeColor = cc, P.ppeFull = verbose, P.ppeRelativeDirectory = pwd }
+  let ppeOpts = P.defaultPPEOptions { P.ppeCodeColor = cc, P.ppeFull = verbose, P.ppeRelativeDirectory = pwd, P.ppeFileContents = files }
   when (P.nonEmpty warnings) $
     putStrLn (P.prettyPrintMultipleWarnings ppeOpts warnings)
   case errors of
@@ -45,10 +45,10 @@
       putStrLn (P.prettyPrintMultipleErrors ppeOpts errs)
       exitFailure
     Right _ -> return ()
-printWarningsAndErrors verbose True warnings errors = do
+printWarningsAndErrors verbose True files warnings errors = do
   putStrLn . LBU8.toString . A.encode $
-    JSONResult (toJSONErrors verbose P.Warning warnings)
-               (either (toJSONErrors verbose P.Error) (const []) errors)
+    JSONResult (toJSONErrors verbose P.Warning files warnings)
+               (either (toJSONErrors verbose P.Error files) (const []) errors)
   either (const exitFailure) (const (return ())) errors
 
 compile :: PSCMakeOptions -> IO ()
@@ -66,7 +66,7 @@
     foreigns <- inferForeignModules filePathMap
     let makeActions = buildMakeActions pscmOutputDir filePathMap foreigns pscmUsePrefix
     P.make makeActions (map snd ms)
-  printWarningsAndErrors (P.optionsVerboseErrors pscmOpts) pscmJSONErrors makeWarnings makeErrors
+  printWarningsAndErrors (P.optionsVerboseErrors pscmOpts) pscmJSONErrors moduleFiles makeWarnings makeErrors
   exitSuccess
 
 warnFileTypeNotFound :: String -> IO ()
diff --git a/app/Command/Graph.hs b/app/Command/Graph.hs
--- a/app/Command/Graph.hs
+++ b/app/Command/Graph.hs
@@ -79,8 +79,8 @@
 printWarningsAndErrors True warnings errors = do
   let verbose = True
   hPutStrLn stderr . LBU8.toString . Json.encode $
-    JSONResult (toJSONErrors verbose P.Warning warnings)
-               (either (toJSONErrors verbose P.Error) (const []) errors)
+    JSONResult (toJSONErrors verbose P.Warning [] warnings)
+               (either (toJSONErrors verbose P.Error []) (const []) errors)
   case errors of
     Left _errs -> exitFailure
     Right res -> pure res
diff --git a/app/Command/REPL.hs b/app/Command/REPL.hs
--- a/app/Command/REPL.hs
+++ b/app/Command/REPL.hs
@@ -3,8 +3,7 @@
 
 module Command.REPL (command) where
 
-import           Prelude ()
-import           Prelude.Compat
+import           Prelude
 import           Control.Applicative (many, (<|>))
 import           Control.Monad
 import           Control.Monad.Catch (MonadMask)
diff --git a/purescript.cabal b/purescript.cabal
--- a/purescript.cabal
+++ b/purescript.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               purescript
-version:            0.15.4
+version:            0.15.5
 license:            BSD-3-Clause
 license-file:       LICENSE
 copyright:
@@ -77,8 +77,10 @@
         Language.PureScript.CodeGen.JS.Common
         Language.PureScript.CodeGen.JS.Printer
         Language.PureScript.Constants.Prelude
+        Language.PureScript.Constants.Data.Foldable
         Language.PureScript.Constants.Data.Generic.Rep
         Language.PureScript.Constants.Data.Newtype
+        Language.PureScript.Constants.Data.Traversable
         Language.PureScript.CoreFn
         Language.PureScript.CoreFn.Ann
         Language.PureScript.CoreFn.Binders
@@ -248,8 +250,8 @@
         FlexibleInstances GeneralizedNewtypeDeriving KindSignatures
         LambdaCase MultiParamTypeClasses NamedFieldPuns NoImplicitPrelude
         PatternGuards PatternSynonyms RankNTypes RecordWildCards
-        OverloadedStrings ScopedTypeVariables TupleSections TypeFamilies
-        ViewPatterns
+        OverloadedRecordDot OverloadedStrings ScopedTypeVariables
+        TupleSections TypeFamilies ViewPatterns
 
     ghc-options:
         -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
@@ -261,7 +263,6 @@
         ansi-terminal >=0.11.3 && <0.12,
         array >=0.5.4.0 && <0.6,
         base >=4.16.2.0 && <4.17,
-        base-compat >=0.12.1 && <0.13,
         blaze-html >=0.9.1.2 && <0.10,
         bower-json >=1.1.0.0 && <1.2,
         boxes >=0.1.5 && <0.2,
@@ -272,11 +273,11 @@
         cheapskate >=0.1.1.2 && <0.2,
         clock >=0.8.3 && <0.9,
         containers >=0.6.5.1 && <0.7,
-        cryptonite ==0.30.*,
+        cryptonite >=0.30 && <0.31,
         data-ordlist >=0.4.7.0 && <0.5,
         deepseq >=1.4.6.1 && <1.5,
         directory >=1.3.6.2 && <1.4,
-        dlist ==1.0.*,
+        dlist >=1.0 && <1.1,
         edit-distance >=0.2.2.1 && <0.3,
         file-embed >=0.0.15.0 && <0.1,
         filepath >=1.4.2.2 && <1.5,
@@ -300,7 +301,7 @@
         regex-tdfa >=1.3.1.2 && <1.4,
         safe >=0.3.19 && <0.4,
         scientific >=0.3.7.0 && <0.4,
-        semigroups ==0.20.*,
+        semigroups >=0.20 && <0.21,
         semialign >=1.2.0.1 && <1.3,
         sourcemap >=0.1.7 && <0.2,
         split >=0.2.3.4 && <0.3,
@@ -316,7 +317,8 @@
         typed-process >=0.2.10.1 && <0.3,
         unordered-containers >=0.2.19.1 && <0.3,
         utf8-string >=1.0.2 && <1.1,
-        vector >=0.12.3.1 && <0.13
+        vector >=0.12.3.1 && <0.13,
+        witherable >=0.4.2 && <0.5
 
 executable purs
     main-is:            Main.hs
@@ -345,8 +347,8 @@
         FlexibleInstances GeneralizedNewtypeDeriving KindSignatures
         LambdaCase MultiParamTypeClasses NamedFieldPuns NoImplicitPrelude
         PatternGuards PatternSynonyms RankNTypes RecordWildCards
-        OverloadedStrings ScopedTypeVariables TupleSections TypeFamilies
-        ViewPatterns
+        OverloadedRecordDot OverloadedStrings ScopedTypeVariables
+        TupleSections TypeFamilies ViewPatterns
 
     ghc-options:
         -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
@@ -359,7 +361,6 @@
         ansi-terminal >=0.11.3 && <0.12,
         array >=0.5.4.0 && <0.6,
         base >=4.16.2.0 && <4.17,
-        base-compat >=0.12.1 && <0.13,
         blaze-html >=0.9.1.2 && <0.10,
         bower-json >=1.1.0.0 && <1.2,
         boxes >=0.1.5 && <0.2,
@@ -370,11 +371,11 @@
         cheapskate >=0.1.1.2 && <0.2,
         clock >=0.8.3 && <0.9,
         containers >=0.6.5.1 && <0.7,
-        cryptonite ==0.30.*,
+        cryptonite >=0.30 && <0.31,
         data-ordlist >=0.4.7.0 && <0.5,
         deepseq >=1.4.6.1 && <1.5,
         directory >=1.3.6.2 && <1.4,
-        dlist ==1.0.*,
+        dlist >=1.0 && <1.1,
         edit-distance >=0.2.2.1 && <0.3,
         file-embed >=0.0.15.0 && <0.1,
         filepath >=1.4.2.2 && <1.5,
@@ -398,7 +399,7 @@
         regex-tdfa >=1.3.1.2 && <1.4,
         safe >=0.3.19 && <0.4,
         scientific >=0.3.7.0 && <0.4,
-        semigroups ==0.20.*,
+        semigroups >=0.20 && <0.21,
         semialign >=1.2.0.1 && <1.3,
         sourcemap >=0.1.7 && <0.2,
         split >=0.2.3.4 && <0.3,
@@ -415,13 +416,14 @@
         unordered-containers >=0.2.19.1 && <0.3,
         utf8-string >=1.0.2 && <1.1,
         vector >=0.12.3.1 && <0.13,
+        witherable >=0.4.2 && <0.5,
         ansi-wl-pprint >=0.6.9 && <0.7,
         exceptions >=0.10.4 && <0.11,
         file-embed >=0.0.13.0 && <0.1,
         http-types >=0.12.3 && <0.13,
         network >=3.1.2.7 && <3.2,
         optparse-applicative >=0.17.0.0 && <0.18,
-        purescript -any
+        purescript
 
     if flag(release)
         cpp-options: -DRELEASE
@@ -433,8 +435,8 @@
     type:               exitcode-stdio-1.0
     main-is:            Main.hs
     build-tool-depends:
-        happy:happy ==1.20.0, hspec-discover:hspec-discover -any,
-        purescript:purs -any
+        happy:happy ==1.20.0, hspec-discover:hspec-discover,
+        purescript:purs
 
     hs-source-dirs:     tests
     other-modules:
@@ -477,8 +479,8 @@
         FlexibleInstances GeneralizedNewtypeDeriving KindSignatures
         LambdaCase MultiParamTypeClasses NamedFieldPuns NoImplicitPrelude
         PatternGuards PatternSynonyms RankNTypes RecordWildCards
-        OverloadedStrings ScopedTypeVariables TupleSections TypeFamilies
-        ViewPatterns
+        OverloadedRecordDot OverloadedStrings ScopedTypeVariables
+        TupleSections TypeFamilies ViewPatterns
 
     ghc-options:
         -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
@@ -491,7 +493,6 @@
         ansi-terminal >=0.11.3 && <0.12,
         array >=0.5.4.0 && <0.6,
         base >=4.16.2.0 && <4.17,
-        base-compat >=0.12.1 && <0.13,
         blaze-html >=0.9.1.2 && <0.10,
         bower-json >=1.1.0.0 && <1.2,
         boxes >=0.1.5 && <0.2,
@@ -502,11 +503,11 @@
         cheapskate >=0.1.1.2 && <0.2,
         clock >=0.8.3 && <0.9,
         containers >=0.6.5.1 && <0.7,
-        cryptonite ==0.30.*,
+        cryptonite >=0.30 && <0.31,
         data-ordlist >=0.4.7.0 && <0.5,
         deepseq >=1.4.6.1 && <1.5,
         directory >=1.3.6.2 && <1.4,
-        dlist ==1.0.*,
+        dlist >=1.0 && <1.1,
         edit-distance >=0.2.2.1 && <0.3,
         file-embed >=0.0.15.0 && <0.1,
         filepath >=1.4.2.2 && <1.5,
@@ -530,7 +531,7 @@
         regex-tdfa >=1.3.1.2 && <1.4,
         safe >=0.3.19 && <0.4,
         scientific >=0.3.7.0 && <0.4,
-        semigroups ==0.20.*,
+        semigroups >=0.20 && <0.21,
         semialign >=1.2.0.1 && <1.3,
         sourcemap >=0.1.7 && <0.2,
         split >=0.2.3.4 && <0.3,
@@ -547,7 +548,8 @@
         unordered-containers >=0.2.19.1 && <0.3,
         utf8-string >=1.0.2 && <1.1,
         vector >=0.12.3.1 && <0.13,
-        purescript -any,
+        witherable >=0.4.2 && <0.5,
+        purescript,
         generic-random >=1.5.0.1 && <1.6,
         hspec ==2.9.2,
         HUnit >=1.6.2.0 && <1.7,
diff --git a/src/Control/Monad/Logger.hs b/src/Control/Monad/Logger.hs
--- a/src/Control/Monad/Logger.hs
+++ b/src/Control/Monad/Logger.hs
@@ -3,7 +3,7 @@
 --
 module Control.Monad.Logger where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (ap)
 import Control.Monad.Base (MonadBase(..))
diff --git a/src/Control/Monad/Supply.hs b/src/Control/Monad/Supply.hs
--- a/src/Control/Monad/Supply.hs
+++ b/src/Control/Monad/Supply.hs
@@ -3,7 +3,7 @@
 --
 module Control.Monad.Supply where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Applicative
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Control/Monad/Supply/Class.hs b/src/Control/Monad/Supply/Class.hs
--- a/src/Control/Monad/Supply/Class.hs
+++ b/src/Control/Monad/Supply/Class.hs
@@ -4,7 +4,7 @@
 
 module Control.Monad.Supply.Class where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.RWS
 import Control.Monad.State
diff --git a/src/Language/PureScript/AST/Binders.hs b/src/Language/PureScript/AST/Binders.hs
--- a/src/Language/PureScript/AST/Binders.hs
+++ b/src/Language/PureScript/AST/Binders.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.AST.Binders where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.AST.SourcePos
 import Language.PureScript.AST.Literals
diff --git a/src/Language/PureScript/AST/Declarations.hs b/src/Language/PureScript/AST/Declarations.hs
--- a/src/Language/PureScript/AST/Declarations.hs
+++ b/src/Language/PureScript/AST/Declarations.hs
@@ -6,7 +6,7 @@
 --
 module Language.PureScript.AST.Declarations where
 
-import Prelude.Compat
+import Prelude
 import Protolude.Exceptions (hush)
 
 import Codec.Serialise (Serialise)
@@ -88,6 +88,7 @@
   | ErrorSolvingConstraint SourceConstraint
   | MissingConstructorImportForCoercible (Qualified (ProperName 'ConstructorName))
   | PositionedError (NEL.NonEmpty SourceSpan)
+  | RelatedPositions (NEL.NonEmpty SourceSpan)
   deriving (Show)
 
 -- | Categories of hints
@@ -428,7 +429,10 @@
   -- A type instance declaration (instance chain, chain index, name,
   -- dependencies, class name, instance types, member declarations)
   --
-  | TypeInstanceDeclaration SourceAnn ChainId Integer (Either Text Ident) [SourceConstraint] (Qualified (ProperName 'ClassName)) [SourceType] TypeInstanceBody
+  -- The first @SourceAnn@ serves as the annotation for the entire
+  -- declaration, while the second @SourceAnn@ serves as the
+  -- annotation for the type class and its arguments.
+  | TypeInstanceDeclaration SourceAnn SourceAnn ChainId Integer (Either Text Ident) [SourceConstraint] (Qualified (ProperName 'ClassName)) [SourceType] TypeInstanceBody
   deriving (Show)
 
 data ValueFixity = ValueFixity Fixity (Qualified (Either Ident (ProperName 'ConstructorName))) (OpName 'ValueOpName)
@@ -491,7 +495,7 @@
 declSourceAnn (FixityDeclaration sa _) = sa
 declSourceAnn (ImportDeclaration sa _ _ _) = sa
 declSourceAnn (TypeClassDeclaration sa _ _ _ _ _) = sa
-declSourceAnn (TypeInstanceDeclaration sa _ _ _ _ _ _ _) = sa
+declSourceAnn (TypeInstanceDeclaration sa _ _ _ _ _ _ _ _) = sa
 
 declSourceSpan :: Declaration -> SourceSpan
 declSourceSpan = fst . declSourceAnn
@@ -508,7 +512,7 @@
 declName (FixityDeclaration _ (Left (ValueFixity _ _ n))) = Just (ValOpName n)
 declName (FixityDeclaration _ (Right (TypeFixity _ _ n))) = Just (TyOpName n)
 declName (TypeClassDeclaration _ n _ _ _ _) = Just (TyClassName n)
-declName (TypeInstanceDeclaration _ _ _ n _ _ _ _) = IdentName <$> hush n
+declName (TypeInstanceDeclaration _ _ _ _ n _ _ _ _) = IdentName <$> hush n
 declName (RoleDeclaration RoleDeclarationData{..}) = Just (TyName rdeclIdent)
 declName ImportDeclaration{} = Nothing
 declName BindingGroupDeclaration{} = Nothing
diff --git a/src/Language/PureScript/AST/Exported.hs b/src/Language/PureScript/AST/Exported.hs
--- a/src/Language/PureScript/AST/Exported.hs
+++ b/src/Language/PureScript/AST/Exported.hs
@@ -3,7 +3,7 @@
   , isExported
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (sortOn)
 
 import Control.Category ((>>>))
@@ -104,7 +104,7 @@
 -- Get all type and type class names referenced by a type instance declaration.
 --
 typeInstanceConstituents :: Declaration -> [Either (Qualified (ProperName 'ClassName)) (Qualified (ProperName 'TypeName))]
-typeInstanceConstituents (TypeInstanceDeclaration _ _ _ _ constraints className tys _) =
+typeInstanceConstituents (TypeInstanceDeclaration _ _ _ _ _ constraints className tys _) =
   Left className : (concatMap fromConstraint constraints ++ concatMap fromType tys)
   where
 
diff --git a/src/Language/PureScript/AST/Literals.hs b/src/Language/PureScript/AST/Literals.hs
--- a/src/Language/PureScript/AST/Literals.hs
+++ b/src/Language/PureScript/AST/Literals.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.AST.Literals where
 
-import Prelude.Compat
+import Prelude
 import Language.PureScript.PSString (PSString)
 
 -- |
diff --git a/src/Language/PureScript/AST/Operators.hs b/src/Language/PureScript/AST/Operators.hs
--- a/src/Language/PureScript/AST/Operators.hs
+++ b/src/Language/PureScript/AST/Operators.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.AST.Operators where
 
-import Prelude.Compat
+import Prelude
 
 import Codec.Serialise (Serialise)
 import GHC.Generics (Generic)
diff --git a/src/Language/PureScript/AST/SourcePos.hs b/src/Language/PureScript/AST/SourcePos.hs
--- a/src/Language/PureScript/AST/SourcePos.hs
+++ b/src/Language/PureScript/AST/SourcePos.hs
@@ -4,7 +4,7 @@
 --
 module Language.PureScript.AST.SourcePos where
 
-import Prelude.Compat
+import Prelude
 
 import Codec.Serialise (Serialise)
 import Control.DeepSeq (NFData)
diff --git a/src/Language/PureScript/AST/Traversals.hs b/src/Language/PureScript/AST/Traversals.hs
--- a/src/Language/PureScript/AST/Traversals.hs
+++ b/src/Language/PureScript/AST/Traversals.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.AST.Traversals where
 
-import Prelude.Compat
+import Prelude
 import Protolude (swap)
 
 import Control.Monad
@@ -62,7 +62,7 @@
   f' (BoundValueDeclaration sa b expr) = f (BoundValueDeclaration sa (h' b) (g' expr))
   f' (BindingGroupDeclaration ds) = f (BindingGroupDeclaration (fmap (\(name, nameKind, val) -> (name, nameKind, g' val)) ds))
   f' (TypeClassDeclaration sa name args implies deps ds) = f (TypeClassDeclaration sa name args implies deps (fmap f' ds))
-  f' (TypeInstanceDeclaration sa ch idx name cs className args ds) = f (TypeInstanceDeclaration sa ch idx name cs className args (mapTypeInstanceBody (fmap f') ds))
+  f' (TypeInstanceDeclaration sa na ch idx name cs className args ds) = f (TypeInstanceDeclaration sa na ch idx name cs className args (mapTypeInstanceBody (fmap f') ds))
   f' other = f other
 
   g' :: Expr -> Expr
@@ -135,7 +135,7 @@
      ValueDecl sa name nameKind <$> traverse (h' <=< h) bs <*> traverse (guardedExprM handleGuard (g' <=< g)) val
   f' (BindingGroupDeclaration ds) = BindingGroupDeclaration <$> traverse (\(name, nameKind, val) -> (name, nameKind, ) <$> (g val >>= g')) ds
   f' (TypeClassDeclaration sa name args implies deps ds) = TypeClassDeclaration sa name args implies deps <$> traverse (f' <=< f) ds
-  f' (TypeInstanceDeclaration sa ch idx name cs className args ds) = TypeInstanceDeclaration sa ch idx name cs className args <$> traverseTypeInstanceBody (traverse (f' <=< f)) ds
+  f' (TypeInstanceDeclaration sa na ch idx name cs className args ds) = TypeInstanceDeclaration sa na ch idx name cs className args <$> traverseTypeInstanceBody (traverse (f' <=< f)) ds
   f' (BoundValueDeclaration sa b expr) = BoundValueDeclaration sa <$> (h' <=< h) b <*> (g' <=< g) expr
   f' other = f other
 
@@ -205,7 +205,7 @@
   f' (BindingGroupDeclaration ds) = (BindingGroupDeclaration <$> traverse (\(name, nameKind, val) -> (name, nameKind, ) <$> g' val) ds) >>= f
   f' (BoundValueDeclaration sa b expr) = (BoundValueDeclaration sa <$> h' b <*> g' expr) >>= f
   f' (TypeClassDeclaration sa name args implies deps ds) = (TypeClassDeclaration sa name args implies deps <$> traverse f' ds) >>= f
-  f' (TypeInstanceDeclaration sa ch idx name cs className args ds) = (TypeInstanceDeclaration sa ch idx name cs className args <$> traverseTypeInstanceBody (traverse f') ds) >>= f
+  f' (TypeInstanceDeclaration sa na ch idx name cs className args ds) = (TypeInstanceDeclaration sa na ch idx name cs className args <$> traverseTypeInstanceBody (traverse f') ds) >>= f
   f' other = f other
 
   g' :: Expr -> m Expr
@@ -276,7 +276,7 @@
   f' d@(ValueDeclaration vd) = foldl (<>.) (f d) (fmap h' (valdeclBinders vd) ++ concatMap (\(GuardedExpr grd v) -> fmap k' grd ++ [g' v]) (valdeclExpression vd))
   f' d@(BindingGroupDeclaration ds) = foldl (<>.) (f d) (fmap (\(_, _, val) -> g' val) ds)
   f' d@(TypeClassDeclaration _ _ _ _ _ ds) = foldl (<>.) (f d) (fmap f' ds)
-  f' d@(TypeInstanceDeclaration _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldl (<>.) (f d) (fmap f' ds)
+  f' d@(TypeInstanceDeclaration _ _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldl (<>.) (f d) (fmap f' ds)
   f' d@(BoundValueDeclaration _ b expr) = f d <>. h' b <>. g' expr
   f' d = f d
 
@@ -355,7 +355,7 @@
   f' s (ValueDeclaration vd) = foldl (<>.) r0 (fmap (h'' s) (valdeclBinders vd) ++ concatMap (\(GuardedExpr grd v) -> fmap (k' s) grd ++ [g'' s v]) (valdeclExpression vd))
   f' s (BindingGroupDeclaration ds) = foldl (<>.) r0 (fmap (\(_, _, val) -> g'' s val) ds)
   f' s (TypeClassDeclaration _ _ _ _ _ ds) = foldl (<>.) r0 (fmap (f'' s) ds)
-  f' s (TypeInstanceDeclaration _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldl (<>.) r0 (fmap (f'' s) ds)
+  f' s (TypeInstanceDeclaration _ _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldl (<>.) r0 (fmap (f'' s) ds)
   f' _ _ = r0
 
   g'' :: s -> Expr -> r
@@ -465,7 +465,7 @@
     ValueDecl sa name nameKind <$> traverse (h'' s) bs <*> traverse (guardedExprM (k' s) (g'' s)) val
   f' s (BindingGroupDeclaration ds) = BindingGroupDeclaration <$> traverse (thirdM (g'' s)) ds
   f' s (TypeClassDeclaration sa name args implies deps ds) = TypeClassDeclaration sa name args implies deps <$> traverse (f'' s) ds
-  f' s (TypeInstanceDeclaration sa ch idx name cs className args ds) = TypeInstanceDeclaration sa ch idx name cs className args <$> traverseTypeInstanceBody (traverse (f'' s)) ds
+  f' s (TypeInstanceDeclaration sa na ch idx name cs className args ds) = TypeInstanceDeclaration sa na ch idx name cs className args <$> traverseTypeInstanceBody (traverse (f'' s)) ds
   f' _ other = return other
 
   g'' s = uncurry g' <=< g s
@@ -569,7 +569,7 @@
     let s' = S.union s (S.fromList (NEL.toList (fmap (\((_, name), _, _) -> ToplevelIdent name) ds)))
     in foldMap (\(_, _, val) -> g'' s' val) ds
   f' s (TypeClassDeclaration _ _ _ _ _ ds) = foldMap (f'' s) ds
-  f' s (TypeInstanceDeclaration _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldMap (f'' s) ds
+  f' s (TypeInstanceDeclaration _ _ _ _ _ _ _ _ (ExplicitInstance ds)) = foldMap (f'' s) ds
   f' _ _ = mempty
 
   g'' :: S.Set ScopedIdent -> Expr -> r
@@ -677,7 +677,7 @@
   forDecls (TypeClassDeclaration _ _ args implies _ _) =
     foldMap (foldMap (foldMap f)) args <>
     foldMap (foldMap f . constraintArgs) implies
-  forDecls (TypeInstanceDeclaration _ _ _ _ cs _ tys _) =
+  forDecls (TypeInstanceDeclaration _ _ _ _ _ cs _ tys _) =
     foldMap (foldMap f . constraintArgs) cs <> foldMap f tys
   forDecls (TypeSynonymDeclaration _ _ args ty) =
     foldMap (foldMap f . snd) args <>
diff --git a/src/Language/PureScript/Bundle.hs b/src/Language/PureScript/Bundle.hs
--- a/src/Language/PureScript/Bundle.hs
+++ b/src/Language/PureScript/Bundle.hs
@@ -16,7 +16,7 @@
   , Module
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Error.Class
 
diff --git a/src/Language/PureScript/CST/Convert.hs b/src/Language/PureScript/CST/Convert.hs
--- a/src/Language/PureScript/CST/Convert.hs
+++ b/src/Language/PureScript/CST/Convert.hs
@@ -477,7 +477,8 @@
       chainId = mkChainId fileName $ startSourcePos $ instKeyword $ instHead $ sepHead insts
       goInst ix inst@(Instance (InstanceHead _ nameSep ctrs cls args) bd) = do
         let ann' = uncurry (sourceAnnCommented fileName) $ instanceRange inst
-        AST.TypeInstanceDeclaration ann' chainId ix
+            clsAnn = findInstanceAnn cls args
+        AST.TypeInstanceDeclaration ann' clsAnn chainId ix
           (mkPartialInstanceName nameSep cls args)
           (convertConstraint fileName <$> maybe [] (toList . fst) ctrs)
           (qualified cls)
@@ -491,7 +492,8 @@
       instTy
         | isJust new = AST.NewtypeInstance
         | otherwise = AST.DerivedInstance
-    pure $ AST.TypeInstanceDeclaration ann chainId 0 name'
+      clsAnn = findInstanceAnn cls args
+    pure $ AST.TypeInstanceDeclaration ann clsAnn chainId 0 name'
       (convertConstraint fileName <$> maybe [] (toList . fst) ctrs)
       (qualified cls)
       (convertType fileName <$> args)
@@ -600,6 +602,12 @@
     binding@(InstanceBindingName _ fields) -> do
       let ann' = uncurry (sourceAnnCommented fileName) $ instanceBindingRange binding
       convertValueBindingFields fileName ann' fields
+
+  findInstanceAnn cls args = uncurry (sourceAnnCommented fileName) $
+    if null args then
+      qualRange cls
+    else
+      (fst $ qualRange cls, snd $ typeRange $ last args)
 
 convertSignature :: String -> Labeled (Name Ident) (Type a) -> AST.Declaration
 convertSignature fileName (Labeled a _ b) = do
diff --git a/src/Language/PureScript/CST/Positions.hs b/src/Language/PureScript/CST/Positions.hs
--- a/src/Language/PureScript/CST/Positions.hs
+++ b/src/Language/PureScript/CST/Positions.hs
@@ -191,7 +191,7 @@
 
 classHeadRange :: ClassHead a -> TokenRange
 classHeadRange (ClassHead kw _ name vars fdeps)
-  | Just (_, fs) <- fdeps = (kw, snd .classFundepRange $ sepLast fs)
+  | Just (_, fs) <- fdeps = (kw, snd . classFundepRange $ sepLast fs)
   | [] <- vars = (kw, snd $ nameRange name)
   | otherwise = (kw, snd . typeVarBindingRange $ last vars)
 
diff --git a/src/Language/PureScript/CodeGen/JS.hs b/src/Language/PureScript/CodeGen/JS.hs
--- a/src/Language/PureScript/CodeGen/JS.hs
+++ b/src/Language/PureScript/CodeGen/JS.hs
@@ -6,7 +6,7 @@
   , moduleToJs
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Applicative (liftA2)
diff --git a/src/Language/PureScript/CodeGen/JS/Common.hs b/src/Language/PureScript/CodeGen/JS/Common.hs
--- a/src/Language/PureScript/CodeGen/JS/Common.hs
+++ b/src/Language/PureScript/CodeGen/JS/Common.hs
@@ -1,7 +1,7 @@
 -- | Common code generation utility functions
 module Language.PureScript.CodeGen.JS.Common where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Char
 import Data.Text (Text)
diff --git a/src/Language/PureScript/CodeGen/JS/Printer.hs b/src/Language/PureScript/CodeGen/JS/Printer.hs
--- a/src/Language/PureScript/CodeGen/JS/Printer.hs
+++ b/src/Language/PureScript/CodeGen/JS/Printer.hs
@@ -4,7 +4,7 @@
   , prettyPrintJSWithSourceMaps
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow ((<+>))
 import Control.Monad (forM, mzero)
diff --git a/src/Language/PureScript/Comments.hs b/src/Language/PureScript/Comments.hs
--- a/src/Language/PureScript/Comments.hs
+++ b/src/Language/PureScript/Comments.hs
@@ -5,7 +5,7 @@
 --
 module Language.PureScript.Comments where
 
-import Prelude.Compat
+import Prelude
 import Codec.Serialise (Serialise)
 import Control.DeepSeq (NFData)
 import Data.Text (Text)
diff --git a/src/Language/PureScript/Constants/Data/Foldable.hs b/src/Language/PureScript/Constants/Data/Foldable.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/PureScript/Constants/Data/Foldable.hs
@@ -0,0 +1,28 @@
+module Language.PureScript.Constants.Data.Foldable where
+
+import Data.String (IsString)
+import Language.PureScript.Names
+
+foldl :: forall a. (IsString a) => a
+foldl = "foldl"
+
+foldr :: forall a. (IsString a) => a
+foldr = "foldr"
+
+foldMap :: forall a. (IsString a) => a
+foldMap = "foldMap"
+
+pattern DataFoldable :: ModuleName
+pattern DataFoldable = ModuleName "Data.Foldable"
+
+pattern Foldable :: Qualified (ProperName 'ClassName)
+pattern Foldable = Qualified (ByModuleName DataFoldable) (ProperName "Foldable")
+
+identFoldl :: Qualified Ident
+identFoldl = Qualified (ByModuleName DataFoldable) (Ident foldl)
+
+identFoldr :: Qualified Ident
+identFoldr = Qualified (ByModuleName DataFoldable) (Ident foldr)
+
+identFoldMap :: Qualified Ident
+identFoldMap = Qualified (ByModuleName DataFoldable) (Ident foldMap)
diff --git a/src/Language/PureScript/Constants/Data/Traversable.hs b/src/Language/PureScript/Constants/Data/Traversable.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/PureScript/Constants/Data/Traversable.hs
@@ -0,0 +1,19 @@
+module Language.PureScript.Constants.Data.Traversable where
+
+import Data.String (IsString)
+import Language.PureScript.Names
+
+traverse :: forall a. (IsString a) => a
+traverse = "traverse"
+
+sequence :: forall a. (IsString a) => a
+sequence = "sequence"
+
+pattern DataTraversable :: ModuleName
+pattern DataTraversable = ModuleName "Data.Traversable"
+
+pattern Traversable :: Qualified (ProperName 'ClassName)
+pattern Traversable = Qualified (ByModuleName DataTraversable) (ProperName "Traversable")
+
+identTraverse :: Qualified Ident
+identTraverse = Qualified (ByModuleName DataTraversable) (Ident traverse)
diff --git a/src/Language/PureScript/Constants/Prelude.hs b/src/Language/PureScript/Constants/Prelude.hs
--- a/src/Language/PureScript/Constants/Prelude.hs
+++ b/src/Language/PureScript/Constants/Prelude.hs
@@ -16,6 +16,9 @@
 append :: forall a. (IsString a) => a
 append = "append"
 
+mempty :: forall a. (IsString a) => a
+mempty = "mempty"
+
 bind :: forall a. (IsString a) => a
 bind = "bind"
 
@@ -169,6 +172,12 @@
 runEffectFn :: forall a. (IsString a) => a
 runEffectFn = "runEffectFn"
 
+mkSTFn :: forall a. (IsString a) => a
+mkSTFn = "mkSTFn"
+
+runSTFn :: forall a. (IsString a) => a
+runSTFn = "runSTFn"
+
 -- Type Class Dictionary Names
 
 data EffectDictionaries = EffectDictionaries
@@ -316,9 +325,24 @@
 pattern ST :: ModuleName
 pattern ST = ModuleName "Control.Monad.ST.Internal"
 
+pattern ControlApply :: ModuleName
+pattern ControlApply = ModuleName "Control.Apply"
+
+pattern Apply :: Qualified (ProperName 'ClassName)
+pattern Apply = Qualified (ByModuleName ControlApply) (ProperName "Apply")
+
+identApply :: Qualified Ident
+identApply = Qualified (ByModuleName ControlApply) (Ident apply)
+
 pattern ControlApplicative :: ModuleName
 pattern ControlApplicative = ModuleName "Control.Applicative"
 
+pattern Applicative :: Qualified (ProperName 'ClassName)
+pattern Applicative = Qualified (ByModuleName ControlApplicative) (ProperName "Applicative")
+
+identPure :: Qualified Ident
+identPure = Qualified (ByModuleName ControlApplicative) (Ident pure')
+
 pattern ControlSemigroupoid :: ModuleName
 pattern ControlSemigroupoid = ModuleName "Control.Semigroupoid"
 
@@ -328,18 +352,36 @@
 pattern ControlCategory :: ModuleName
 pattern ControlCategory = ModuleName "Control.Category"
 
+pattern Category :: Qualified (ProperName 'ClassName)
+pattern Category = Qualified (ByModuleName ControlCategory) (ProperName "Category")
+
+identIdentity :: Qualified Ident
+identIdentity = Qualified (ByModuleName ControlCategory) (Ident identity)
+
 pattern ControlMonadEffUncurried :: ModuleName
 pattern ControlMonadEffUncurried = ModuleName "Control.Monad.Eff.Uncurried"
 
 pattern EffectUncurried :: ModuleName
 pattern EffectUncurried = ModuleName "Effect.Uncurried"
 
+pattern ControlMonadSTUncurried :: ModuleName
+pattern ControlMonadSTUncurried = ModuleName "Control.Monad.ST.Uncurried"
+
 pattern DataBounded :: ModuleName
 pattern DataBounded = ModuleName "Data.Bounded"
 
 pattern DataSemigroup :: ModuleName
 pattern DataSemigroup = ModuleName "Data.Semigroup"
 
+identAppend :: Qualified Ident
+identAppend = Qualified (ByModuleName DataSemigroup) (Ident append)
+
+pattern DataMonoid :: ModuleName
+pattern DataMonoid = ModuleName "Data.Monoid"
+
+identMempty :: Qualified Ident
+identMempty = Qualified (ByModuleName DataMonoid) (Ident mempty)
+
 pattern DataHeytingAlgebra :: ModuleName
 pattern DataHeytingAlgebra = ModuleName "Data.HeytingAlgebra"
 
@@ -393,6 +435,12 @@
 
 pattern DataFunction :: ModuleName
 pattern DataFunction = ModuleName "Data.Function"
+
+identFlip :: Qualified Ident
+identFlip = Qualified (ByModuleName DataFunction) (Ident flip)
+
+flip :: forall a. (IsString a) => a
+flip = "flip"
 
 pattern DataIntBits :: ModuleName
 pattern DataIntBits = ModuleName "Data.Int.Bits"
diff --git a/src/Language/PureScript/CoreFn/Ann.hs b/src/Language/PureScript/CoreFn/Ann.hs
--- a/src/Language/PureScript/CoreFn/Ann.hs
+++ b/src/Language/PureScript/CoreFn/Ann.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.CoreFn.Ann where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.AST.SourcePos
 import Language.PureScript.Comments
diff --git a/src/Language/PureScript/CoreFn/Binders.hs b/src/Language/PureScript/CoreFn/Binders.hs
--- a/src/Language/PureScript/CoreFn/Binders.hs
+++ b/src/Language/PureScript/CoreFn/Binders.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.CoreFn.Binders where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.AST.Literals
 import Language.PureScript.Names
diff --git a/src/Language/PureScript/CoreFn/CSE.hs b/src/Language/PureScript/CoreFn/CSE.hs
--- a/src/Language/PureScript/CoreFn/CSE.hs
+++ b/src/Language/PureScript/CoreFn/CSE.hs
@@ -157,6 +157,9 @@
   { _depth :: Int
     -- ^ number of enclosing binding scopes (this includes not only Abs, but
     -- Let and CaseAlternative bindings)
+  , _deepestTopLevelScope :: Int
+    -- ^ number of enclosing binding scopes outside the first Abs; used to
+    -- decide whether to qualify floated identifiers
   , _bound :: M.Map Ident (Int, BindingType)
     -- ^ map from identifiers to depth in which they are bound and whether
     -- or not the binding is recursive
@@ -186,7 +189,7 @@
 -- didn't end up needing to be floated.
 --
 runCSEMonad :: CSEMonad a -> Supply (a, M.Map Ident (Expr Ann))
-runCSEMonad x = second (^. toBeReinlined) <$> evalRWST x (CSEEnvironment 0 M.empty) IM.empty
+runCSEMonad x = second (^. toBeReinlined) <$> evalRWST x (CSEEnvironment 0 0 M.empty) IM.empty
 
 -- |
 -- Mark all expressions floated out of this computation as "plural". This pass
@@ -201,14 +204,20 @@
 -- |
 -- Run the provided computation in a new scope.
 --
-newScope :: (HasCSEReader m, HasCSEWriter m) => (Int -> m a) -> m a
-newScope body = local (depth %~ succ) $ do
+newScope :: (HasCSEReader m, HasCSEWriter m) => Bool -> (Int -> m a) -> m a
+newScope isAbs body = local goDeeper $ do
   d <- view depth
   censor (filterToDepth d) (body d)
   where
   filterToDepth d
     = (scopesUsed %~ IS.filter (< d))
     . (noFloatWithin %~ find (< Min d))
+  goDeeper env@CSEEnvironment{..} =
+    if isAbs || _deepestTopLevelScope /= _depth
+    then env{ _depth = depth' }
+    else env{ _depth = depth', _deepestTopLevelScope = depth' }
+    where 
+    depth' = succ _depth
 
 -- |
 -- Record a list of identifiers as being bound in the given scope.
@@ -220,8 +229,8 @@
 -- Run the provided computation in a new scope in which the provided
 -- identifiers are bound non-recursively.
 --
-newScopeWithIdents :: (HasCSEReader m, HasCSEWriter m) => [Ident] -> m a -> m a
-newScopeWithIdents idents = newScope . flip (withBoundIdents idents . (, NonRecursive))
+newScopeWithIdents :: (HasCSEReader m, HasCSEWriter m) => Bool -> [Ident] -> m a -> m a
+newScopeWithIdents isAbs idents = newScope isAbs . flip (withBoundIdents idents . (, NonRecursive))
 
 -- |
 -- Produce, or retrieve from the state, an identifier for referencing the given
@@ -261,7 +270,7 @@
 replaceLocals :: M.Map Ident (Expr Ann) -> [Bind Ann] -> [Bind Ann]
 replaceLocals m = if M.null m then identity else map f' where
   (f', g', _) = everywhereOnValues identity f identity
-  f e@(Var _ (Qualified (BySourcePos _) ident)) = maybe e g' $ ident `M.lookup` m
+  f e@(Var _ (Qualified _ ident)) = maybe e g' $ ident `M.lookup` m
   f e = e
 
 -- |
@@ -270,17 +279,20 @@
 -- replacement.
 --
 floatExpr
-  :: (HasCSEState m, MonadSupply m)
-  => (Expr Ann, CSESummary)
+  :: (HasCSEReader m, HasCSEState m, MonadSupply m)
+  => QualifiedBy
+  -> (Expr Ann, CSESummary)
   -> m (Expr Ann, CSESummary)
-floatExpr = \case
+floatExpr topLevelQB = \case
   (e, w@CSESummary{ _noFloatWithin = Nothing, .. }) -> do
     let deepestScope = if IS.null _scopesUsed then 0 else IS.findMax _scopesUsed
     (isNew, ident) <- generateIdentFor deepestScope (void e)
+    topLevel <- view deepestTopLevelScope
+    let qb = if deepestScope > topLevel then ByNullSourcePos else topLevelQB
     let w' = w
           & (if isNew then newBindings %~ addToScope deepestScope [(ident, (_plurality, e))] else identity)
           & plurality .~ PluralityMap (M.singleton ident False)
-    pure (Var nullAnn (Qualified ByNullSourcePos ident), w')
+    pure (Var nullAnn (Qualified qb ident), w')
   (e, w) -> pure (e, w)
 
 -- |
@@ -388,16 +400,18 @@
 
   (handleBind, handleExprDefault, handleBinder, _) = traverseCoreFn handleBind handleExpr handleBinder handleCaseAlternative
 
+  topLevelQB = ByModuleName mn
+
   handleExpr :: Expr Ann -> CSEMonad (Expr Ann)
-  handleExpr = discuss (ifM (shouldFloatExpr . fst) floatExpr pure) . \case
-    Abs a ident e   -> enterAbs $ Abs a ident <$> newScopeWithIdents [ident] (handleAndWrapExpr e)
+  handleExpr = discuss (ifM (shouldFloatExpr . fst) (floatExpr topLevelQB) pure) . \case
+    Abs a ident e   -> enterAbs $ Abs a ident <$> newScopeWithIdents True [ident] (handleAndWrapExpr e)
     v@(Var _ qname) -> summarizeName mn qname $> v
     Let a bs e      -> uncurry (Let a) <$> handleBinds (handleExpr e) bs
     x               -> handleExprDefault x
 
   handleCaseAlternative :: CaseAlternative Ann -> CSEMonad (CaseAlternative Ann)
   handleCaseAlternative (CaseAlternative bs x) = CaseAlternative bs <$> do
-    newScopeWithIdents (identsFromBinders bs) $
+    newScopeWithIdents False (identsFromBinders bs) $
       bitraverse (traverse $ bitraverse handleAndWrapExpr handleAndWrapExpr) handleAndWrapExpr x
 
   handleBinds :: forall a. CSEMonad a -> [Bind Ann] -> CSEMonad ([Bind Ann], a)
@@ -409,14 +423,14 @@
       -- inner thing all these Binds are applied to.
       NonRec a ident e -> do
         e' <- handleExpr e
-        newScopeWithIdents [ident] $
+        newScopeWithIdents False [ident] $
           prependToNewBindsFromInner $ NonRec a ident e'
       Rec es ->
         -- For a Rec Bind, the bound expressions need a new scope in which all
         -- these identifiers are bound recursively; then the remaining Binds
         -- and the inner thing can be traversed in the same scope with the same
         -- identifiers now bound non-recursively.
-        newScope $ \d -> do
+        newScope False $ \d -> do
           let idents = map (snd . fst) es
           es' <- withBoundIdents idents (d, Recursive) $ traverse (traverse handleExpr) es
           withBoundIdents idents (d, NonRecursive) $
diff --git a/src/Language/PureScript/CoreFn/Desugar.hs b/src/Language/PureScript/CoreFn/Desugar.hs
--- a/src/Language/PureScript/CoreFn/Desugar.hs
+++ b/src/Language/PureScript/CoreFn/Desugar.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.CoreFn.Desugar (moduleToCoreFn) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub, orEmpty)
 
 import Control.Arrow (second)
@@ -213,7 +213,7 @@
   in f `concatMap` decls
   where
   fqDecls :: A.Declaration -> [ModuleName]
-  fqDecls (A.TypeInstanceDeclaration _ _ _ _ _ q _ _) = getQual' q
+  fqDecls (A.TypeInstanceDeclaration _ _ _ _ _ _ q _ _) = getQual' q
   fqDecls (A.ValueFixityDeclaration _ _ q _) = getQual' q
   fqDecls (A.TypeFixityDeclaration _ _ q _) = getQual' q
   fqDecls _ = []
diff --git a/src/Language/PureScript/CoreFn/Expr.hs b/src/Language/PureScript/CoreFn/Expr.hs
--- a/src/Language/PureScript/CoreFn/Expr.hs
+++ b/src/Language/PureScript/CoreFn/Expr.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.CoreFn.Expr where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow ((***))
 
diff --git a/src/Language/PureScript/CoreFn/FromJSON.hs b/src/Language/PureScript/CoreFn/FromJSON.hs
--- a/src/Language/PureScript/CoreFn/FromJSON.hs
+++ b/src/Language/PureScript/CoreFn/FromJSON.hs
@@ -7,7 +7,7 @@
   , parseVersion'
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import           Control.Applicative ((<|>))
 
diff --git a/src/Language/PureScript/CoreFn/Meta.hs b/src/Language/PureScript/CoreFn/Meta.hs
--- a/src/Language/PureScript/CoreFn/Meta.hs
+++ b/src/Language/PureScript/CoreFn/Meta.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.CoreFn.Meta where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.Names
 
diff --git a/src/Language/PureScript/CoreFn/Module.hs b/src/Language/PureScript/CoreFn/Module.hs
--- a/src/Language/PureScript/CoreFn/Module.hs
+++ b/src/Language/PureScript/CoreFn/Module.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.CoreFn.Module where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Map.Strict (Map)
 
diff --git a/src/Language/PureScript/CoreFn/ToJSON.hs b/src/Language/PureScript/CoreFn/ToJSON.hs
--- a/src/Language/PureScript/CoreFn/ToJSON.hs
+++ b/src/Language/PureScript/CoreFn/ToJSON.hs
@@ -7,7 +7,7 @@
   ( moduleToJSON
   ) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Arrow ((***))
 import           Data.Either (isLeft)
diff --git a/src/Language/PureScript/CoreFn/Traversals.hs b/src/Language/PureScript/CoreFn/Traversals.hs
--- a/src/Language/PureScript/CoreFn/Traversals.hs
+++ b/src/Language/PureScript/CoreFn/Traversals.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.CoreFn.Traversals where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow (second, (***), (+++))
 import Data.Bitraversable (bitraverse)
diff --git a/src/Language/PureScript/CoreImp/AST.hs b/src/Language/PureScript/CoreImp/AST.hs
--- a/src/Language/PureScript/CoreImp/AST.hs
+++ b/src/Language/PureScript/CoreImp/AST.hs
@@ -1,7 +1,7 @@
 -- | Data types for the imperative core AST
 module Language.PureScript.CoreImp.AST where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad ((>=>))
 import Control.Monad.Identity (Identity(..), runIdentity)
diff --git a/src/Language/PureScript/CoreImp/Optimizer.hs b/src/Language/PureScript/CoreImp/Optimizer.hs
--- a/src/Language/PureScript/CoreImp/Optimizer.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer.hs
@@ -19,7 +19,7 @@
 --  * Inlining primitive JavaScript operators
 module Language.PureScript.CoreImp.Optimizer (optimize) where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Text (Text)
 
diff --git a/src/Language/PureScript/CoreImp/Optimizer/Blocks.hs b/src/Language/PureScript/CoreImp/Optimizer/Blocks.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/Blocks.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/Blocks.hs
@@ -4,7 +4,7 @@
   , collapseNestedIfs
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.CoreImp.AST
 
diff --git a/src/Language/PureScript/CoreImp/Optimizer/Common.hs b/src/Language/PureScript/CoreImp/Optimizer/Common.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/Common.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/Common.hs
@@ -1,7 +1,7 @@
 -- | Common functions used by the various optimizer phases
 module Language.PureScript.CoreImp.Optimizer.Common where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Text (Text)
 import Data.List (foldl')
diff --git a/src/Language/PureScript/CoreImp/Optimizer/Inliner.hs b/src/Language/PureScript/CoreImp/Optimizer/Inliner.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/Inliner.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/Inliner.hs
@@ -12,7 +12,7 @@
   , evaluateIifes
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Supply.Class (MonadSupply, freshName)
 
@@ -171,7 +171,8 @@
   ] ++
   [ fn | i <- [0..10], fn <- [ mkFn i, runFn i ] ] ++
   [ fn | i <- [0..10], fn <- [ mkEffFn C.ControlMonadEffUncurried C.mkEffFn i, runEffFn C.ControlMonadEffUncurried C.runEffFn i ] ] ++
-  [ fn | i <- [0..10], fn <- [ mkEffFn C.EffectUncurried C.mkEffectFn i, runEffFn C.EffectUncurried C.runEffectFn i ] ]
+  [ fn | i <- [0..10], fn <- [ mkEffFn C.EffectUncurried C.mkEffectFn i, runEffFn C.EffectUncurried C.runEffectFn i ] ] ++
+  [ fn | i <- [0..10], fn <- [ mkEffFn C.ControlMonadSTUncurried C.mkSTFn i, runEffFn C.ControlMonadSTUncurried C.runSTFn i ] ]
   where
   binary :: (ModuleName, PSString) -> (ModuleName, PSString) -> BinaryOperator -> AST -> AST
   binary dict fns op = convert where
diff --git a/src/Language/PureScript/CoreImp/Optimizer/MagicDo.hs b/src/Language/PureScript/CoreImp/Optimizer/MagicDo.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/MagicDo.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/MagicDo.hs
@@ -2,7 +2,7 @@
 -- and bind for the Eff monad, as well as some of its actions.
 module Language.PureScript.CoreImp.Optimizer.MagicDo (magicDoEffect, magicDoEff, magicDoST, inlineST) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Data.Maybe (fromJust, isJust)
diff --git a/src/Language/PureScript/CoreImp/Optimizer/TCO.hs b/src/Language/PureScript/CoreImp/Optimizer/TCO.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/TCO.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/TCO.hs
@@ -1,7 +1,7 @@
 -- | This module implements tail call elimination.
 module Language.PureScript.CoreImp.Optimizer.TCO (tco) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Applicative (empty, liftA2)
 import Control.Monad (guard)
diff --git a/src/Language/PureScript/CoreImp/Optimizer/Unused.hs b/src/Language/PureScript/CoreImp/Optimizer/Unused.hs
--- a/src/Language/PureScript/CoreImp/Optimizer/Unused.hs
+++ b/src/Language/PureScript/CoreImp/Optimizer/Unused.hs
@@ -5,7 +5,7 @@
   , removeUnusedEffectFreeVars
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (filterM)
 import Data.Monoid (Any(..))
diff --git a/src/Language/PureScript/Crash.hs b/src/Language/PureScript/Crash.hs
--- a/src/Language/PureScript/Crash.hs
+++ b/src/Language/PureScript/Crash.hs
@@ -1,21 +1,8 @@
-{-# LANGUAGE CPP #-}
-
-module Language.PureScript.Crash where
-
-import Prelude.Compat
+module Language.PureScript.Crash (HasCallStack, internalError) where
 
-import qualified GHC.Stack
+import Prelude
 
--- | A compatibility wrapper for the @GHC.Stack.HasCallStack@ constraint.
-#if __GLASGOW_HASKELL__ >= 800
-type HasCallStack = GHC.Stack.HasCallStack
-#elif MIN_VERSION_GLASGOW_HASKELL(7,10,2,0)
-type HasCallStack = (?callStack :: GHC.Stack.CallStack)
-#else
-import GHC.Exts (Constraint)
--- CallStack wasn't present in GHC 7.10.1
-type HasCallStack = (() :: Constraint)
-#endif
+import GHC.Stack (HasCallStack)
 
 -- | Exit with an error message and a crash report link.
 internalError :: HasCallStack => String -> a
diff --git a/src/Language/PureScript/Docs/AsMarkdown.hs b/src/Language/PureScript/Docs/AsMarkdown.hs
--- a/src/Language/PureScript/Docs/AsMarkdown.hs
+++ b/src/Language/PureScript/Docs/AsMarkdown.hs
@@ -5,7 +5,7 @@
   , codeToString
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (unless, zipWithM_)
 import Control.Monad.Writer (Writer, tell, execWriter)
diff --git a/src/Language/PureScript/Docs/Convert/ReExports.hs b/src/Language/PureScript/Docs/Convert/ReExports.hs
--- a/src/Language/PureScript/Docs/Convert/ReExports.hs
+++ b/src/Language/PureScript/Docs/Convert/ReExports.hs
@@ -2,7 +2,7 @@
   ( updateReExports
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow ((&&&), first, second)
 import Control.Monad
@@ -12,9 +12,9 @@
 import Control.Monad.Trans.State.Strict (execState)
 
 import Data.Either
-import Data.Foldable (traverse_)
+import Data.Foldable (fold, traverse_)
 import Data.Map (Map)
-import Data.Maybe (mapMaybe, fromMaybe)
+import Data.Maybe (mapMaybe)
 import qualified Data.Map as Map
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -177,7 +177,7 @@
       mapMaybe (\(exportSrc, ref) -> (,exportSrc) <$> f ref) reExports
 
   expCtors :: [P.ProperName 'P.ConstructorName]
-  expCtors = concatMap (fromMaybe [] . (>>= snd) . P.getTypeRef . snd) reExports
+  expCtors = concatMap (fold . (snd <=< P.getTypeRef . snd)) reExports
 
 lookupValueDeclaration ::
   forall m.
diff --git a/src/Language/PureScript/Docs/Convert/Single.hs b/src/Language/PureScript/Docs/Convert/Single.hs
--- a/src/Language/PureScript/Docs/Convert/Single.hs
+++ b/src/Language/PureScript/Docs/Convert/Single.hs
@@ -134,7 +134,7 @@
 getDeclarationTitle (P.ExternDataDeclaration _ name _) = Just (P.runProperName name)
 getDeclarationTitle (P.TypeSynonymDeclaration _ name _ _) = Just (P.runProperName name)
 getDeclarationTitle (P.TypeClassDeclaration _ name _ _ _ _) = Just (P.runProperName name)
-getDeclarationTitle (P.TypeInstanceDeclaration _ _ _ name _ _ _ _) = Just $ either (const "<anonymous>") P.showIdent name
+getDeclarationTitle (P.TypeInstanceDeclaration _ _ _ _ name _ _ _ _) = Just $ either (const "<anonymous>") P.showIdent name
 getDeclarationTitle (P.TypeFixityDeclaration _ _ _ op) = Just ("type " <> P.showOp op)
 getDeclarationTitle (P.ValueFixityDeclaration _ _ _ op) = Just (P.showOp op)
 getDeclarationTitle (P.KindDeclaration _ _ n _) = Just (P.runProperName n)
@@ -187,7 +187,7 @@
     ChildDeclaration (P.showIdent ident') (convertComments com) (Just ss) (ChildTypeClassMember (ty $> ()))
   convertClassMember _ =
     P.internalError "convertDeclaration: Invalid argument to convertClassMember."
-convertDeclaration (P.TypeInstanceDeclaration (ss, com) _ _ _ constraints className tys _) title =
+convertDeclaration (P.TypeInstanceDeclaration (ss, com) _ _ _ _ constraints className tys _) title =
   Just (Left ((classNameString, AugmentClass) : map (, AugmentType) typeNameStrings, AugmentChild childDecl))
   where
   classNameString = unQual className
diff --git a/src/Language/PureScript/Docs/Prim.hs b/src/Language/PureScript/Docs/Prim.hs
--- a/src/Language/PureScript/Docs/Prim.hs
+++ b/src/Language/PureScript/Docs/Prim.hs
@@ -6,7 +6,7 @@
   , primModules
   ) where
 
-import Prelude.Compat hiding (fail)
+import Prelude hiding (fail)
 import Data.Functor (($>))
 import Data.Text (Text)
 import qualified Data.Text as T
diff --git a/src/Language/PureScript/Docs/Render.hs b/src/Language/PureScript/Docs/Render.hs
--- a/src/Language/PureScript/Docs/Render.hs
+++ b/src/Language/PureScript/Docs/Render.hs
@@ -9,7 +9,7 @@
 
 module Language.PureScript.Docs.Render where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Maybe (maybeToList)
 import Data.Text (Text)
diff --git a/src/Language/PureScript/Docs/RenderedCode/RenderType.hs b/src/Language/PureScript/Docs/RenderedCode/RenderType.hs
--- a/src/Language/PureScript/Docs/RenderedCode/RenderType.hs
+++ b/src/Language/PureScript/Docs/RenderedCode/RenderType.hs
@@ -12,7 +12,7 @@
   , renderRow
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Maybe (fromMaybe)
 import Data.Text (Text, pack)
diff --git a/src/Language/PureScript/Docs/RenderedCode/Types.hs b/src/Language/PureScript/Docs/RenderedCode/Types.hs
--- a/src/Language/PureScript/Docs/RenderedCode/Types.hs
+++ b/src/Language/PureScript/Docs/RenderedCode/Types.hs
@@ -32,7 +32,7 @@
  , aliasName
  ) where
 
-import Prelude.Compat
+import Prelude
 import GHC.Generics (Generic)
 
 import Control.DeepSeq (NFData)
diff --git a/src/Language/PureScript/Environment.hs b/src/Language/PureScript/Environment.hs
--- a/src/Language/PureScript/Environment.hs
+++ b/src/Language/PureScript/Environment.hs
@@ -1,21 +1,22 @@
 module Language.PureScript.Environment where
 
-import Prelude.Compat
-import Protolude (ordNub)
+import Prelude
 
 import GHC.Generics (Generic)
 import Control.DeepSeq (NFData)
+import Control.Monad (unless)
 import Codec.Serialise (Serialise)
 import Data.Aeson ((.=), (.:))
 import qualified Data.Aeson as A
+import Data.Foldable (find, fold)
+import qualified Data.IntMap as IM
+import qualified Data.IntSet as IS
 import qualified Data.Map as M
 import qualified Data.Set as S
-import Data.Maybe (fromMaybe, mapMaybe)
+import Data.Maybe (fromMaybe)
+import Data.Semigroup (First(..))
 import Data.Text (Text)
 import qualified Data.Text as T
-import Data.Tree (Tree, rootLabel)
-import qualified Data.Graph as G
-import Data.Foldable (toList)
 import qualified Data.List.NonEmpty as NEL
 
 import Language.PureScript.AST.SourcePos
@@ -129,49 +130,87 @@
   -> TypeClassData
 makeTypeClassData args m s deps = TypeClassData args m s deps determinedArgs coveringSets
   where
-    argumentIndices = [0 .. length args - 1]
+    ( determinedArgs, coveringSets ) = computeCoveringSets (length args) deps
 
-    -- each argument determines themselves
-    identities = (\i -> (i, [i])) <$> argumentIndices
+-- A moving frontier of sets to consider, along with the fundeps that can be
+-- applied in each case. At each stage, all sets in the frontier will be the
+-- same size, decreasing by 1 each time.
+type Frontier = M.Map IS.IntSet (First (IM.IntMap (NEL.NonEmpty IS.IntSet)))
+--                         ^                 ^          ^          ^
+--         when *these* parameters           |          |          |
+--         are still needed,                 |          |          |
+--                              *these* parameters      |          |
+--                              can be determined       |          |
+--                                         from a non-zero         |
+--                                         number of fundeps,      |
+--                                                      which accept *these*
+--                                                      parameters as inputs.
 
-    -- list all the edges in the graph: for each fundep an edge exists for each determiner to each determined
-    contributingDeps = M.fromListWith (++) $ identities ++ do
-      fd <- deps
-      src <- fdDeterminers fd
-      (src, fdDetermined fd) : map (, []) (fdDetermined fd)
+computeCoveringSets :: Int -> [FunctionalDependency] -> (S.Set Int, S.Set (S.Set Int))
+computeCoveringSets nargs deps = ( determinedArgs, coveringSets )
+  where
+    argumentIndices = S.fromList [0 .. nargs - 1]
 
-    -- build a graph of which arguments determine other arguments
-    (depGraph, fromVertex, fromKey) = G.graphFromEdges ((\(n, v) -> (n, n, ordNub v)) <$> M.toList contributingDeps)
+    -- Compute all sets of arguments that determine the remaining arguments via
+    -- functional dependencies. This is done in stages, where each stage
+    -- considers sets of the same size to share work.
+    allCoveringSets :: S.Set (S.Set Int)
+    allCoveringSets = S.map (S.fromDistinctAscList . IS.toAscList) $ fst $ search $
+      -- The initial frontier consists of just the set of all parameters and all
+      -- fundeps organized into the map structure.
+      M.singleton
+        (IS.fromList [0 .. nargs - 1]) $
+          First $ IM.fromListWith (<>) $ do
+            fd <- deps
+            let srcs = pure (IS.fromList (fdDeterminers fd))
+            tgt <- fdDetermined fd
+            pure (tgt, srcs)
 
-    -- do there exist any arguments that contribute to `arg` that `arg` doesn't contribute to
-    isFunDepDetermined :: Int -> Bool
-    isFunDepDetermined arg = case fromKey arg of
-      Nothing -> internalError "Unknown argument index in makeTypeClassData"
-      Just v -> let contributesToVar = G.reachable (G.transposeG depGraph) v
-                    varContributesTo = G.reachable depGraph v
-                in any (`notElem` varContributesTo) contributesToVar
+      where
 
-    -- find all the arguments that are determined
-    determinedArgs :: S.Set Int
-    determinedArgs = S.fromList $ filter isFunDepDetermined argumentIndices
+      -- Recursively advance the frontier until all frontiers are exhausted
+      -- and coverings sets found. The covering sets found during the process
+      -- are locally-minimal, in that none can be reduced by a fundep, but
+      -- there may be subsets found from other frontiers.
+      search :: Frontier -> (S.Set IS.IntSet, ())
+      search frontier = unless (null frontier) $ M.foldMapWithKey step frontier >>= search
 
-    argFromVertex :: G.Vertex -> Int
-    argFromVertex index = let (_, arg, _) = fromVertex index in arg
+      -- The input set from the frontier is known to cover all parameters, but
+      -- it may be able to be reduced by more fundeps.
+      step :: IS.IntSet -> First (IM.IntMap (NEL.NonEmpty IS.IntSet)) -> (S.Set IS.IntSet, Frontier)
+      step needed (First inEdges)
+        -- If there are no applicable fundeps, record it as a locally minimal
+        -- covering set. This has already been reduced to only applicable fundeps
+        | IM.null inEdges = (S.singleton needed, M.empty)
+        | otherwise       = (S.empty, foldMap removeParameter paramsToTry)
 
-    isVertexDetermined :: G.Vertex -> Bool
-    isVertexDetermined = isFunDepDetermined . argFromVertex
+          where
 
-    -- from an scc find the non-determined args
-    sccNonDetermined :: Tree G.Vertex -> Maybe [Int]
-    sccNonDetermined tree
-      -- if any arg in an scc is determined then all of them are
-      | isVertexDetermined (rootLabel tree) = Nothing
-      | otherwise = Just (argFromVertex <$> toList tree)
+          determined = IM.keys inEdges
+          -- If there is an acyclically determined functional dependency, prefer
+          -- it to reduce the number of cases to check. That is a dependency
+          -- that does not help determine other parameters.
+          acycDetermined = find (`IS.notMember` (IS.unions $ concatMap NEL.toList $ IM.elems inEdges)) determined
+          paramsToTry = maybe determined pure acycDetermined
 
-    -- find the covering sets
-    coveringSets :: S.Set (S.Set Int)
-    coveringSets = let funDepSets = sequence (mapMaybe sccNonDetermined (G.scc depGraph))
-                   in S.fromList (S.fromList <$> funDepSets)
+          -- For each parameter to be removed to build the next frontier,
+          -- delete the fundeps that determine it and filter out the fundeps
+          -- that make use of it. Of course, if it an acyclic fundep we already
+          -- found that there are none that use it.
+          removeParameter :: Int -> Frontier
+          removeParameter y =
+            M.singleton
+              (IS.delete y needed) $
+                case acycDetermined of
+                  Just _ -> First $ IM.delete y inEdges
+                  Nothing ->
+                    First $ IM.mapMaybe (NEL.nonEmpty . NEL.filter (y `IS.notMember`)) $ IM.delete y inEdges
+
+    -- Reduce to the inclusion-minimal sets
+    coveringSets = S.filter (\v -> not (any (\c -> c `S.isProperSubsetOf` v) allCoveringSets)) allCoveringSets
+
+    -- An argument is determined if it is in no covering set
+    determinedArgs = argumentIndices `S.difference` fold coveringSets
 
 -- | The visibility of a name in scope
 data NameVisibility
diff --git a/src/Language/PureScript/Errors.hs b/src/Language/PureScript/Errors.hs
--- a/src/Language/PureScript/Errors.hs
+++ b/src/Language/PureScript/Errors.hs
@@ -3,10 +3,11 @@
   , module Language.PureScript.Errors
   ) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Arrow ((&&&))
 import           Control.Exception (displayException)
+import           Control.Lens (both, head1, over)
 import           Control.Monad
 import           Control.Monad.Error.Class (MonadError(..))
 import           Control.Monad.Trans.State.Lazy
@@ -14,18 +15,22 @@
 import           Data.Bifunctor (first, second)
 import           Data.Bitraversable (bitraverse)
 import           Data.Char (isSpace)
+import           Data.Containers.ListUtils (nubOrdOn)
 import           Data.Either (partitionEithers)
 import           Data.Foldable (fold)
+import           Data.Function (on)
+import           Data.Functor (($>))
 import           Data.Functor.Identity (Identity(..))
-import           Data.List (transpose, nubBy, partition, dropWhileEnd, sortOn)
+import           Data.List (transpose, nubBy, partition, dropWhileEnd, sortOn, uncons)
 import qualified Data.List.NonEmpty as NEL
 import           Data.List.NonEmpty (NonEmpty((:|)))
-import           Data.Maybe (maybeToList, fromMaybe, mapMaybe)
+import           Data.Maybe (maybeToList, fromMaybe, isJust, mapMaybe)
 import qualified Data.Map as M
 import           Data.Ord (Down(..))
 import qualified Data.Set as S
 import qualified Data.Text as T
 import           Data.Text (Text)
+import           Data.Traversable (for)
 import qualified GHC.Stack
 import           Language.PureScript.AST
 import qualified Language.PureScript.Bundle as Bundle
@@ -45,7 +50,9 @@
 import           Language.PureScript.Types
 import qualified Language.PureScript.Publish.BoxesHelpers as BoxHelpers
 import qualified System.Console.ANSI as ANSI
+import           System.FilePath (makeRelative)
 import qualified Text.PrettyPrint.Boxes as Box
+import           Witherable (wither)
 
 -- | A type of error messages
 data SimpleErrorMessage
@@ -188,6 +195,7 @@
   | UnsupportedRoleDeclaration
   | RoleDeclarationArityMismatch (ProperName 'TypeName) Int Int
   | DuplicateRoleDeclaration (ProperName 'TypeName)
+  | CannotDeriveInvalidConstructorArg (Qualified (ProperName 'ClassName))
   deriving (Show)
 
 data ErrorMessage = ErrorMessage
@@ -199,10 +207,12 @@
 
 -- | Get the source span for an error
 errorSpan :: ErrorMessage -> Maybe (NEL.NonEmpty SourceSpan)
-errorSpan = findHint matchSpan
+errorSpan = findHint matchPE <> findHint matchRP
   where
-  matchSpan (PositionedError ss) = Just ss
-  matchSpan _ = Nothing
+  matchPE (PositionedError sss) = Just sss
+  matchPE _ = Nothing
+  matchRP (RelatedPositions sss) = Just sss
+  matchRP _ = Nothing
 
 -- | Get the module name for an error
 errorModule :: ErrorMessage -> Maybe ModuleName
@@ -353,6 +363,7 @@
   UnsupportedRoleDeclaration {} -> "UnsupportedRoleDeclaration"
   RoleDeclarationArityMismatch {} -> "RoleDeclarationArityMismatch"
   DuplicateRoleDeclaration {} -> "DuplicateRoleDeclaration"
+  CannotDeriveInvalidConstructorArg{} -> "CannotDeriveInvalidConstructorArg"
 
 -- | A stack trace for an error
 newtype MultipleErrors = MultipleErrors
@@ -577,7 +588,6 @@
         , Box.vcat Box.top $ replicate (Box.rows b) $ Box.text ansiColorReset
         ]
 
-
 -- | Default color intensity and color for code
 defaultCodeColor :: (ANSI.ColorIntensity, ANSI.Color)
 defaultCodeColor = (ANSI.Dull, ANSI.Yellow)
@@ -589,6 +599,7 @@
   , ppeLevel             :: Level -- ^ Should this report an error or a warning?
   , ppeShowDocs          :: Bool -- ^ Should show a link to error message's doc page?
   , ppeRelativeDirectory :: FilePath -- ^ FilePath to which the errors are relative
+  , ppeFileContents      :: [(FilePath, Text)] -- ^ Unparsed contents of source files
   }
 
 -- | Default options for PPEOptions
@@ -599,11 +610,12 @@
   , ppeLevel             = Error
   , ppeShowDocs          = True
   , ppeRelativeDirectory = mempty
+  , ppeFileContents      = []
   }
 
 -- | Pretty print a single error, simplifying if necessary
 prettyPrintSingleError :: PPEOptions -> ErrorMessage -> Box.Box
-prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath) e = flip evalState defaultUnknownMap $ do
+prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath fileContents) e = flip evalState defaultUnknownMap $ do
   em <- onTypesInErrorMessageM replaceUnknowns (if full then e else simplifyErrorMessage e)
   um <- get
   return (prettyPrintErrorMessage um em)
@@ -1367,6 +1379,13 @@
     renderSimpleErrorMessage (DuplicateRoleDeclaration name) =
       line $ "Duplicate role declaration for " <> markCode (runProperName name) <> "."
 
+    renderSimpleErrorMessage (CannotDeriveInvalidConstructorArg className) =
+      paras
+        [ line $ "One or more type variables are in positions that prevent " <> markCode (runProperName $ disqualify className) <> " from being derived."
+        , line $ "To derive this class, make sure that these variables are only used as the final arguments to type constructors, "
+          <> "and that those type constructors themselves have instances of " <> markCode (runProperName $ disqualify className) <> "."
+        ]
+
     renderHint :: ErrorMessageHint -> Box.Box -> Box.Box
     renderHint (ErrorUnifyingTypes t1@RCons{} t2@RCons{}) detail =
       let (row1Box, row2Box) = printRows t1 t2
@@ -1531,6 +1550,11 @@
       paras [ line $ "at " <> displaySourceSpan relPath (NEL.head srcSpan)
             , detail
             ]
+    renderHint (RelatedPositions srcSpans) detail =
+      paras
+        [ detail
+        , Box.moveRight 2 $ showSourceSpansInContext srcSpans
+        ]
 
     printRow :: (Int -> Type a -> Box.Box) -> Type a -> Box.Box
     printRow f = markCodeBox . indent . f prettyDepth .
@@ -1579,7 +1603,7 @@
           [ Box.hcat Box.left [ Box.text (T.unpack (showIdent ident) ++ " :: ")
                               , markCodeBox $ typeAsBox prettyDepth ty'
                               ]
-          | (ident, ty') <- take 5 ctx
+          | (ident, ty') <- take 30 ctx
           ]
       ]
 
@@ -1635,7 +1659,7 @@
     Error -> "error"
     Warning -> "warning"
 
-  paras :: [Box.Box] -> Box.Box
+  paras :: forall f. Foldable f => f Box.Box -> Box.Box
   paras = Box.vcat Box.left
 
   -- | Simplify an error message
@@ -1725,6 +1749,94 @@
         Box.<> " "
         Box.<> (line . displayStartEndPos . fst $ getAnnForType ty)
     Qualified mn (Right inst) -> line . markCode . showQualified showIdent $ Qualified mn inst
+
+  -- | As of this writing, this function assumes that all provided SourceSpans
+  -- are non-overlapping (except for exact duplicates) and span no line breaks. A
+  -- more sophisticated implementation without this limitation would be possible
+  -- but isn't yet needed.
+  showSourceSpansInContext :: NonEmpty SourceSpan -> Box.Box
+  showSourceSpansInContext
+    = maybe Box.nullBox (paras . fmap renderFile . NEL.groupWith1 spanName . NEL.sort)
+    . NEL.nonEmpty
+    . NEL.filter ((> 0) . sourcePosLine . spanStart)
+    where
+    renderFile :: NonEmpty SourceSpan -> Box.Box
+    renderFile sss = maybe Box.nullBox (linesToBox . T.lines) $ lookup fileName fileContents
+      where
+      fileName = spanName $ NEL.head sss
+      header = lineS . (<> ":") . makeRelative relPath $ fileName
+      lineBlocks = makeLineBlocks $ NEL.groupWith1 (sourcePosLine . spanStart) sss
+
+      linesToBox fileLines = Box.moveUp 1 $ header Box.// body
+        where
+        body
+          = Box.punctuateV Box.left (lineNumberStyle "...")
+          . map (paras . fmap renderLine)
+          . flip evalState (fileLines, 1)
+          . traverse (wither (\(i, x) -> fmap (i, , x) <$> ascLookupInState i) . NEL.toList)
+          $ NEL.toList lineBlocks
+
+    makeLineBlocks :: NonEmpty (NonEmpty SourceSpan) -> NonEmpty (NonEmpty (Int, [SourceSpan]))
+    makeLineBlocks = startBlock
+      where
+      startBlock (h :| t) = over head1 (NEL.cons (pred $ headLineNumber h, [])) $ continueBlock h t
+
+      continueBlock :: NonEmpty SourceSpan -> [NonEmpty SourceSpan] -> NonEmpty (NonEmpty (Int, [SourceSpan]))
+      continueBlock lineGroup = \case
+        [] ->
+          endBlock lineGroup []
+        nextGroup : groups -> case pred $ ((-) `on` headLineNumber) nextGroup lineGroup of
+          n | n <= 3 ->
+            over head1 (appendExtraLines n lineGroup <>) $ continueBlock nextGroup groups
+          _ ->
+            endBlock lineGroup . NEL.toList . startBlock $ nextGroup :| groups
+
+      endBlock :: NonEmpty SourceSpan -> [NonEmpty (Int, [SourceSpan])] -> NonEmpty (NonEmpty (Int, [SourceSpan]))
+      endBlock h t = appendExtraLines 1 h :| t
+
+      headLineNumber = sourcePosLine . spanStart . NEL.head
+
+      appendExtraLines :: Int -> NonEmpty SourceSpan -> NonEmpty (Int, [SourceSpan])
+      appendExtraLines n lineGroup = (lineNum, NEL.toList lineGroup) :| [(lineNum + i, []) | i <- [1..n]]
+        where
+        lineNum = headLineNumber lineGroup
+
+    renderLine :: (Int, Text, [SourceSpan]) -> Box.Box
+    renderLine (lineNum, text, sss) = numBox Box.<+> lineBox
+      where
+      colSpans = nubOrdOn fst $ map (over both (pred . sourcePosColumn) . (spanStart &&& spanEnd)) sss
+      numBox = lineNumberStyle $ show lineNum
+      lineBox =
+        if isJust codeColor
+        then colorCodeBox codeColor $ line $ foldr highlightSpan text colSpans
+        else line text Box.// line (finishUnderline $ foldr underlineSpan (T.length text, "") colSpans)
+
+    highlightSpan :: (Int, Int) -> Text -> Text
+    highlightSpan (startCol, endCol) text
+       = prefix
+      <> T.pack (ANSI.setSGRCode [ANSI.SetSwapForegroundBackground True])
+      <> spanText
+      <> T.pack (ANSI.setSGRCode [ANSI.SetSwapForegroundBackground False])
+      <> suffix
+      where
+      (prefix, rest) = T.splitAt startCol text
+      (spanText, suffix) = T.splitAt (endCol - startCol) rest
+
+    underlineSpan :: (Int, Int) -> (Int, Text) -> (Int, Text)
+    underlineSpan (startCol, endCol) (len, accum) = (startCol, T.replicate (endCol - startCol) "^" <> T.replicate (len - endCol) " " <> accum)
+
+    finishUnderline :: (Int, Text) -> Text
+    finishUnderline (len, accum) = T.replicate len " " <> accum
+
+    lineNumberStyle :: String -> Box.Box
+    lineNumberStyle = colorCodeBox (codeColor $> (ANSI.Vivid, ANSI.Black)) . Box.alignHoriz Box.right 5 . lineS
+
+  -- | Lookup the nth element of a list, but without retraversing the list every
+  -- time, by instead keeping a tail of the list and the current element number
+  -- in State. Only works if the argument provided is strictly ascending over
+  -- the life of the State.
+  ascLookupInState :: forall a. Int -> State ([a], Int) (Maybe a)
+  ascLookupInState j = get >>= \(as, i) -> for (uncons $ drop (j - i) as) $ \(a, as') -> put (as', succ j) $> a
 
 -- Pretty print and export declaration
 prettyPrintExport :: DeclarationRef -> Text
diff --git a/src/Language/PureScript/Errors/JSON.hs b/src/Language/PureScript/Errors/JSON.hs
--- a/src/Language/PureScript/Errors/JSON.hs
+++ b/src/Language/PureScript/Errors/JSON.hs
@@ -2,7 +2,7 @@
 
 module Language.PureScript.Errors.JSON where
 
-import Prelude.Compat
+import Prelude
 
 import qualified Data.Aeson.TH as A
 import qualified Data.List.NonEmpty as NEL
@@ -43,13 +43,13 @@
 $(A.deriveJSON A.defaultOptions ''JSONError)
 $(A.deriveJSON A.defaultOptions ''JSONResult)
 
-toJSONErrors :: Bool -> P.Level -> P.MultipleErrors -> [JSONError]
-toJSONErrors verbose level = map (toJSONError verbose level) . P.runMultipleErrors
+toJSONErrors :: Bool -> P.Level -> [(FilePath, Text)] -> P.MultipleErrors -> [JSONError]
+toJSONErrors verbose level files = map (toJSONError verbose level files) . P.runMultipleErrors
 
-toJSONError :: Bool -> P.Level -> P.ErrorMessage -> JSONError
-toJSONError verbose level e =
+toJSONError :: Bool -> P.Level -> [(FilePath, Text)] -> P.ErrorMessage -> JSONError
+toJSONError verbose level files e =
   JSONError (toErrorPosition <$> fmap NEL.head spans)
-            (P.renderBox (P.prettyPrintSingleError (P.PPEOptions Nothing verbose level False mempty) (P.stripModuleAndSpan e)))
+            (P.renderBox (P.prettyPrintSingleError (P.PPEOptions Nothing verbose level False mempty files) (P.stripModuleAndSpan e)))
             (P.errorCode e)
             (P.errorDocUri e)
             (P.spanName <$> fmap NEL.head spans)
diff --git a/src/Language/PureScript/Externs.hs b/src/Language/PureScript/Externs.hs
--- a/src/Language/PureScript/Externs.hs
+++ b/src/Language/PureScript/Externs.hs
@@ -14,7 +14,7 @@
   , externsFileName
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Codec.Serialise (Serialise)
 import Control.Monad (join)
diff --git a/src/Language/PureScript/Graph.hs b/src/Language/PureScript/Graph.hs
--- a/src/Language/PureScript/Graph.hs
+++ b/src/Language/PureScript/Graph.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Graph (graph) where
 
-import Prelude.Compat
+import Prelude
 
 import qualified Data.Aeson as Json
 import qualified Data.Aeson.Key as Json.Key
diff --git a/src/Language/PureScript/Hierarchy.hs b/src/Language/PureScript/Hierarchy.hs
--- a/src/Language/PureScript/Hierarchy.hs
+++ b/src/Language/PureScript/Hierarchy.hs
@@ -15,7 +15,7 @@
 
 module Language.PureScript.Hierarchy where
 
-import           Prelude.Compat
+import           Prelude
 import           Protolude (ordNub)
 
 import           Data.List (sort)
diff --git a/src/Language/PureScript/Ide/Completion.hs b/src/Language/PureScript/Ide/Completion.hs
--- a/src/Language/PureScript/Ide/Completion.hs
+++ b/src/Language/PureScript/Ide/Completion.hs
@@ -96,7 +96,7 @@
         (Namespaced (namespaceForDeclaration decl)
          (P.runModuleName origin <> "." <> identifierFromIdeDeclaration decl))
     insertDeclaration moduleName origin d old = case old of
-      Nothing -> Just ( Match (origin, d & idaAnnotation.annExportedFrom .~ Nothing)
+      Nothing -> Just ( Match (origin, d & idaAnnotation . annExportedFrom .~ Nothing)
                       , [moduleName]
                       )
       Just x -> Just (second (moduleName :) x)
diff --git a/src/Language/PureScript/Ide/Error.hs b/src/Language/PureScript/Ide/Error.hs
--- a/src/Language/PureScript/Ide/Error.hs
+++ b/src/Language/PureScript/Ide/Error.hs
@@ -31,29 +31,29 @@
     | NotFound Text
     | ModuleNotFound ModuleIdent
     | ModuleFileNotFound ModuleIdent
-    | RebuildError P.MultipleErrors
+    | RebuildError [(FilePath, Text)] P.MultipleErrors
     deriving (Show)
 
 instance ToJSON IdeError where
-  toJSON (RebuildError errs) = object
+  toJSON (RebuildError files errs) = object
     [ "resultType" .= ("error" :: Text)
-    , "result" .= encodeRebuildErrors errs
+    , "result" .= encodeRebuildErrors files errs
     ]
   toJSON err = object
     [ "resultType" .= ("error" :: Text)
     , "result" .= textError err
     ]
 
-encodeRebuildErrors :: P.MultipleErrors -> Value
-encodeRebuildErrors = toJSON . map encodeRebuildError . P.runMultipleErrors
+encodeRebuildErrors :: [(FilePath, Text)] -> P.MultipleErrors -> Value
+encodeRebuildErrors files = toJSON . map encodeRebuildError . P.runMultipleErrors
   where
     encodeRebuildError err = case err of
       (P.ErrorMessage _
        ((P.HoleInferredType name _ _
          (Just P.TSAfter{tsAfterIdentifiers=idents, tsAfterRecordFields=fields})))) ->
-        insertTSCompletions name idents (fromMaybe [] fields) (toJSON (toJSONError False P.Error err))
+        insertTSCompletions name idents (fromMaybe [] fields) (toJSON (toJSONError False P.Error files err))
       _ ->
-        (toJSON . toJSONError False P.Error) err
+        (toJSON . toJSONError False P.Error files) err
 
     insertTSCompletions name idents fields (Aeson.Object value) =
       Aeson.Object
@@ -91,7 +91,7 @@
 textError (NotFound ident)            = "Symbol '" <> ident <> "' not found."
 textError (ModuleNotFound ident)      = "Module '" <> ident <> "' not found."
 textError (ModuleFileNotFound ident)  = "Extern file for module " <> ident <>" could not be found"
-textError (RebuildError err)          = show err
+textError (RebuildError _ err)        = show err
 
 prettyPrintTypeSingleLine :: P.Type a -> Text
 prettyPrintTypeSingleLine = T.unwords . map T.strip . T.lines . T.pack . P.prettyPrintTypeWithUnicode maxBound
diff --git a/src/Language/PureScript/Ide/Externs.hs b/src/Language/PureScript/Ide/Externs.hs
--- a/src/Language/PureScript/Ide/Externs.hs
+++ b/src/Language/PureScript/Ide/Externs.hs
@@ -70,14 +70,14 @@
             acc
           Just tyDecl -> IdeDeclTypeClass
             (IdeTypeClass tcn (tyDecl^.ideTypeKind) [])
-            : filter (not . anyOf (_IdeDeclType.ideTypeName) (== P.coerceProperName tcn)) acc
+            : filter (not . anyOf (_IdeDeclType . ideTypeName) (== P.coerceProperName tcn)) acc
       SynonymToResolve tn ty ->
         case findType tn acc of
           Nothing ->
             acc
           Just tyDecl ->
             IdeDeclTypeSynonym (IdeTypeSynonym tn ty (tyDecl^.ideTypeKind))
-            : filter (not . anyOf (_IdeDeclType.ideTypeName) (== tn)) acc
+            : filter (not . anyOf (_IdeDeclType . ideTypeName) (== tn)) acc
 
 findType :: P.ProperName 'P.TypeName -> [IdeDeclaration] -> Maybe IdeType
 findType tn decls =
diff --git a/src/Language/PureScript/Ide/Rebuild.hs b/src/Language/PureScript/Ide/Rebuild.hs
--- a/src/Language/PureScript/Ide/Rebuild.hs
+++ b/src/Language/PureScript/Ide/Rebuild.hs
@@ -55,7 +55,7 @@
   let fp' = fromMaybe fp actualFile
   (pwarnings, m) <- case sequence $ CST.parseFromFile fp' input of
     Left parseError ->
-      throwError $ RebuildError $ CST.toMultipleErrors fp' parseError
+      throwError $ RebuildError [(fp', input)] $ CST.toMultipleErrors fp' parseError
     Right m -> pure m
   let moduleName = P.getModuleName m
   -- Externs files must be sorted ahead of time, so that they get applied
@@ -75,7 +75,7 @@
       pure newExterns
   case result of
     Left errors ->
-      throwError (RebuildError errors)
+      throwError (RebuildError [(fp', input)] errors)
     Right newExterns -> do
       insertModule (fromMaybe file actualFile, m)
       insertExterns newExterns
@@ -193,7 +193,7 @@
            . M.delete (P.getModuleName m) $ ex
   case sorted' of
     Left err ->
-      throwError (RebuildError err)
+      throwError (RebuildError [] err)
     Right (sorted, graph) -> do
       let deps = fromJust (List.lookup (P.getModuleName m) graph)
       pure $ mapMaybe getExtern (deps `inOrderOf` map P.getModuleName sorted)
diff --git a/src/Language/PureScript/Ide/Reexports.hs b/src/Language/PureScript/Ide/Reexports.hs
--- a/src/Language/PureScript/Ide/Reexports.hs
+++ b/src/Language/PureScript/Ide/Reexports.hs
@@ -85,7 +85,7 @@
       Nothing -> Left x
       Just decls' ->
         let
-          setExportedFrom = set (idaAnnotation.annExportedFrom) . Just
+          setExportedFrom = set (idaAnnotation . annExportedFrom) . Just
         in
           bimap (mn,) (map (setExportedFrom mn)) (resolveRef decls' r)
 
diff --git a/src/Language/PureScript/Ide/State.hs b/src/Language/PureScript/Ide/State.hs
--- a/src/Language/PureScript/Ide/State.hs
+++ b/src/Language/PureScript/Ide/State.hs
@@ -37,15 +37,15 @@
   , resolveDataConstructorsForModule
   ) where
 
-import           Protolude hiding (moduleName)
+import           Protolude hiding (moduleName, unzip)
 
-import           Control.Arrow
 import           Control.Concurrent.STM
 import           Control.Lens                       hiding (anyOf, op, (&))
 import           "monad-logger" Control.Monad.Logger
 import           Data.IORef
 import qualified Data.Map.Lazy                      as Map
 import           Data.Time.Clock (UTCTime)
+import           Data.Zip (unzip)
 import qualified Language.PureScript                as P
 import           Language.PureScript.Docs.Convert.Single (convertComments)
 import           Language.PureScript.Externs
@@ -225,7 +225,7 @@
   -- through the repopulation
   rebuildCache <- vsCachedRebuild <$> getVolatileStateSTM ref
   let asts = map (extractAstInformation . fst) modules
-  let (moduleDeclarations, reexportRefs) = (map fst &&& map snd) (Map.map convertExterns externs)
+  let (moduleDeclarations, reexportRefs) = unzip (Map.map convertExterns externs)
       results =
         moduleDeclarations
         & map resolveDataConstructorsForModule
@@ -401,8 +401,7 @@
     getDeclarations :: P.ModuleName -> [IdeDeclaration]
     getDeclarations moduleName =
       Map.lookup moduleName modules
-      & fromMaybe []
-      & map discardAnn
+      & foldMap (map discardAnn)
 
     resolveOperator (IdeDeclValueOperator op)
       | (P.Qualified (P.ByModuleName mn) (Left ident)) <- op ^. ideValueOpAlias =
@@ -442,12 +441,12 @@
     resolveDataConstructors :: IdeDeclaration -> IdeDeclaration
     resolveDataConstructors decl = case decl of
       IdeDeclType ty ->
-        IdeDeclType (ty & ideTypeDtors .~ fromMaybe [] (Map.lookup (ty^.ideTypeName) dtors))
+        IdeDeclType (ty & ideTypeDtors .~ fromMaybe [] (Map.lookup (ty ^. ideTypeName) dtors))
       _ ->
         decl
 
     dtors =
       decls
-      & mapMaybe (preview (idaDeclaration._IdeDeclDataConstructor))
+      & mapMaybe (preview (idaDeclaration . _IdeDeclDataConstructor))
       & foldr (\(IdeDataConstructor name typeName type') ->
                   Map.insertWith (<>) typeName [(name, type')]) Map.empty
diff --git a/src/Language/PureScript/Ide/Types.hs b/src/Language/PureScript/Ide/Types.hs
--- a/src/Language/PureScript/Ide/Types.hs
+++ b/src/Language/PureScript/Ide/Types.hs
@@ -287,7 +287,7 @@
             ]
         ]
     ModuleList modules -> encodeSuccess modules
-    RebuildSuccess warnings -> encodeSuccess (P.toJSONErrors False P.Warning warnings)
+    RebuildSuccess warnings -> encodeSuccess (P.toJSONErrors False P.Warning [] warnings)
 
 encodeImport :: (P.ModuleName, P.ImportDeclarationType, Maybe P.ModuleName) -> Aeson.Value
 encodeImport (P.runModuleName -> mn, importType, map P.runModuleName -> qualifier) = case importType of
diff --git a/src/Language/PureScript/Interactive.hs b/src/Language/PureScript/Interactive.hs
--- a/src/Language/PureScript/Interactive.hs
+++ b/src/Language/PureScript/Interactive.hs
@@ -9,8 +9,7 @@
   , runMake
   ) where
 
-import           Prelude ()
-import           Prelude.Compat
+import           Prelude
 import           Protolude (ordNub)
 
 import           Data.List (sort, find, foldl')
diff --git a/src/Language/PureScript/Interactive/Completion.hs b/src/Language/PureScript/Interactive/Completion.hs
--- a/src/Language/PureScript/Interactive/Completion.hs
+++ b/src/Language/PureScript/Interactive/Completion.hs
@@ -6,7 +6,7 @@
   , formatCompletions
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import           Control.Monad.IO.Class (MonadIO(..))
diff --git a/src/Language/PureScript/Interactive/Directive.hs b/src/Language/PureScript/Interactive/Directive.hs
--- a/src/Language/PureScript/Interactive/Directive.hs
+++ b/src/Language/PureScript/Interactive/Directive.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.Interactive.Directive where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Maybe (fromJust)
 import Data.List (isPrefixOf)
diff --git a/src/Language/PureScript/Interactive/IO.hs b/src/Language/PureScript/Interactive/IO.hs
--- a/src/Language/PureScript/Interactive/IO.hs
+++ b/src/Language/PureScript/Interactive/IO.hs
@@ -2,7 +2,7 @@
 
 module Language.PureScript.Interactive.IO (findNodeProcess, readNodeProcessWithExitCode, getHistoryFilename) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (msum, void)
 import Control.Monad.Error.Class (throwError)
diff --git a/src/Language/PureScript/Interactive/Message.hs b/src/Language/PureScript/Interactive/Message.hs
--- a/src/Language/PureScript/Interactive/Message.hs
+++ b/src/Language/PureScript/Interactive/Message.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Interactive.Message where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Data.List (intercalate)
 import           Data.Version (showVersion)
diff --git a/src/Language/PureScript/Interactive/Module.hs b/src/Language/PureScript/Interactive/Module.hs
--- a/src/Language/PureScript/Interactive/Module.hs
+++ b/src/Language/PureScript/Interactive/Module.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Interactive.Module where
 
-import           Prelude.Compat
+import           Prelude
 
 import qualified Language.PureScript as P
 import qualified Language.PureScript.CST as CST
diff --git a/src/Language/PureScript/Interactive/Parser.hs b/src/Language/PureScript/Interactive/Parser.hs
--- a/src/Language/PureScript/Interactive/Parser.hs
+++ b/src/Language/PureScript/Interactive/Parser.hs
@@ -6,7 +6,7 @@
   , parseCommand
   ) where
 
-import           Prelude.Compat hiding (lex)
+import           Prelude
 
 import           Control.Monad (join)
 import           Data.Bifunctor (bimap)
diff --git a/src/Language/PureScript/Interactive/Printer.hs b/src/Language/PureScript/Interactive/Printer.hs
--- a/src/Language/PureScript/Interactive/Printer.hs
+++ b/src/Language/PureScript/Interactive/Printer.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Interactive.Printer where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Data.List (intersperse)
 import qualified Data.Map as M
diff --git a/src/Language/PureScript/Interactive/Types.hs b/src/Language/PureScript/Interactive/Types.hs
--- a/src/Language/PureScript/Interactive/Types.hs
+++ b/src/Language/PureScript/Interactive/Types.hs
@@ -28,7 +28,7 @@
   , Directive(..)
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import qualified Language.PureScript as P
 import qualified Data.Map as M
diff --git a/src/Language/PureScript/Label.hs b/src/Language/PureScript/Label.hs
--- a/src/Language/PureScript/Label.hs
+++ b/src/Language/PureScript/Label.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Label (Label(..)) where
 
-import Prelude.Compat hiding (lex)
+import Prelude
 import GHC.Generics (Generic)
 import Codec.Serialise (Serialise)
 import Control.DeepSeq (NFData)
diff --git a/src/Language/PureScript/Linter.hs b/src/Language/PureScript/Linter.hs
--- a/src/Language/PureScript/Linter.hs
+++ b/src/Language/PureScript/Linter.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.Linter (lint, module L) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Writer.Class
 
@@ -183,7 +183,7 @@
         in
           (vars, errs')
 
-    goDecl (TypeInstanceDeclaration _ _ _ _ _ _ _ (ExplicitInstance decls)) = mconcat $ map goDecl decls
+    goDecl (TypeInstanceDeclaration _ _ _ _ _ _ _ _ (ExplicitInstance decls)) = mconcat $ map goDecl decls
     goDecl _ = mempty
 
     go :: Expr -> (S.Set Ident, MultipleErrors)
diff --git a/src/Language/PureScript/Linter/Exhaustive.hs b/src/Language/PureScript/Linter/Exhaustive.hs
--- a/src/Language/PureScript/Linter/Exhaustive.hs
+++ b/src/Language/PureScript/Linter/Exhaustive.hs
@@ -8,7 +8,7 @@
   ( checkExhaustiveExpr
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Applicative
@@ -204,7 +204,7 @@
 isExhaustiveGuard :: Environment -> ModuleName -> [GuardedExpr] -> Bool
 isExhaustiveGuard _ _ [MkUnguarded _] = True
 isExhaustiveGuard env moduleName gs   =
-  not . null $ filter (\(GuardedExpr grd _) -> isExhaustive grd) gs
+  any (\(GuardedExpr grd _) -> isExhaustive grd) gs
   where
     isExhaustive :: [Guard] -> Bool
     isExhaustive = all checkGuard
@@ -255,7 +255,7 @@
     in (missed', ( if null approx
                      then liftA2 (&&) cond nec
                      else Left Incomplete
-                 , if either (const True) id cond
+                 , if and cond
                      then redundant
                      else caseAlternativeBinders ca : redundant
                  )
diff --git a/src/Language/PureScript/Linter/Imports.hs b/src/Language/PureScript/Linter/Imports.hs
--- a/src/Language/PureScript/Linter/Imports.hs
+++ b/src/Language/PureScript/Linter/Imports.hs
@@ -4,7 +4,7 @@
   , UsedImports()
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Monad (join, unless, foldM, (<=<))
@@ -300,7 +300,7 @@
   dtys
     :: ModuleName
     -> M.Map (ProperName 'TypeName) ([ProperName 'ConstructorName], ExportSource)
-  dtys mn = maybe M.empty exportedTypes $ envModuleExports <$> mn `M.lookup` env
+  dtys mn = foldMap (exportedTypes . envModuleExports) $ mn `M.lookup` env
 
   dctorsForType
     :: ModuleName
diff --git a/src/Language/PureScript/Make.hs b/src/Language/PureScript/Make.hs
--- a/src/Language/PureScript/Make.hs
+++ b/src/Language/PureScript/Make.hs
@@ -9,7 +9,7 @@
   , module Actions
   ) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Concurrent.Lifted as C
 import           Control.Exception.Base (onException)
diff --git a/src/Language/PureScript/Names.hs b/src/Language/PureScript/Names.hs
--- a/src/Language/PureScript/Names.hs
+++ b/src/Language/PureScript/Names.hs
@@ -5,7 +5,7 @@
 --
 module Language.PureScript.Names where
 
-import Prelude.Compat
+import Prelude
 
 import Codec.Serialise (Serialise)
 import Control.Applicative ((<|>))
diff --git a/src/Language/PureScript/Options.hs b/src/Language/PureScript/Options.hs
--- a/src/Language/PureScript/Options.hs
+++ b/src/Language/PureScript/Options.hs
@@ -1,7 +1,7 @@
 -- | The data type of compiler options
 module Language.PureScript.Options where
 
-import Prelude.Compat
+import Prelude
 import qualified Data.Set as S
 import Data.Map (Map)
 import qualified Data.Map as Map
diff --git a/src/Language/PureScript/PSString.hs b/src/Language/PureScript/PSString.hs
--- a/src/Language/PureScript/PSString.hs
+++ b/src/Language/PureScript/PSString.hs
@@ -9,7 +9,7 @@
   , mkString
   ) where
 
-import Prelude.Compat
+import Prelude
 import GHC.Generics (Generic)
 import Codec.Serialise (Serialise)
 import Control.DeepSeq (NFData)
@@ -17,6 +17,7 @@
 import Control.Applicative ((<|>))
 import qualified Data.Char as Char
 import Data.Bits (shiftR)
+import Data.Either (fromRight)
 import Data.List (unfoldr)
 import Data.Scientific (toBoundedInteger)
 import Data.String (IsString(..))
@@ -72,7 +73,7 @@
 -- U+FFFD REPLACEMENT CHARACTER
 --
 decodeStringWithReplacement :: PSString -> String
-decodeStringWithReplacement = map (either (const '\xFFFD') id) . decodeStringEither
+decodeStringWithReplacement = map (fromRight '\xFFFD') . decodeStringEither
 
 -- |
 -- Decode a PSString as UTF-16. Lone surrogates in the input are represented in
diff --git a/src/Language/PureScript/Pretty/Common.hs b/src/Language/PureScript/Pretty/Common.hs
--- a/src/Language/PureScript/Pretty/Common.hs
+++ b/src/Language/PureScript/Pretty/Common.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.Pretty.Common where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.State (StateT, modify, get)
 
diff --git a/src/Language/PureScript/Pretty/Types.hs b/src/Language/PureScript/Pretty/Types.hs
--- a/src/Language/PureScript/Pretty/Types.hs
+++ b/src/Language/PureScript/Pretty/Types.hs
@@ -19,7 +19,7 @@
   , prettyPrintObjectKey
   ) where
 
-import Prelude.Compat hiding ((<>))
+import Prelude hiding ((<>))
 
 import Control.Arrow ((<+>))
 import Control.PatternArrows as PA
diff --git a/src/Language/PureScript/Pretty/Values.hs b/src/Language/PureScript/Pretty/Values.hs
--- a/src/Language/PureScript/Pretty/Values.hs
+++ b/src/Language/PureScript/Pretty/Values.hs
@@ -7,7 +7,7 @@
   , prettyPrintBinderAtom
   ) where
 
-import Prelude.Compat hiding ((<>))
+import Prelude hiding ((<>))
 
 import Control.Arrow (second)
 
diff --git a/src/Language/PureScript/Publish/BoxesHelpers.hs b/src/Language/PureScript/Publish/BoxesHelpers.hs
--- a/src/Language/PureScript/Publish/BoxesHelpers.hs
+++ b/src/Language/PureScript/Publish/BoxesHelpers.hs
@@ -4,7 +4,7 @@
   , module Language.PureScript.Publish.BoxesHelpers
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Data.Text (Text)
 import qualified Data.Text as T
diff --git a/src/Language/PureScript/Publish/ErrorsWarnings.hs b/src/Language/PureScript/Publish/ErrorsWarnings.hs
--- a/src/Language/PureScript/Publish/ErrorsWarnings.hs
+++ b/src/Language/PureScript/Publish/ErrorsWarnings.hs
@@ -12,7 +12,7 @@
   , renderWarnings
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Exception (IOException)
 
diff --git a/src/Language/PureScript/Publish/Utils.hs b/src/Language/PureScript/Publish/Utils.hs
--- a/src/Language/PureScript/Publish/Utils.hs
+++ b/src/Language/PureScript/Publish/Utils.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Publish.Utils where
 
-import Prelude.Compat
+import Prelude
 
 import System.Directory
 import System.FilePath.Glob (Pattern, compile, globDir1)
diff --git a/src/Language/PureScript/Renamer.hs b/src/Language/PureScript/Renamer.hs
--- a/src/Language/PureScript/Renamer.hs
+++ b/src/Language/PureScript/Renamer.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.Renamer (renameInModule) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.State
 
diff --git a/src/Language/PureScript/Roles.hs b/src/Language/PureScript/Roles.hs
--- a/src/Language/PureScript/Roles.hs
+++ b/src/Language/PureScript/Roles.hs
@@ -8,7 +8,7 @@
   , displayRole
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Codec.Serialise (Serialise)
 import Control.DeepSeq (NFData)
diff --git a/src/Language/PureScript/Sugar/AdoNotation.hs b/src/Language/PureScript/Sugar/AdoNotation.hs
--- a/src/Language/PureScript/Sugar/AdoNotation.hs
+++ b/src/Language/PureScript/Sugar/AdoNotation.hs
@@ -3,7 +3,7 @@
 
 module Language.PureScript.Sugar.AdoNotation (desugarAdoModule) where
 
-import           Prelude.Compat hiding (abs)
+import           Prelude hiding (abs)
 
 import           Control.Monad (foldM)
 import           Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/Sugar/BindingGroups.hs b/src/Language/PureScript/Sugar/BindingGroups.hs
--- a/src/Language/PureScript/Sugar/BindingGroups.hs
+++ b/src/Language/PureScript/Sugar/BindingGroups.hs
@@ -8,7 +8,7 @@
   , collapseBindingGroups
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Monad ((<=<), guard)
diff --git a/src/Language/PureScript/Sugar/CaseDeclarations.hs b/src/Language/PureScript/Sugar/CaseDeclarations.hs
--- a/src/Language/PureScript/Sugar/CaseDeclarations.hs
+++ b/src/Language/PureScript/Sugar/CaseDeclarations.hs
@@ -8,7 +8,7 @@
   , desugarCaseGuards
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Data.List (groupBy, foldl1')
@@ -327,8 +327,8 @@
 desugarCases = desugarRest <=< fmap join . flip parU toDecls . groupBy inSameGroup
   where
     desugarRest :: [Declaration] -> m [Declaration]
-    desugarRest (TypeInstanceDeclaration sa cd idx name constraints className tys ds : rest) =
-      (:) <$> (TypeInstanceDeclaration sa cd idx name constraints className tys <$> traverseTypeInstanceBody desugarCases ds) <*> desugarRest rest
+    desugarRest (TypeInstanceDeclaration sa na cd idx name constraints className tys ds : rest) =
+      (:) <$> (TypeInstanceDeclaration sa na cd idx name constraints className tys <$> traverseTypeInstanceBody desugarCases ds) <*> desugarRest rest
     desugarRest (ValueDecl sa name nameKind bs result : rest) =
       let (_, f, _) = everywhereOnValuesTopDownM return go return
           f' = mapM (\(GuardedExpr gs e) -> GuardedExpr gs <$> f e)
@@ -380,10 +380,10 @@
       argNames = foldl1 resolveNames namedArgs
   args <- if allUnique (catMaybes argNames)
             then mapM argName argNames
-            else replicateM (length argNames) freshIdent'
-  let vars = map (Var ss . Qualified ByNullSourcePos) args
+            else replicateM (length argNames) ((nullSourceSpan, ) <$> freshIdent')
+  let vars = map (Var ss . Qualified ByNullSourcePos . snd) args
       binders = [ CaseAlternative bs result | (bs, result) <- alternatives ]
-  let value = foldr (Abs . VarBinder ss) (Case vars binders) args
+  let value = foldr (Abs . uncurry VarBinder) (Case vars binders) args
 
   return $ ValueDecl (ss, []) ident Public [] [MkUnguarded value]
   where
@@ -391,8 +391,8 @@
   -- VarBinders will become Just _ which is a potential name.
   -- Everything else becomes Nothing, which indicates that we
   -- have to generate a name.
-  findName :: Binder -> Maybe Ident
-  findName (VarBinder _ name) = Just name
+  findName :: Binder -> Maybe (SourceSpan, Ident)
+  findName (VarBinder ss' name) = Just (ss', name)
   findName (PositionedBinder _ _ binder) = findName binder
   findName _ = Nothing
 
@@ -401,18 +401,18 @@
   allUnique :: (Ord a) => [a] -> Bool
   allUnique xs = length xs == length (ordNub xs)
 
-  argName :: Maybe Ident -> m Ident
-  argName (Just name) = return name
-  argName _ = freshIdent'
+  argName :: Maybe (SourceSpan, Ident) -> m (SourceSpan, Ident)
+  argName (Just (ss', name)) = return (ss', name)
+  argName _ = (nullSourceSpan, ) <$> freshIdent'
 
   -- Combine two lists of potential names from two case alternatives
   -- by zipping corresponding columns.
-  resolveNames :: [Maybe Ident] -> [Maybe Ident] -> [Maybe Ident]
+  resolveNames :: [Maybe (SourceSpan, Ident)] -> [Maybe (SourceSpan, Ident)] -> [Maybe (SourceSpan, Ident)]
   resolveNames = zipWith resolveName
 
   -- Resolve a pair of names. VarBinder beats NullBinder, and everything
   -- else results in Nothing.
-  resolveName :: Maybe Ident -> Maybe Ident -> Maybe Ident
+  resolveName :: Maybe (SourceSpan, Ident) -> Maybe (SourceSpan, Ident) -> Maybe (SourceSpan, Ident)
   resolveName (Just a) (Just b)
     | a == b = Just a
     | otherwise = Nothing
diff --git a/src/Language/PureScript/Sugar/DoNotation.hs b/src/Language/PureScript/Sugar/DoNotation.hs
--- a/src/Language/PureScript/Sugar/DoNotation.hs
+++ b/src/Language/PureScript/Sugar/DoNotation.hs
@@ -3,7 +3,7 @@
 
 module Language.PureScript.Sugar.DoNotation (desugarDoModule) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Applicative ((<|>))
 import           Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/Sugar/LetPattern.hs b/src/Language/PureScript/Sugar/LetPattern.hs
--- a/src/Language/PureScript/Sugar/LetPattern.hs
+++ b/src/Language/PureScript/Sugar/LetPattern.hs
@@ -4,7 +4,7 @@
 --
 module Language.PureScript.Sugar.LetPattern (desugarLetPatternModule) where
 
-import Prelude.Compat
+import Prelude
 
 import Data.List (groupBy)
 import Data.Function (on)
diff --git a/src/Language/PureScript/Sugar/Names.hs b/src/Language/PureScript/Sugar/Names.hs
--- a/src/Language/PureScript/Sugar/Names.hs
+++ b/src/Language/PureScript/Sugar/Names.hs
@@ -9,7 +9,7 @@
   , Exports(..)
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub, sortOn, swap, foldl')
 
 import Control.Arrow (first, second)
@@ -196,17 +196,17 @@
       TypeSynonymDeclaration sa name
         <$> updateTypeArguments ps
         <*> updateTypesEverywhere ty
-  updateDecl bound (TypeClassDeclaration sa@(ss, _) className args implies deps ds) =
+  updateDecl bound (TypeClassDeclaration sa className args implies deps ds) =
     fmap (bound,) $
       TypeClassDeclaration sa className
         <$> updateTypeArguments args
-        <*> updateConstraints ss implies
+        <*> updateConstraints implies
         <*> pure deps
         <*> pure ds
-  updateDecl bound (TypeInstanceDeclaration sa@(ss, _) ch idx name cs cn ts ds) =
+  updateDecl bound (TypeInstanceDeclaration sa na@(ss, _) ch idx name cs cn ts ds) =
     fmap (bound,) $
-      TypeInstanceDeclaration sa ch idx name
-        <$> updateConstraints ss cs
+      TypeInstanceDeclaration sa na ch idx name
+        <$> updateConstraints cs
         <*> updateClassName cn ss
         <*> traverse updateTypesEverywhere ts
         <*> pure ds
@@ -352,8 +352,8 @@
     updateInConstraint (Constraint ann@(ss, _) name ks ts info) =
       Constraint ann <$> updateClassName name ss <*> pure ks <*> pure ts <*> pure info
 
-  updateConstraints :: SourceSpan -> [SourceConstraint] -> m [SourceConstraint]
-  updateConstraints pos = traverse $ \(Constraint ann name ks ts info) ->
+  updateConstraints :: [SourceConstraint] -> m [SourceConstraint]
+  updateConstraints = traverse $ \(Constraint ann@(pos, _) name ks ts info) ->
     Constraint ann
       <$> updateClassName name pos
       <*> traverse updateTypesEverywhere ks
diff --git a/src/Language/PureScript/Sugar/Names/Common.hs b/src/Language/PureScript/Sugar/Names/Common.hs
--- a/src/Language/PureScript/Sugar/Names/Common.hs
+++ b/src/Language/PureScript/Sugar/Names/Common.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Sugar.Names.Common (warnDuplicateRefs) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Monad.Writer (MonadWriter(..))
diff --git a/src/Language/PureScript/Sugar/Names/Env.hs b/src/Language/PureScript/Sugar/Names/Env.hs
--- a/src/Language/PureScript/Sugar/Names/Env.hs
+++ b/src/Language/PureScript/Sugar/Names/Env.hs
@@ -18,7 +18,7 @@
   , checkImportConflicts
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/Sugar/Names/Exports.hs b/src/Language/PureScript/Sugar/Names/Exports.hs
--- a/src/Language/PureScript/Sugar/Names/Exports.hs
+++ b/src/Language/PureScript/Sugar/Names/Exports.hs
@@ -3,7 +3,7 @@
   , resolveExports
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad
 import Control.Monad.Writer.Class (MonadWriter(..))
diff --git a/src/Language/PureScript/Sugar/Names/Imports.hs b/src/Language/PureScript/Sugar/Names/Imports.hs
--- a/src/Language/PureScript/Sugar/Names/Imports.hs
+++ b/src/Language/PureScript/Sugar/Names/Imports.hs
@@ -5,7 +5,7 @@
   , findImports
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/Sugar/ObjectWildcards.hs b/src/Language/PureScript/Sugar/ObjectWildcards.hs
--- a/src/Language/PureScript/Sugar/ObjectWildcards.hs
+++ b/src/Language/PureScript/Sugar/ObjectWildcards.hs
@@ -3,7 +3,7 @@
   , desugarDecl
   ) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Monad (forM)
 import           Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/Sugar/Operators.hs b/src/Language/PureScript/Sugar/Operators.hs
--- a/src/Language/PureScript/Sugar/Operators.hs
+++ b/src/Language/PureScript/Sugar/Operators.hs
@@ -13,7 +13,7 @@
   , checkFixityExports
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Language.PureScript.AST
 import Language.PureScript.Crash
@@ -380,10 +380,10 @@
     implies' <- traverse (overConstraintArgs (traverse (goType' ss))) implies
     args' <- traverse (traverse (traverse (goType' ss))) args
     return $ TypeClassDeclaration sa name args' implies' deps decls
-  goDecl (TypeInstanceDeclaration sa@(ss, _) ch idx name cs className tys impls) = do
+  goDecl (TypeInstanceDeclaration sa@(ss, _) na ch idx name cs className tys impls) = do
     cs' <- traverse (overConstraintArgs (traverse (goType' ss))) cs
     tys' <- traverse (goType' ss) tys
-    return $ TypeInstanceDeclaration sa ch idx name cs' className tys' impls
+    return $ TypeInstanceDeclaration sa na ch idx name cs' className tys' impls
   goDecl (TypeSynonymDeclaration sa@(ss, _) name args ty) =
     TypeSynonymDeclaration sa name
       <$> traverse (traverse (traverse (goType' ss))) args
diff --git a/src/Language/PureScript/Sugar/Operators/Binders.hs b/src/Language/PureScript/Sugar/Operators/Binders.hs
--- a/src/Language/PureScript/Sugar/Operators/Binders.hs
+++ b/src/Language/PureScript/Sugar/Operators/Binders.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Sugar.Operators.Binders where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Except
 
diff --git a/src/Language/PureScript/Sugar/Operators/Common.hs b/src/Language/PureScript/Sugar/Operators/Common.hs
--- a/src/Language/PureScript/Sugar/Operators/Common.hs
+++ b/src/Language/PureScript/Sugar/Operators/Common.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Sugar.Operators.Common where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.State
 import Control.Monad.Except
diff --git a/src/Language/PureScript/Sugar/Operators/Expr.hs b/src/Language/PureScript/Sugar/Operators/Expr.hs
--- a/src/Language/PureScript/Sugar/Operators/Expr.hs
+++ b/src/Language/PureScript/Sugar/Operators/Expr.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Sugar.Operators.Expr where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Except
 import Data.Functor.Identity
diff --git a/src/Language/PureScript/Sugar/Operators/Types.hs b/src/Language/PureScript/Sugar/Operators/Types.hs
--- a/src/Language/PureScript/Sugar/Operators/Types.hs
+++ b/src/Language/PureScript/Sugar/Operators/Types.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.Sugar.Operators.Types where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Except
 import Language.PureScript.AST
diff --git a/src/Language/PureScript/Sugar/TypeClasses.hs b/src/Language/PureScript/Sugar/TypeClasses.hs
--- a/src/Language/PureScript/Sugar/TypeClasses.hs
+++ b/src/Language/PureScript/Sugar/TypeClasses.hs
@@ -8,7 +8,7 @@
   , superClassDictionaryNames
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import           Control.Arrow (first, second)
 import           Control.Monad.Error.Class (MonadError(..))
@@ -206,9 +206,9 @@
   go d@(TypeClassDeclaration sa name args implies deps members) = do
     modify (M.insert (mn, name) (makeTypeClassData args (map memberToNameAndType members) implies deps False))
     return (Nothing, d : typeClassDictionaryDeclaration sa name args implies members : map (typeClassMemberToDictionaryAccessor mn name args) members)
-  go (TypeInstanceDeclaration sa chainId idx name deps className tys body) = do
+  go (TypeInstanceDeclaration sa na chainId idx name deps className tys body) = do
     name' <- desugarInstName name
-    let d = TypeInstanceDeclaration sa chainId idx (Right name') deps className tys body
+    let d = TypeInstanceDeclaration sa na chainId idx (Right name') deps className tys body
     let explicitOrNot = case body of
           DerivedInstance -> Left $ DerivedInstancePlaceholder className KnownClassStrategy
           NewtypeInstance -> Left $ DerivedInstancePlaceholder className NewtypeStrategy
diff --git a/src/Language/PureScript/Sugar/TypeClasses/Deriving.hs b/src/Language/PureScript/Sugar/TypeClasses/Deriving.hs
--- a/src/Language/PureScript/Sugar/TypeClasses/Deriving.hs
+++ b/src/Language/PureScript/Sugar/TypeClasses/Deriving.hs
@@ -1,7 +1,7 @@
 -- | This module implements the generic deriving elaboration that takes place during desugaring.
 module Language.PureScript.Sugar.TypeClasses.Deriving (deriveInstances) where
 
-import           Prelude.Compat
+import           Prelude
 import           Protolude (note)
 
 import           Control.Monad.Error.Class (MonadError(..))
@@ -46,7 +46,7 @@
   -> m Declaration
 deriveInstance mn ds decl =
   case decl of
-    TypeInstanceDeclaration sa@(ss, _) ch idx nm deps className tys DerivedInstance -> let
+    TypeInstanceDeclaration sa@(ss, _) na ch idx nm deps className tys DerivedInstance -> let
       binaryWildcardClass :: (Declaration -> [SourceType] -> m ([Declaration], SourceType)) -> m Declaration
       binaryWildcardClass f = case tys of
         [ty1, ty2] -> case unwrapTypeConstructor ty1 of
@@ -54,7 +54,7 @@
             checkIsWildcard ss tyCon ty2
             tyConDecl <- findTypeDecl ss tyCon ds
             (members, ty2') <- f tyConDecl args
-            pure $ TypeInstanceDeclaration sa ch idx nm deps className [ty1, ty2'] (ExplicitInstance members)
+            pure $ TypeInstanceDeclaration sa na ch idx nm deps className [ty1, ty2'] (ExplicitInstance members)
           _ -> throwError . errorMessage' ss $ ExpectedTypeConstructor className tys ty1
         _ -> throwError . errorMessage' ss $ InvalidDerivedInstance className tys 2
 
diff --git a/src/Language/PureScript/Sugar/TypeDeclarations.hs b/src/Language/PureScript/Sugar/TypeDeclarations.hs
--- a/src/Language/PureScript/Sugar/TypeDeclarations.hs
+++ b/src/Language/PureScript/Sugar/TypeDeclarations.hs
@@ -6,7 +6,7 @@
   ( desugarTypeDeclarationsModule
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (unless)
 import Control.Monad.Error.Class (MonadError(..))
@@ -51,8 +51,8 @@
     where
     go (Let w ds' val') = Let w <$> desugarTypeDeclarations ds' <*> pure val'
     go other = return other
-  desugarTypeDeclarations (TypeInstanceDeclaration sa ch idx nm deps cls args (ExplicitInstance ds') : rest) =
-    (:) <$> (TypeInstanceDeclaration sa ch idx nm deps cls args . ExplicitInstance <$> desugarTypeDeclarations ds')
+  desugarTypeDeclarations (TypeInstanceDeclaration sa na ch idx nm deps cls args (ExplicitInstance ds') : rest) =
+    (:) <$> (TypeInstanceDeclaration sa na ch idx nm deps cls args . ExplicitInstance <$> desugarTypeDeclarations ds')
         <*> desugarTypeDeclarations rest
   desugarTypeDeclarations (d:rest) = (:) d <$> desugarTypeDeclarations rest
   desugarTypeDeclarations [] = return []
diff --git a/src/Language/PureScript/Traversals.hs b/src/Language/PureScript/Traversals.hs
--- a/src/Language/PureScript/Traversals.hs
+++ b/src/Language/PureScript/Traversals.hs
@@ -1,7 +1,7 @@
 -- | Common functions for implementing generic traversals
 module Language.PureScript.Traversals where
 
-import Prelude.Compat
+import Prelude
 
 sndM :: (Functor f) => (b -> f c) -> (a, b) -> f (a, c)
 sndM f (a, b) = (a, ) <$> f b
diff --git a/src/Language/PureScript/TypeChecker.hs b/src/Language/PureScript/TypeChecker.hs
--- a/src/Language/PureScript/TypeChecker.hs
+++ b/src/Language/PureScript/TypeChecker.hs
@@ -7,7 +7,7 @@
   , checkNewtype
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (headMay, maybeToLeft, ordNub)
 
 import Control.Lens ((^..), _2)
@@ -297,7 +297,7 @@
         dataDecls = mapMaybe toDataDecl tysList
         roleDecls = mapMaybe toRoleDecl tysList
         clss = mapMaybe toClassDecl tysList
-        bindingGroupNames = ordNub ((syns^..traverse._2) ++ (dataDecls^..traverse._2._2) ++ fmap coerceProperName (clss^..traverse._2._2))
+        bindingGroupNames = ordNub ((syns ^.. traverse . _2) ++ (dataDecls ^.. traverse . _2 . _2) ++ fmap coerceProperName (clss ^.. traverse . _2 . _2))
         sss = fmap declSourceSpan tys
     warnAndRethrow (addHint (ErrorInDataBindingGroup bindingGroupNames) . addHint (PositionedError sss)) $ do
       env <- getEnv
@@ -409,8 +409,8 @@
       (args', implies', tys', kind) <- kindOfClass moduleName (sa, pn, args, implies, tys)
       addTypeClass moduleName qualifiedClassName (fmap Just <$> args') implies' deps tys' kind
       return d
-  go (TypeInstanceDeclaration _ _ _ (Left _) _ _ _ _) = internalError "typeCheckAll: type class instance generated name should have been desugared"
-  go d@(TypeInstanceDeclaration sa@(ss, _) ch idx (Right dictName) deps className tys body) =
+  go (TypeInstanceDeclaration _ _ _ _ (Left _) _ _ _ _) = internalError "typeCheckAll: type class instance generated name should have been desugared"
+  go d@(TypeInstanceDeclaration sa@(ss, _) _ ch idx (Right dictName) deps className tys body) =
     rethrow (addHint (ErrorInInstance className tys) . addHint (positionedError ss)) $ do
       env <- getEnv
       let qualifiedDictName = Qualified (ByModuleName moduleName) dictName
diff --git a/src/Language/PureScript/TypeChecker/Deriving.hs b/src/Language/PureScript/TypeChecker/Deriving.hs
--- a/src/Language/PureScript/TypeChecker/Deriving.hs
+++ b/src/Language/PureScript/TypeChecker/Deriving.hs
@@ -1,20 +1,26 @@
+{- HLINT ignore "Unused LANGUAGE pragma" -} -- HLint doesn't recognize that TypeApplications is used in a pattern
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE TypeApplications #-}
 module Language.PureScript.TypeChecker.Deriving (deriveInstance) where
 
 import Protolude hiding (Type)
 
+import Control.Monad.Trans.Writer (Writer, WriterT, runWriter, runWriterT)
 import Control.Monad.Writer.Class (MonadWriter(..))
-import Data.Foldable (foldl1)
+import Data.Foldable (foldl1, foldr1)
 import Data.List (init, last, zipWith3, (!!))
 import qualified Data.Map as M
 
 import Control.Monad.Supply.Class
 import Language.PureScript.AST
 import Language.PureScript.AST.Utils
+import qualified Language.PureScript.Constants.Data.Foldable as Foldable
+import qualified Language.PureScript.Constants.Data.Traversable as Traversable
 import qualified Language.PureScript.Constants.Prelude as Prelude
 import qualified Language.PureScript.Constants.Prim as Prim
 import Language.PureScript.Crash
 import Language.PureScript.Environment
-import Language.PureScript.Errors
+import Language.PureScript.Errors hiding (nonEmpty)
 import Language.PureScript.Label (Label(..))
 import Language.PureScript.Names
 import Language.PureScript.PSString
@@ -69,12 +75,16 @@
           _ -> throwError . errorMessage $ ExpectedTypeConstructor className tys ty
         _ -> throwError . errorMessage $ InvalidDerivedInstance className tys 1
 
+      unaryClass' f = unaryClass (f className)
+
       in case className of
+        Foldable.Foldable -> unaryClass' deriveFoldable
         Prelude.Eq -> unaryClass deriveEq
         Prelude.Eq1 -> unaryClass $ \_ _ -> deriveEq1
-        Prelude.Functor -> unaryClass deriveFunctor
+        Prelude.Functor -> unaryClass' deriveFunctor
         Prelude.Ord -> unaryClass deriveOrd
         Prelude.Ord1 -> unaryClass $ \_ _ -> deriveOrd1
+        Traversable.Traversable -> unaryClass' deriveTraversable
         -- See L.P.Sugar.TypeClasses.Deriving for the classes that can be
         -- derived prior to type checking.
         _ -> throwError . errorMessage $ CannotDerive className tys
@@ -359,73 +369,242 @@
   where go (RCons _ str typ typs) = (str, typ) : go typs
         go _ = []
 
-deriveFunctor
+data ParamUsage
+  = IsParam
+  | MentionsParam ParamUsage
+  | IsRecord (NonEmpty (PSString, ParamUsage))
+
+validateParamsInTypeConstructors
   :: forall m
    . MonadError MultipleErrors m
   => MonadState CheckState m
+  => Qualified (ProperName 'ClassName)
+  -> ModuleName
+  -> ProperName 'TypeName
+  -> m [(ProperName 'ConstructorName, [Maybe ParamUsage])]
+validateParamsInTypeConstructors derivingClass mn tyConNm = do
+  (_, _, tyArgNames, ctors) <- lookupTypeDecl mn tyConNm
+  param <- note (errorMessage $ KindsDoNotUnify (kindType -:> kindType) kindType) . lastMay $ map fst tyArgNames
+  ctors' <- traverse (traverse $ traverse replaceAllTypeSynonyms) ctors
+  let (ctorUsages, problemSpans) = runWriter $ traverse (traverse . traverse $ typeToUsageOf param) ctors'
+  for_ (nonEmpty $ ordNub problemSpans) $ \sss ->
+    throwError . addHint (RelatedPositions sss) . errorMessage $ CannotDeriveInvalidConstructorArg derivingClass
+  pure ctorUsages
+  where
+  typeToUsageOf :: Text -> SourceType -> Writer [SourceSpan] (Maybe ParamUsage)
+  typeToUsageOf param = go
+    where
+    assertNoParamUsedIn :: SourceType -> Writer [SourceSpan] ()
+    assertNoParamUsedIn = everythingOnTypes (*>) $ \case
+      TypeVar (ss, _) name | name == param -> tell [ss]
+      _ -> pure ()
+
+    go = \case
+      ForAll _ name _ ty _ ->
+        if name == param then pure Nothing else go ty
+
+      ConstrainedType _ _ ty ->
+        go ty
+
+      TypeApp _ (TypeConstructor _ Prim.Record) row ->
+        fmap (fmap IsRecord . nonEmpty . catMaybes) . for (decomposeRec' row) $ \(Label lbl, ty) ->
+          fmap (lbl, ) <$> go ty
+
+      TypeApp _ tyFn tyArg -> do
+        assertNoParamUsedIn tyFn
+        fmap MentionsParam <$> go tyArg
+
+      TypeVar _ name ->
+        pure $ (name == param) `orEmpty` IsParam
+
+      ty ->
+        assertNoParamUsedIn ty $> Nothing
+
+usingLamIdent :: forall m. MonadSupply m => (Expr -> m Expr) -> m Expr
+usingLamIdent cb = do
+  ident <- freshIdent "v"
+  lam ident <$> cb (mkVar ident)
+
+traverseFields :: forall f. Applicative f => (ParamUsage -> Expr -> f Expr) -> NonEmpty (PSString, ParamUsage) -> Expr -> f Expr
+traverseFields f fields r = fmap (ObjectUpdate r) . for (toList fields) $ \(lbl, usage) -> (lbl, ) <$> f usage (Accessor lbl r)
+
+unnestRecords :: forall f. Applicative f => (ParamUsage -> Expr -> f Expr) -> ParamUsage -> Expr -> f Expr
+unnestRecords f = fix $ \go -> \case
+  IsRecord fields -> traverseFields go fields
+  usage -> f usage
+
+mkCasesForTraversal
+  :: forall f m
+   . Applicative f -- this effect distinguishes the semantics of maps, folds, and traversals
   => MonadSupply m
   => ModuleName
+  -> (ParamUsage -> Expr -> f Expr) -- how to handle constructor arguments
+  -> (f Expr -> m Expr) -- resolve the applicative effect into an expression
+  -> [(ProperName 'ConstructorName, [Maybe ParamUsage])]
+  -> m Expr
+mkCasesForTraversal mn handleArg extractExpr ctors = do
+  m <- freshIdent "m"
+  fmap (lamCase m) . for ctors $ \(ctorName, ctorUsages) -> do
+    ctorArgs <- for ctorUsages $ \usage -> freshIdent "v" <&> (, usage)
+    let ctor = mkCtor mn ctorName
+    let caseBinder = mkCtorBinder mn ctorName $ map (mkBinder . fst) ctorArgs
+    fmap (CaseAlternative [caseBinder] . unguarded) . extractExpr $
+      fmap (foldl' App ctor) . for ctorArgs $ \(ident, mbUsage) -> maybe pure handleArg mbUsage $ mkVar ident
+
+data TraversalOps m = forall f. Applicative f => TraversalOps
+  { visitExpr :: m Expr -> f Expr -- lift an expression into the applicative effect defining the traversal
+  , extractExpr :: f Expr -> m Expr -- resolve the applicative effect into an expression
+  }
+
+mkTraversal
+  :: forall m
+   . MonadSupply m
+  => ModuleName
+  -> Expr -- a var representing map, foldMap, or traverse, for handling structured values
+  -> TraversalOps m
+  -> [(ProperName 'ConstructorName, [Maybe ParamUsage])]
+  -> m Expr
+mkTraversal mn recurseVar (TraversalOps @_ @f visitExpr extractExpr) ctors = do
+  f <- freshIdent "f"
+  let
+    handleValue :: ParamUsage -> Expr -> f Expr
+    handleValue = unnestRecords $ \usage inputExpr -> visitExpr $ flip App inputExpr <$> mkFnExprForValue usage
+
+    mkFnExprForValue :: ParamUsage -> m Expr
+    mkFnExprForValue = \case
+      IsParam ->
+        pure $ mkVar f
+      MentionsParam innerUsage ->
+        App recurseVar <$> mkFnExprForValue innerUsage
+      IsRecord fields ->
+        usingLamIdent $ extractExpr . traverseFields handleValue fields
+
+  lam f <$> mkCasesForTraversal mn handleValue extractExpr ctors
+
+deriveFunctor
+  :: forall m
+   . MonadError MultipleErrors m
+  => MonadState CheckState m
+  => MonadSupply m
+  => Qualified (ProperName 'ClassName)
+  -> ModuleName
   -> ProperName 'TypeName
   -> m [(PSString, Expr)]
-deriveFunctor mn tyConNm = do
-  (_, _, tys, ctors) <- lookupTypeDecl mn tyConNm
-  mapFun <- mkMapFunction tys ctors
+deriveFunctor nm mn tyConNm = do
+  ctors <- validateParamsInTypeConstructors nm mn tyConNm
+  mapFun <- mkTraversal mn mapVar (TraversalOps identity identity) ctors
   pure [(Prelude.map, mapFun)]
   where
-    mkMapFunction :: [(Text, Maybe SourceType)] -> [(ProperName 'ConstructorName, [SourceType])] -> m Expr
-    mkMapFunction tys ctors = case reverse tys of
-      [] -> throwError . errorMessage $ KindsDoNotUnify (kindType -:> kindType) kindType
-      ((iTy, _) : _) -> do
-        f <- freshIdent "f"
-        m <- freshIdent "m"
-        lam f . lamCase m <$> mapM (mkCtorClause iTy f) ctors
+  mapVar = mkRef Prelude.identMap
 
-    mkCtorClause :: Text -> Ident -> (ProperName 'ConstructorName, [SourceType]) -> m CaseAlternative
-    mkCtorClause iTyName f (ctorName, ctorTys) = do
-      idents <- replicateM (length ctorTys) (freshIdent "v")
-      ctorTys' <- mapM replaceAllTypeSynonyms ctorTys
-      args <- zipWithM transformArg idents ctorTys'
-      let ctor = mkCtor mn ctorName
-          rebuilt = foldl' App ctor args
-          caseBinder = mkCtorBinder mn ctorName $ map mkBinder idents
-      return $ CaseAlternative [caseBinder] (unguarded rebuilt)
-      where
-        fVar = mkVar f
-        mapVar = mkRef Prelude.identMap
+toConst :: forall f a b. f a -> Const [f a] b
+toConst = Const . pure
 
-        transformArg :: Ident -> SourceType -> m Expr
-        transformArg ident = fmap (foldr App (mkVar ident)) . goType where
+consumeConst :: forall f a b c. Applicative f => ([a] -> b) -> Const [f a] c -> f b
+consumeConst f = fmap f . sequenceA . getConst
 
-          goType :: SourceType -> m (Maybe Expr)
-          -- argument matches the index type
-          goType (TypeVar _ t) | t == iTyName = return (Just fVar)
+applyWhen :: forall a. Bool -> (a -> a) -> a -> a
+applyWhen cond f = if cond then f else identity
 
-          -- records
-          goType recTy | Just row <- objectType recTy =
-              traverse buildUpdate (decomposeRec' row) >>= (traverse buildRecord . justUpdates)
-            where
-              justUpdates :: [Maybe (Label, Expr)] -> Maybe [(Label, Expr)]
-              justUpdates = foldMap (fmap return)
+deriveFoldable
+  :: forall m
+   . MonadError MultipleErrors m
+  => MonadState CheckState m
+  => MonadSupply m
+  => Qualified (ProperName 'ClassName)
+  -> ModuleName
+  -> ProperName 'TypeName
+  -> m [(PSString, Expr)]
+deriveFoldable nm mn tyConNm = do
+  ctors <- validateParamsInTypeConstructors nm mn tyConNm
+  foldlFun <- mkAsymmetricFoldFunction False foldlVar ctors
+  foldrFun <- mkAsymmetricFoldFunction True foldrVar ctors
+  foldMapFun <- mkTraversal mn foldMapVar foldMapOps ctors
+  pure [(Foldable.foldl, foldlFun), (Foldable.foldr, foldrFun), (Foldable.foldMap, foldMapFun)]
+  where
+  foldlVar = mkRef Foldable.identFoldl
+  foldrVar = mkRef Foldable.identFoldr
+  foldMapVar = mkRef Foldable.identFoldMap
+  flipVar = mkRef Prelude.identFlip
 
-              buildUpdate :: (Label, SourceType) -> m (Maybe (Label, Expr))
-              buildUpdate (lbl, ty) = do upd <- goType ty
-                                         return ((lbl,) <$> upd)
+  mkAsymmetricFoldFunction :: Bool -> Expr -> [(ProperName 'ConstructorName, [Maybe ParamUsage])] -> m Expr
+  mkAsymmetricFoldFunction isRightFold recurseVar ctors = do
+    f <- freshIdent "f"
+    z <- freshIdent "z"
+    let
+      appCombiner :: (Bool, Expr) -> Expr -> Expr -> Expr
+      appCombiner (isFlipped, fn) = applyWhen (isFlipped == isRightFold) flip $ App . App fn
 
-              buildRecord :: [(Label, Expr)] -> m Expr
-              buildRecord updates = do
-                arg <- freshIdent "o"
-                let argVar = mkVar arg
-                    mkAssignment (Label l, x) = (l, App x (Accessor l argVar))
-                return (lam arg (ObjectUpdate argVar (mkAssignment <$> updates)))
+      mkCombinerExpr :: ParamUsage -> m Expr
+      mkCombinerExpr = fmap (uncurry $ \isFlipped -> applyWhen isFlipped $ App flipVar) . getCombiner
 
-          -- quantifiers
-          goType (ForAll _ scopedVar _ t _) | scopedVar /= iTyName = goType t
+      handleValue :: ParamUsage -> Expr -> Const [m (Expr -> Expr)] Expr
+      handleValue = unnestRecords $ \usage inputExpr -> toConst $ flip appCombiner inputExpr <$> getCombiner usage
 
-          -- constraints
-          goType (ConstrainedType _ _ t) = goType t
+      getCombiner :: ParamUsage -> m (Bool, Expr)
+      getCombiner = \case
+        IsParam ->
+          pure (False, mkVar f)
+        MentionsParam innerUsage ->
+          (isRightFold, ) . App recurseVar <$> mkCombinerExpr innerUsage
+        IsRecord fields -> do
+          let foldFieldsOf = traverseFields handleValue fields
+          fmap (False, ) . usingLamIdent $ \lVar ->
+            usingLamIdent $
+              if isRightFold
+              then flip extractExprStartingWith $ foldFieldsOf lVar
+              else extractExprStartingWith lVar . foldFieldsOf
 
-          -- under a `* -> *`, just assume functor for now
-          goType (TypeApp _ _ t) = fmap (App mapVar) <$> goType t
+      extractExprStartingWith :: Expr -> Const [m (Expr -> Expr)] Expr -> m Expr
+      extractExprStartingWith = consumeConst . if isRightFold then foldr ($) else foldl' (&)
 
-          -- otherwise do nothing - will fail type checking if type does actually contain index
-          goType _ = return Nothing
+    lam f . lam z <$> mkCasesForTraversal mn handleValue (extractExprStartingWith $ mkVar z) ctors
+
+foldMapOps :: forall m. Applicative m => TraversalOps m
+foldMapOps = TraversalOps { visitExpr = toConst, .. }
+  where
+  appendVar = mkRef Prelude.identAppend
+  memptyVar = mkRef Prelude.identMempty
+
+  extractExpr :: Const [m Expr] Expr -> m Expr
+  extractExpr = consumeConst $ \case
+    [] -> memptyVar
+    exprs -> foldr1 (App . App appendVar) exprs
+
+deriveTraversable
+  :: forall m
+   . MonadError MultipleErrors m
+  => MonadState CheckState m
+  => MonadSupply m
+  => Qualified (ProperName 'ClassName)
+  -> ModuleName
+  -> ProperName 'TypeName
+  -> m [(PSString, Expr)]
+deriveTraversable nm mn tyConNm = do
+  ctors <- validateParamsInTypeConstructors nm mn tyConNm
+  traverseFun <- mkTraversal mn traverseVar traverseOps ctors
+  sequenceFun <- usingLamIdent $ pure . App (App traverseVar identityVar)
+  pure [(Traversable.traverse, traverseFun), (Traversable.sequence, sequenceFun)]
+  where
+  traverseVar = mkRef Traversable.identTraverse
+  identityVar = mkRef Prelude.identIdentity
+
+traverseOps :: forall m. MonadSupply m => TraversalOps m
+traverseOps = TraversalOps { .. }
+  where
+  pureVar = mkRef Prelude.identPure
+  mapVar = mkRef Prelude.identMap
+  applyVar = mkRef Prelude.identApply
+
+  visitExpr :: m Expr -> WriterT [(Ident, m Expr)] m Expr
+  visitExpr traversedExpr = do
+    ident <- freshIdent "v"
+    tell [(ident, traversedExpr)] $> mkVar ident
+
+  extractExpr :: WriterT [(Ident, m Expr)] m Expr -> m Expr
+  extractExpr = runWriterT >=> \(result, unzip -> (ctx, args)) -> flip mkApps (foldr lam result ctx) <$> sequenceA args
+
+  mkApps :: [Expr] -> Expr -> Expr
+  mkApps = \case
+    [] -> App pureVar
+    h : t -> \l -> foldl' (App . App applyVar) (App (App mapVar l) h) t
diff --git a/src/Language/PureScript/TypeChecker/Entailment.hs b/src/Language/PureScript/TypeChecker/Entailment.hs
--- a/src/Language/PureScript/TypeChecker/Entailment.hs
+++ b/src/Language/PureScript/TypeChecker/Entailment.hs
@@ -9,7 +9,7 @@
   , entails
   ) where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Control.Arrow (second, (&&&))
@@ -225,7 +225,7 @@
     ctorModules _ = Nothing
 
     findDicts :: InstanceContext -> Qualified (ProperName 'ClassName) -> QualifiedBy -> [TypeClassDict]
-    findDicts ctx cn = fmap (fmap NamedInstance) . foldMap NEL.toList . foldMap M.elems . (>>= M.lookup cn) . flip M.lookup ctx
+    findDicts ctx cn = fmap (fmap NamedInstance) . foldMap NEL.toList . foldMap M.elems . (M.lookup cn <=< flip M.lookup ctx)
 
     valUndefined :: Expr
     valUndefined = Var nullSourceSpan (Qualified (ByModuleName C.Prim) (Ident C.undefined))
diff --git a/src/Language/PureScript/TypeChecker/Entailment/Coercible.hs b/src/Language/PureScript/TypeChecker/Entailment/Coercible.hs
--- a/src/Language/PureScript/TypeChecker/Entailment/Coercible.hs
+++ b/src/Language/PureScript/TypeChecker/Entailment/Coercible.hs
@@ -13,7 +13,7 @@
   , insoluble
   ) where
 
-import Prelude.Compat hiding (interact)
+import Prelude hiding (interact)
 
 import Control.Applicative ((<|>), empty)
 import Control.Arrow ((&&&))
diff --git a/src/Language/PureScript/TypeChecker/Kinds.hs b/src/Language/PureScript/TypeChecker/Kinds.hs
--- a/src/Language/PureScript/TypeChecker/Kinds.hs
+++ b/src/Language/PureScript/TypeChecker/Kinds.hs
@@ -25,7 +25,7 @@
   , freshKindWithKind
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow ((***))
 import Control.Lens ((^.), _1, _2, _3)
diff --git a/src/Language/PureScript/TypeChecker/Monad.hs b/src/Language/PureScript/TypeChecker/Monad.hs
--- a/src/Language/PureScript/TypeChecker/Monad.hs
+++ b/src/Language/PureScript/TypeChecker/Monad.hs
@@ -5,7 +5,7 @@
 --
 module Language.PureScript.TypeChecker.Monad where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow (second)
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/TypeChecker/Roles.hs b/src/Language/PureScript/TypeChecker/Roles.hs
--- a/src/Language/PureScript/TypeChecker/Roles.hs
+++ b/src/Language/PureScript/TypeChecker/Roles.hs
@@ -11,7 +11,7 @@
   , inferDataBindingGroupRoles
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Arrow ((&&&))
 import Control.Monad (unless, when, zipWithM_)
diff --git a/src/Language/PureScript/TypeChecker/Skolems.hs b/src/Language/PureScript/TypeChecker/Skolems.hs
--- a/src/Language/PureScript/TypeChecker/Skolems.hs
+++ b/src/Language/PureScript/TypeChecker/Skolems.hs
@@ -8,7 +8,7 @@
   , skolemEscapeCheck
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.Error.Class (MonadError(..))
 import Control.Monad.State.Class (MonadState(..), gets, modify)
diff --git a/src/Language/PureScript/TypeChecker/Subsumption.hs b/src/Language/PureScript/TypeChecker/Subsumption.hs
--- a/src/Language/PureScript/TypeChecker/Subsumption.hs
+++ b/src/Language/PureScript/TypeChecker/Subsumption.hs
@@ -5,7 +5,7 @@
   ( subsumes
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad (when)
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/TypeChecker/Synonyms.hs b/src/Language/PureScript/TypeChecker/Synonyms.hs
--- a/src/Language/PureScript/TypeChecker/Synonyms.hs
+++ b/src/Language/PureScript/TypeChecker/Synonyms.hs
@@ -10,7 +10,7 @@
   , replaceAllTypeSynonymsM
   ) where
 
-import           Prelude.Compat
+import           Prelude
 
 import           Control.Monad.Error.Class (MonadError(..))
 import           Control.Monad.State
diff --git a/src/Language/PureScript/TypeChecker/Types.hs b/src/Language/PureScript/TypeChecker/Types.hs
--- a/src/Language/PureScript/TypeChecker/Types.hs
+++ b/src/Language/PureScript/TypeChecker/Types.hs
@@ -23,7 +23,7 @@
       Check a function of a given type returns a value of another type when applied to its arguments
 -}
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub, fold, atMay)
 
 import Control.Arrow (first, second, (***))
diff --git a/src/Language/PureScript/TypeChecker/Unify.hs b/src/Language/PureScript/TypeChecker/Unify.hs
--- a/src/Language/PureScript/TypeChecker/Unify.hs
+++ b/src/Language/PureScript/TypeChecker/Unify.hs
@@ -14,7 +14,7 @@
   , varIfUnknown
   ) where
 
-import Prelude.Compat
+import Prelude
 
 import Control.Monad
 import Control.Monad.Error.Class (MonadError(..))
diff --git a/src/Language/PureScript/TypeClassDictionaries.hs b/src/Language/PureScript/TypeClassDictionaries.hs
--- a/src/Language/PureScript/TypeClassDictionaries.hs
+++ b/src/Language/PureScript/TypeClassDictionaries.hs
@@ -1,6 +1,6 @@
 module Language.PureScript.TypeClassDictionaries where
 
-import Prelude.Compat
+import Prelude
 
 import GHC.Generics (Generic)
 import Control.DeepSeq (NFData)
diff --git a/src/Language/PureScript/Types.hs b/src/Language/PureScript/Types.hs
--- a/src/Language/PureScript/Types.hs
+++ b/src/Language/PureScript/Types.hs
@@ -3,7 +3,7 @@
 --
 module Language.PureScript.Types where
 
-import Prelude.Compat
+import Prelude
 import Protolude (ordNub)
 
 import Codec.Serialise (Serialise)
@@ -17,7 +17,7 @@
 import qualified Data.Aeson.Types as A
 import Data.Foldable (fold, foldl')
 import qualified Data.IntSet as IS
-import Data.List (sort, sortOn)
+import Data.List (sortOn)
 import Data.Maybe (fromMaybe, isJust)
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -511,7 +511,7 @@
 
 -- | Collect all free type variables appearing in a type
 freeTypeVariables :: Type a -> [Text]
-freeTypeVariables = ordNub . fmap snd . sort . go 0 [] where
+freeTypeVariables = ordNub . fmap snd . sortOn fst . go 0 [] where
   -- Tracks kind levels so that variables appearing in kind annotations are listed first.
   go :: Int -> [Text] -> Type a -> [(Int, Text)]
   go lvl bound (TypeVar _ v) | v `notElem` bound = [(lvl, v)]
diff --git a/src/System/IO/UTF8.hs b/src/System/IO/UTF8.hs
--- a/src/System/IO/UTF8.hs
+++ b/src/System/IO/UTF8.hs
@@ -1,6 +1,6 @@
 module System.IO.UTF8 where
 
-import Prelude.Compat
+import Prelude
 
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Lazy as BSL
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -2,8 +2,7 @@
 
 module Main (main) where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Test.Hspec
 
diff --git a/tests/TestCompiler.hs b/tests/TestCompiler.hs
--- a/tests/TestCompiler.hs
+++ b/tests/TestCompiler.hs
@@ -22,8 +22,7 @@
 -- missing, and can be updated by setting the "HSPEC_ACCEPT" environment
 -- variable, e.g. by running `HSPEC_ACCEPT=true stack test`.
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import qualified Language.PureScript as P
 import Language.PureScript.Interactive.IO (readNodeProcessWithExitCode)
@@ -135,9 +134,10 @@
   -> Handle
   -> Expectation
 assertCompiles support inputFiles outputFile = do
-  (result, _) <- compile (Just IsMain) support inputFiles
+  (fileContents, (result, _)) <- compile (Just IsMain) support inputFiles
+  let errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
   case result of
-    Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
+    Left errs -> expectationFailure . P.prettyPrintMultipleErrors errorOptions $ errs
     Right _ -> do
       let entryPoint = modulesDir </> "index.js"
       writeFile entryPoint "import('./Main/index.js').then(({ main }) => main());"
@@ -157,15 +157,16 @@
   -> [String]
   -> Expectation
 assertCompilesWithWarnings support inputFiles shouldWarnWith = do
-  result'@(result, warnings) <- compile Nothing support inputFiles
+  (fileContents, result'@(result, warnings)) <- compile Nothing support inputFiles
+  let errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
   case result of
     Left errs ->
-      expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
+      expectationFailure . P.prettyPrintMultipleErrors errorOptions $ errs
     Right _ -> do
-      checkShouldReport shouldWarnWith (P.prettyPrintMultipleWarnings P.defaultPPEOptions) warnings
+      checkShouldReport shouldWarnWith (P.prettyPrintMultipleWarnings errorOptions) warnings
       goldenVsString
         (replaceExtension (getTestMain inputFiles) ".out")
-        (return . T.encodeUtf8 . T.pack $ printDiagnosticsForGoldenTest result')
+        (return . T.encodeUtf8 . T.pack $ printDiagnosticsForGoldenTest fileContents result')
 
 assertDoesNotCompile
   :: SupportModules
@@ -173,7 +174,8 @@
   -> [String]
   -> Expectation
 assertDoesNotCompile support inputFiles shouldFailWith = do
-  result <- compile Nothing support inputFiles
+  (fileContents, result) <- compile Nothing support inputFiles
+  let errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
   case fst result of
     Left errs -> do
       when (null shouldFailWith)
@@ -181,10 +183,10 @@
           "shouldFailWith declaration is missing (errors were: "
           ++ show (map P.errorCode (P.runMultipleErrors errs))
           ++ ")")
-      checkShouldReport shouldFailWith (P.prettyPrintMultipleErrors P.defaultPPEOptions) errs
+      checkShouldReport shouldFailWith (P.prettyPrintMultipleErrors errorOptions) errs
       goldenVsString
         (replaceExtension (getTestMain inputFiles) ".out")
-        (return . T.encodeUtf8 . T.pack $ printDiagnosticsForGoldenTest result)
+        (return . T.encodeUtf8 . T.pack $ printDiagnosticsForGoldenTest fileContents result)
     Right _ ->
       expectationFailure "Should not have compiled"
 
@@ -193,9 +195,10 @@
   -> [FilePath]
   -> Expectation
 assertCompilesToExpectedOutput support inputFiles = do
-  (result, _) <- compile Nothing support inputFiles
+  (fileContents, (result, _)) <- compile Nothing support inputFiles
+  let errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
   case result of
-    Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
+    Left errs -> expectationFailure . P.prettyPrintMultipleErrors errorOptions $ errs
     Right _ ->
       goldenVsString
         (replaceExtension (getTestMain inputFiles) ".out.js")
@@ -203,14 +206,16 @@
 
 -- Prints a set of diagnostics (i.e. errors or warnings) as a string, in order
 -- to compare it to the contents of a golden test file.
-printDiagnosticsForGoldenTest :: (Either P.MultipleErrors a, P.MultipleErrors) -> String
-printDiagnosticsForGoldenTest (result, warnings) =
+printDiagnosticsForGoldenTest :: [(FilePath, T.Text)] -> (Either P.MultipleErrors a, P.MultipleErrors) -> String
+printDiagnosticsForGoldenTest fileContents (result, warnings) =
   normalizePaths $ case result of
     Left errs ->
       -- TODO: should probably include warnings when failing?
-      P.prettyPrintMultipleErrors P.defaultPPEOptions errs
+      P.prettyPrintMultipleErrors errorOptions errs
     Right _ ->
-      P.prettyPrintMultipleWarnings P.defaultPPEOptions warnings
+      P.prettyPrintMultipleWarnings errorOptions warnings
+  where
+  errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
 
 -- Replaces Windows-style paths in an error or warning with POSIX paths
 normalizePaths :: String -> String
diff --git a/tests/TestCoreFn.hs b/tests/TestCoreFn.hs
--- a/tests/TestCoreFn.hs
+++ b/tests/TestCoreFn.hs
@@ -2,8 +2,7 @@
 
 module TestCoreFn (spec) where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Data.Aeson
 import Data.Aeson.Types as Aeson
diff --git a/tests/TestDocs.hs b/tests/TestDocs.hs
--- a/tests/TestDocs.hs
+++ b/tests/TestDocs.hs
@@ -1,7 +1,6 @@
 module TestDocs where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Data.Bifunctor (first)
 import Data.List (findIndex)
diff --git a/tests/TestGraph.hs b/tests/TestGraph.hs
--- a/tests/TestGraph.hs
+++ b/tests/TestGraph.hs
@@ -1,7 +1,6 @@
 module TestGraph where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Test.Hspec
 import Data.Either (isLeft)
diff --git a/tests/TestMake.hs b/tests/TestMake.hs
--- a/tests/TestMake.hs
+++ b/tests/TestMake.hs
@@ -3,8 +3,7 @@
 
 module TestMake where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import qualified Language.PureScript as P
 import qualified Language.PureScript.CST as CST
diff --git a/tests/TestPsci.hs b/tests/TestPsci.hs
--- a/tests/TestPsci.hs
+++ b/tests/TestPsci.hs
@@ -1,6 +1,5 @@
 module TestPsci where
 
-import Prelude ()
 
 import TestPsci.CommandTest (commandTests)
 import TestPsci.CompletionTest (completionTests)
diff --git a/tests/TestPsci/CommandTest.hs b/tests/TestPsci/CommandTest.hs
--- a/tests/TestPsci/CommandTest.hs
+++ b/tests/TestPsci/CommandTest.hs
@@ -1,7 +1,6 @@
 module TestPsci.CommandTest where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Control.Monad.IO.Class (liftIO)
 import Control.Monad.Trans.RWS.Strict (get)
diff --git a/tests/TestPsci/CompletionTest.hs b/tests/TestPsci/CompletionTest.hs
--- a/tests/TestPsci/CompletionTest.hs
+++ b/tests/TestPsci/CompletionTest.hs
@@ -1,7 +1,6 @@
 module TestPsci.CompletionTest where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import Test.Hspec
 
diff --git a/tests/TestPsci/EvalTest.hs b/tests/TestPsci/EvalTest.hs
--- a/tests/TestPsci/EvalTest.hs
+++ b/tests/TestPsci/EvalTest.hs
@@ -1,7 +1,6 @@
 module TestPsci.EvalTest where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import           Control.Monad (forM_, foldM_)
 import           Control.Monad.IO.Class (liftIO)
diff --git a/tests/TestPsci/TestEnv.hs b/tests/TestPsci/TestEnv.hs
--- a/tests/TestPsci/TestEnv.hs
+++ b/tests/TestPsci/TestEnv.hs
@@ -1,7 +1,6 @@
 module TestPsci.TestEnv where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import           Control.Exception.Lifted (bracket_)
 import           Control.Monad (void, when)
diff --git a/tests/TestSourceMaps.hs b/tests/TestSourceMaps.hs
--- a/tests/TestSourceMaps.hs
+++ b/tests/TestSourceMaps.hs
@@ -52,9 +52,10 @@
   let
     modulePath = getTestMain inputFiles
 
-  (result, _) <- compile' compilationOptions (Just (IsSourceMap modulePath)) support inputFiles
+  (fileContents, (result, _)) <- compile' compilationOptions (Just (IsSourceMap modulePath)) support inputFiles
+  let errorOptions = P.defaultPPEOptions { P.ppeFileContents = fileContents }
   case result of
-    Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
+    Left errs -> expectationFailure . P.prettyPrintMultipleErrors errorOptions $ errs
     Right actualSourceMapFile -> do
       let
         readAndDecode :: FilePath ->  IO (Maybe Json.Value)
diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs
--- a/tests/TestUtils.hs
+++ b/tests/TestUtils.hs
@@ -1,7 +1,6 @@
 module TestUtils where
 
-import Prelude ()
-import Prelude.Compat
+import Prelude
 
 import qualified Language.PureScript as P
 import qualified Language.PureScript.CST as CST
@@ -189,7 +188,7 @@
   :: Maybe ExpectedModuleName
   -> SupportModules
   -> [FilePath]
-  -> IO (Either P.MultipleErrors FilePath, P.MultipleErrors)
+  -> IO ([(FilePath, T.Text)], (Either P.MultipleErrors FilePath, P.MultipleErrors))
 compile = compile' P.defaultOptions
 
 compile'
@@ -197,41 +196,42 @@
   -> Maybe ExpectedModuleName
   -> SupportModules
   -> [FilePath]
-  -> IO (Either P.MultipleErrors FilePath, P.MultipleErrors)
-compile' options expectedModule SupportModules{..} inputFiles = P.runMake options $ do
+  -> IO ([(FilePath, T.Text)], (Either P.MultipleErrors FilePath, P.MultipleErrors))
+compile' options expectedModule SupportModules{..} inputFiles = do
   -- Sorting the input files makes some messages (e.g., duplicate module) deterministic
-  fs <- liftIO $ readInput (sort inputFiles)
-  msWithWarnings <- CST.parseFromFiles id fs
-  tell $ foldMap (\(fp, (ws, _)) -> CST.toMultipleWarnings fp ws) msWithWarnings
-  let ms = fmap snd <$> msWithWarnings
-  foreigns <- inferForeignModules ms
-  let
-    actions = makeActions supportModules (foreigns `M.union` supportForeigns)
-    (hasExpectedModuleName, expectedModuleName, compiledModulePath) = case expectedModule of
-      -- Check if there is one (and only one) module called "Main"
-      Just IsMain ->
-        let
-          moduleName = "Main"
-          compiledPath = modulesDir </> moduleName </> "index.js"
-        in ((==) 1 $ length $ filter (== moduleName) $ fmap (T.unpack . getPsModuleName) ms, moduleName, compiledPath)
-      -- Check if main sourcemap module starts with "SourceMaps." and matches its file name
-      Just (IsSourceMap modulePath) ->
-        let
-          moduleName = "SourceMaps." <> (dropExtensions . takeFileName $ modulePath)
-          compiledPath = modulesDir </> moduleName </> "index.js.map"
-        in (maybe False ((==) moduleName . T.unpack . getPsModuleName) (find ((==) modulePath . fst) ms), moduleName, compiledPath)
-      Nothing -> (True, mempty, mempty)
+  fs <- readInput (sort inputFiles)
+  fmap (fs, ) . P.runMake options $ do
+    msWithWarnings <- CST.parseFromFiles id fs
+    tell $ foldMap (\(fp, (ws, _)) -> CST.toMultipleWarnings fp ws) msWithWarnings
+    let ms = fmap snd <$> msWithWarnings
+    foreigns <- inferForeignModules ms
+    let
+      actions = makeActions supportModules (foreigns `M.union` supportForeigns)
+      (hasExpectedModuleName, expectedModuleName, compiledModulePath) = case expectedModule of
+        -- Check if there is one (and only one) module called "Main"
+        Just IsMain ->
+          let
+            moduleName = "Main"
+            compiledPath = modulesDir </> moduleName </> "index.js"
+          in ((==) 1 $ length $ filter (== moduleName) $ fmap (T.unpack . getPsModuleName) ms, moduleName, compiledPath)
+        -- Check if main sourcemap module starts with "SourceMaps." and matches its file name
+        Just (IsSourceMap modulePath) ->
+          let
+            moduleName = "SourceMaps." <> (dropExtensions . takeFileName $ modulePath)
+            compiledPath = modulesDir </> moduleName </> "index.js.map"
+          in (maybe False ((==) moduleName . T.unpack . getPsModuleName) (find ((==) modulePath . fst) ms), moduleName, compiledPath)
+        Nothing -> (True, mempty, mempty)
 
-  case ms of
-    [singleModule] -> do
-      unless hasExpectedModuleName $
-        error ("While testing a single PureScript file, the expected module name was '" <> expectedModuleName <>
-          "' but got '" <> T.unpack (getPsModuleName singleModule) <> "'.")
-      compiledModulePath <$ P.rebuildModule actions supportExterns (snd singleModule)
-    _ -> do
-      unless hasExpectedModuleName $
-        error $ "While testing multiple PureScript files, the expected main module was not found: '" <> expectedModuleName <> "'."
-      compiledModulePath <$ P.make actions (CST.pureResult <$> supportModules ++ map snd ms)
+    case ms of
+      [singleModule] -> do
+        unless hasExpectedModuleName $
+          error ("While testing a single PureScript file, the expected module name was '" <> expectedModuleName <>
+            "' but got '" <> T.unpack (getPsModuleName singleModule) <> "'.")
+        compiledModulePath <$ P.rebuildModule actions supportExterns (snd singleModule)
+      _ -> do
+        unless hasExpectedModuleName $
+          error $ "While testing multiple PureScript files, the expected main module was not found: '" <> expectedModuleName <> "'."
+        compiledModulePath <$ P.make actions (CST.pureResult <$> supportModules ++ map snd ms)
 
 getPsModuleName :: (a, AST.Module) -> T.Text
 getPsModuleName psModule = case snd psModule of
diff --git a/tests/purs/docs/output/Ado/docs.json b/tests/purs/docs/output/Ado/docs.json
--- a/tests/purs/docs/output/Ado/docs.json
+++ b/tests/purs/docs/output/Ado/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[9,16],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Ado.purs","start":[4,1]},"title":"test"}],"name":"Ado","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[9,16],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Ado.purs","start":[4,1]},"title":"test"}],"name":"Ado","reExports":[]}
diff --git a/tests/purs/docs/output/ChildDeclOrder/docs.json b/tests/purs/docs/output/ChildDeclOrder/docs.json
--- a/tests/purs/docs/output/ChildDeclOrder/docs.json
+++ b/tests/purs/docs/output/ChildDeclOrder/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[8,10],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[8,3]},"title":"First"},{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[9,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[9,3]},"title":"Second"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[19,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[18,1]},"title":"showTwo"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,16],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[21,1]},"title":"fooTwo"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[9,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[7,1]},"title":"Two"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[12,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[12,3]},"title":"show"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[19,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[18,1]},"title":"showTwo"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[12,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[11,1]},"title":"Show"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[15,12],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[15,3]},"title":"foo1"},{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[16,12],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[16,3]},"title":"foo2"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,16],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[21,1]},"title":"fooTwo"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[27,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[25,1]},"title":"fooInt"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[16,12],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[14,1]},"title":"Foo"}],"name":"ChildDeclOrder","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[8,10],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[8,3]},"title":"First"},{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[9,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[9,3]},"title":"Second"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[19,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[18,1]},"title":"showTwo"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,16],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[21,1]},"title":"fooTwo"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[9,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[7,1]},"title":"Two"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[12,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[12,3]},"title":"show"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[19,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[18,1]},"title":"showTwo"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[12,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[11,1]},"title":"Show"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[15,12],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[15,3]},"title":"foo1"},{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[16,12],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[16,3]},"title":"foo2"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["ChildDeclOrder"],"Two"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,16],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[21,1]},"title":"fooTwo"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["ChildDeclOrder"],"Foo"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[27,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[25,1]},"title":"fooInt"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[16,12],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ChildDeclOrder.purs","start":[14,1]},"title":"Foo"}],"name":"ChildDeclOrder","reExports":[]}
diff --git a/tests/purs/docs/output/Clash1a/docs.json b/tests/purs/docs/output/Clash1a/docs.json
--- a/tests/purs/docs/output/Clash1a/docs.json
+++ b/tests/purs/docs/output/Clash1a/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,13],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash1a.purs","start":[3,1]},"title":"value"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,17],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash1a.purs","start":[6,1]},"title":"Type'"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[9,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash1a.purs","start":[9,3]},"title":"typeClassMember"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash1a.purs","start":[8,1]},"title":"TypeClass"}],"name":"Clash1a","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,13],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash1a.purs","start":[3,1]},"title":"value"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,17],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash1a.purs","start":[6,1]},"title":"Type'"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[9,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash1a.purs","start":[9,3]},"title":"typeClassMember"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash1a.purs","start":[8,1]},"title":"TypeClass"}],"name":"Clash1a","reExports":[]}
diff --git a/tests/purs/docs/output/Clash2a/docs.json b/tests/purs/docs/output/Clash2a/docs.json
--- a/tests/purs/docs/output/Clash2a/docs.json
+++ b/tests/purs/docs/output/Clash2a/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,16],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash2a.purs","start":[3,1]},"title":"value"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash2a.purs","start":[6,1]},"title":"Type'"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,28],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash2a.purs","start":[9,3]},"title":"typeClassMember"}],"comments":null,"info":{"arguments":[["a",null],["b",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,28],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Clash2a.purs","start":[8,1]},"title":"TypeClass"}],"name":"Clash2a","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,16],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash2a.purs","start":[3,1]},"title":"value"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash2a.purs","start":[6,1]},"title":"Type'"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,28],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash2a.purs","start":[9,3]},"title":"typeClassMember"}],"comments":null,"info":{"arguments":[["a",null],["b",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,28],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Clash2a.purs","start":[8,1]},"title":"TypeClass"}],"name":"Clash2a","reExports":[]}
diff --git a/tests/purs/docs/output/ConstrainedArgument/docs.json b/tests/purs/docs/output/ConstrainedArgument/docs.json
--- a/tests/purs/docs/output/ConstrainedArgument/docs.json
+++ b/tests/purs/docs/output/ConstrainedArgument/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[["t",{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[3,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[3,1]},"title":"Foo"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,54],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[5,1]},"title":"WithoutArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[6,52],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[6,1]},"title":"WithArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[7,65],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[7,1]},"title":"MultiWithoutArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"b","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[8,63],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[8,1]},"title":"MultiWithArgs"}],"name":"ConstrainedArgument","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[["t",{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[3,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[3,1]},"title":"Foo"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,54],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[5,1]},"title":"WithoutArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[6,52],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[6,1]},"title":"WithArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[],"constraintClass":[["Prim"],"Partial"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[7,65],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[7,1]},"title":"MultiWithoutArgs"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"b","tag":"TypeVar"}],"constraintClass":[["ConstrainedArgument"],"Foo"],"constraintData":null,"constraintKindArgs":[]},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"ConstrainedType"}],"tag":"ConstrainedType"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[8,63],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ConstrainedArgument.purs","start":[8,1]},"title":"MultiWithArgs"}],"name":"ConstrainedArgument","reExports":[]}
diff --git a/tests/purs/docs/output/DeclOrder/docs.json b/tests/purs/docs/output/DeclOrder/docs.json
--- a/tests/purs/docs/output/DeclOrder/docs.json
+++ b/tests/purs/docs/output/DeclOrder/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[16,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[16,1]},"title":"A"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[10,7],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[10,1]},"title":"x1"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[13,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[13,1]},"title":"X2"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[11,7],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[11,1]},"title":"x3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[14,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[14,1]},"title":"X4"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[17,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrder.purs","start":[17,1]},"title":"B"}],"name":"DeclOrder","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[16,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[16,1]},"title":"A"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[10,7],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[10,1]},"title":"x1"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[13,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[13,1]},"title":"X2"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[11,7],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[11,1]},"title":"x3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[14,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[14,1]},"title":"X4"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[17,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrder.purs","start":[17,1]},"title":"B"}],"name":"DeclOrder","reExports":[]}
diff --git a/tests/purs/docs/output/DeclOrderNoExportList/docs.json b/tests/purs/docs/output/DeclOrderNoExportList/docs.json
--- a/tests/purs/docs/output/DeclOrderNoExportList/docs.json
+++ b/tests/purs/docs/output/DeclOrderNoExportList/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,7],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[3,1]},"title":"x1"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[4,7],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[4,1]},"title":"x3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[6,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[6,1]},"title":"X2"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[7,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[7,1]},"title":"X4"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[9,1]},"title":"A"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[10,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[10,1]},"title":"B"}],"name":"DeclOrderNoExportList","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,7],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[3,1]},"title":"x1"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[4,7],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[4,1]},"title":"x3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[6,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[6,1]},"title":"X2"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[7,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[7,1]},"title":"X4"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[9,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[9,1]},"title":"A"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[10,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DeclOrderNoExportList.purs","start":[10,1]},"title":"B"}],"name":"DeclOrderNoExportList","reExports":[]}
diff --git a/tests/purs/docs/output/Desugar/docs.json b/tests/purs/docs/output/Desugar/docs.json
--- a/tests/purs/docs/output/Desugar/docs.json
+++ b/tests/purs/docs/output/Desugar/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[3,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Desugar.purs","start":[3,12]},"title":"X"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[3,19],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Desugar.purs","start":[3,1]},"title":"X"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Desugar"],"X"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,38],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Desugar.purs","start":[5,1]},"title":"test"}],"name":"Desugar","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[3,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Desugar.purs","start":[3,12]},"title":"X"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[3,19],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Desugar.purs","start":[3,1]},"title":"X"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Desugar"],"X"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,38],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Desugar.purs","start":[5,1]},"title":"test"}],"name":"Desugar","reExports":[]}
diff --git a/tests/purs/docs/output/DocComments/docs.json b/tests/purs/docs/output/DocComments/docs.json
--- a/tests/purs/docs/output/DocComments/docs.json
+++ b/tests/purs/docs/output/DocComments/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":"This declaration has a code block:\n\n    example == 0\n\nHere we are really testing that the leading whitespace is not stripped, as\nthis ensures that we don't accidentally change code blocks into normal\nparagraphs.\n","info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[10,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocComments.purs","start":[10,1]},"title":"example"}],"name":"DocComments","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":"This declaration has a code block:\n\n    example == 0\n\nHere we are really testing that the leading whitespace is not stripped, as\nthis ensures that we don't accidentally change code blocks into normal\nparagraphs.\n","info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[10,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocComments.purs","start":[10,1]},"title":"example"}],"name":"DocComments","reExports":[]}
diff --git a/tests/purs/docs/output/DocCommentsClassMethod/docs.json b/tests/purs/docs/output/DocCommentsClassMethod/docs.json
--- a/tests/purs/docs/output/DocCommentsClassMethod/docs.json
+++ b/tests/purs/docs/output/DocCommentsClassMethod/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":"class method comment\n","info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[5,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[5,3]},"title":"bar"},{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[6,21],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[6,3]},"title":"baz"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[6,21],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[3,1]},"title":"Foo"}],"name":"DocCommentsClassMethod","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":"class method comment\n","info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[5,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[5,3]},"title":"bar"},{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[6,21],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[6,3]},"title":"baz"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[6,21],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsClassMethod.purs","start":[3,1]},"title":"Foo"}],"name":"DocCommentsClassMethod","reExports":[]}
diff --git a/tests/purs/docs/output/DocCommentsDataConstructor/docs.json b/tests/purs/docs/output/DocCommentsDataConstructor/docs.json
--- a/tests/purs/docs/output/DocCommentsDataConstructor/docs.json
+++ b/tests/purs/docs/output/DocCommentsDataConstructor/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":"data constructor comment\n","info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[5,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[5,3]},"title":"Bar"},{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[6,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[6,3]},"title":"Baz"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[6,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[3,1]},"title":"Foo"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[9,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[9,3]},"title":"ComplexBar"},{"comments":"another data constructor comment\n","info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[11,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[11,3]},"title":"ComplexBaz"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[11,19],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[8,1]},"title":"ComplexFoo"},{"children":[{"comments":"newtype data constructor comment\n","info":{"arguments":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Record"],"tag":"TypeConstructor"},{"annotation":[],"contents":["newtypeBar",{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"},{"annotation":[],"tag":"REmpty"}],"tag":"RCons"}],"tag":"TypeApp"}],"declType":"dataConstructor"},"sourceSpan":{"end":[15,40],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[15,3]},"title":"NewtypeFoo"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[15,40],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[13,1]},"title":"NewtypeFoo"}],"name":"DocCommentsDataConstructor","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":"data constructor comment\n","info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[5,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[5,3]},"title":"Bar"},{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[6,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[6,3]},"title":"Baz"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[6,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[3,1]},"title":"Foo"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[9,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[9,3]},"title":"ComplexBar"},{"comments":"another data constructor comment\n","info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[11,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[11,3]},"title":"ComplexBaz"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[11,19],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[8,1]},"title":"ComplexFoo"},{"children":[{"comments":"newtype data constructor comment\n","info":{"arguments":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Record"],"tag":"TypeConstructor"},{"annotation":[],"contents":["newtypeBar",{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"},{"annotation":[],"tag":"REmpty"}],"tag":"RCons"}],"tag":"TypeApp"}],"declType":"dataConstructor"},"sourceSpan":{"end":[15,40],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[15,3]},"title":"NewtypeFoo"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[15,40],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsDataConstructor.purs","start":[13,1]},"title":"NewtypeFoo"}],"name":"DocCommentsDataConstructor","reExports":[]}
diff --git a/tests/purs/docs/output/DocCommentsMerge/docs.json b/tests/purs/docs/output/DocCommentsMerge/docs.json
--- a/tests/purs/docs/output/DocCommentsMerge/docs.json
+++ b/tests/purs/docs/output/DocCommentsMerge/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[4,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[4,15]},"title":"DataOnly"}],"comments":"decl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[4,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[4,1]},"title":"DataOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[8,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[8,19]},"title":"KindOnlyData"}],"comments":"kind\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[8,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[8,1]},"title":"KindOnlyData"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[13,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[13,18]},"title":"KindAndData"}],"comments":"kind\n\ndecl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[13,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[13,1]},"title":"KindAndData"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[15,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[15,23]},"title":"DataRoleOnly"}],"comments":"role\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[15,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[15,1]},"title":"DataRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[20,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[20,22]},"title":"DataAndRole"}],"comments":"decl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[20,39],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[20,1]},"title":"DataAndRole"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[26,51],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[26,29]},"title":"KindOnlyDataRoleOnly"}],"comments":"kind\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[26,51],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[26,1]},"title":"KindOnlyDataRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[33,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[33,24]},"title":"KindDataAndRole"}],"comments":"kind\n\ndecl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[33,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[33,1]},"title":"KindDataAndRole"},{"children":[],"comments":"decl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[40,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[40,1]},"title":"FFIOnly"},{"children":[],"comments":"role\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[42,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[42,1]},"title":"FFIRoleOnly"},{"children":[],"comments":"decl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[47,47],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[47,1]},"title":"FFIAndRole"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[54,38],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[54,21]},"title":"NewtypeOnly"}],"comments":"decl\n","info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[54,38],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[54,1]},"title":"NewtypeOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[58,46],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[58,25]},"title":"KindOnlyNewtype"}],"comments":"kind\n","info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[58,46],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[58,1]},"title":"KindOnlyNewtype"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[63,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[63,28]},"title":"KindAndNewtype"}],"comments":"kind\n\ndecl\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[63,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[63,1]},"title":"KindAndNewtype"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[65,50],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[65,29]},"title":"NewtypeRoleOnly"}],"comments":"role\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[65,50],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[65,1]},"title":"NewtypeRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[70,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[70,28]},"title":"NewtypeAndRole"}],"comments":"decl\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[70,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[70,1]},"title":"NewtypeAndRole"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[76,66],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[76,37]},"title":"KindOnlyNewtypeRoleOnly"}],"comments":"kind\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[76,66],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[76,1]},"title":"KindOnlyNewtypeRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[83,56],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[83,32]},"title":"KindNewtypeAndRole"}],"comments":"kind\n\ndecl\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[83,56],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[83,1]},"title":"KindNewtypeAndRole"},{"children":[],"comments":"decl\n","info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[90,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[90,1]},"title":"TypeOnly"},{"children":[],"comments":"kind\n","info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[94,28],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[94,1]},"title":"KindOnlyType"},{"children":[],"comments":"kind\n\ndecl\n","info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[99,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[99,1]},"title":"KindAndType"},{"children":[],"comments":"decl\n","info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[106,16],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[106,1]},"title":"ClassOnly"},{"children":[],"comments":"kind\n","info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[110,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[110,1]},"title":"KindOnlyClass"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[116,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[116,3]},"title":"fooKindAndClass"}],"comments":"kind\n\ndecl\n","info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[116,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[115,1]},"title":"KindAndClass"}],"name":"DocCommentsMerge","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[4,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[4,15]},"title":"DataOnly"}],"comments":"decl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[4,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[4,1]},"title":"DataOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[8,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[8,19]},"title":"KindOnlyData"}],"comments":"kind\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[8,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[8,1]},"title":"KindOnlyData"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[13,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[13,18]},"title":"KindAndData"}],"comments":"kind\n\ndecl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[13,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[13,1]},"title":"KindAndData"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[15,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[15,23]},"title":"DataRoleOnly"}],"comments":"role\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[15,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[15,1]},"title":"DataRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[20,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[20,22]},"title":"DataAndRole"}],"comments":"decl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[20,39],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[20,1]},"title":"DataAndRole"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[26,51],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[26,29]},"title":"KindOnlyDataRoleOnly"}],"comments":"kind\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[26,51],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[26,1]},"title":"KindOnlyDataRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[33,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[33,24]},"title":"KindDataAndRole"}],"comments":"kind\n\ndecl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[33,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[33,1]},"title":"KindDataAndRole"},{"children":[],"comments":"decl\n","info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[40,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[40,1]},"title":"FFIOnly"},{"children":[],"comments":"role\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[42,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[42,1]},"title":"FFIRoleOnly"},{"children":[],"comments":"decl\n\nrole\n","info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[47,47],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[47,1]},"title":"FFIAndRole"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[54,38],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[54,21]},"title":"NewtypeOnly"}],"comments":"decl\n","info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[54,38],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[54,1]},"title":"NewtypeOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[58,46],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[58,25]},"title":"KindOnlyNewtype"}],"comments":"kind\n","info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[58,46],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[58,1]},"title":"KindOnlyNewtype"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[63,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[63,28]},"title":"KindAndNewtype"}],"comments":"kind\n\ndecl\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[63,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[63,1]},"title":"KindAndNewtype"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[65,50],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[65,29]},"title":"NewtypeRoleOnly"}],"comments":"role\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[65,50],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[65,1]},"title":"NewtypeRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[70,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[70,28]},"title":"NewtypeAndRole"}],"comments":"decl\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[70,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[70,1]},"title":"NewtypeAndRole"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[76,66],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[76,37]},"title":"KindOnlyNewtypeRoleOnly"}],"comments":"kind\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[76,66],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[76,1]},"title":"KindOnlyNewtypeRoleOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[83,56],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[83,32]},"title":"KindNewtypeAndRole"}],"comments":"kind\n\ndecl\n\nrole\n","info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[83,56],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[83,1]},"title":"KindNewtypeAndRole"},{"children":[],"comments":"decl\n","info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[90,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[90,1]},"title":"TypeOnly"},{"children":[],"comments":"kind\n","info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[94,28],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[94,1]},"title":"KindOnlyType"},{"children":[],"comments":"kind\n\ndecl\n","info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[99,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[99,1]},"title":"KindAndType"},{"children":[],"comments":"decl\n","info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[106,16],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[106,1]},"title":"ClassOnly"},{"children":[],"comments":"kind\n","info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[110,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[110,1]},"title":"KindOnlyClass"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[116,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[116,3]},"title":"fooKindAndClass"}],"comments":"kind\n\ndecl\n","info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[116,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DocCommentsMerge.purs","start":[115,1]},"title":"KindAndClass"}],"name":"DocCommentsMerge","reExports":[]}
diff --git a/tests/purs/docs/output/DuplicateNames/docs.json b/tests/purs/docs/output/DuplicateNames/docs.json
--- a/tests/purs/docs/output/DuplicateNames/docs.json
+++ b/tests/purs/docs/output/DuplicateNames/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[8,12],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/DuplicateNames.purs","start":[8,1]},"title":"unit"}],"name":"DuplicateNames","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[8,12],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/DuplicateNames.purs","start":[8,1]},"title":"unit"}],"name":"DuplicateNames","reExports":[]}
diff --git a/tests/purs/docs/output/Example2/docs.json b/tests/purs/docs/output/Example2/docs.json
--- a/tests/purs/docs/output/Example2/docs.json
+++ b/tests/purs/docs/output/Example2/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Example2.purs","start":[3,1]},"title":"one"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Example2.purs","start":[6,1]},"title":"two"}],"name":"Example2","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Example2.purs","start":[3,1]},"title":"one"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Example2.purs","start":[6,1]},"title":"two"}],"name":"Example2","reExports":[]}
diff --git a/tests/purs/docs/output/ExplicitExport/docs.json b/tests/purs/docs/output/ExplicitExport/docs.json
--- a/tests/purs/docs/output/ExplicitExport/docs.json
+++ b/tests/purs/docs/output/ExplicitExport/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ExplicitExport.purs","start":[3,1]},"title":"one"}],"name":"ExplicitExport","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ExplicitExport.purs","start":[3,1]},"title":"one"}],"name":"ExplicitExport","reExports":[]}
diff --git a/tests/purs/docs/output/ExplicitTypeSignatures/docs.json b/tests/purs/docs/output/ExplicitTypeSignatures/docs.json
--- a/tests/purs/docs/output/ExplicitTypeSignatures/docs.json
+++ b/tests/purs/docs/output/ExplicitTypeSignatures/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["something",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"something","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"something","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[6,53],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[6,1]},"title":"explicit"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[12,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[12,1]},"title":"anInt"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Number"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[16,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[16,1]},"title":"aNumber"}],"name":"ExplicitTypeSignatures","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["something",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"something","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"something","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[6,53],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[6,1]},"title":"explicit"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[12,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[12,1]},"title":"anInt"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Number"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[16,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ExplicitTypeSignatures.purs","start":[16,1]},"title":"aNumber"}],"name":"ExplicitTypeSignatures","reExports":[]}
diff --git a/tests/purs/docs/output/ImportedTwiceB/docs.json b/tests/purs/docs/output/ImportedTwiceB/docs.json
--- a/tests/purs/docs/output/ImportedTwiceB/docs.json
+++ b/tests/purs/docs/output/ImportedTwiceB/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/ImportedTwiceB.purs","start":[3,1]},"title":"foo"}],"name":"ImportedTwiceB","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/ImportedTwiceB.purs","start":[3,1]},"title":"foo"}],"name":"ImportedTwiceB","reExports":[]}
diff --git a/tests/purs/docs/output/KindSignatureDocs/docs.json b/tests/purs/docs/output/KindSignatureDocs/docs.json
--- a/tests/purs/docs/output/KindSignatureDocs/docs.json
+++ b/tests/purs/docs/output/KindSignatureDocs/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[4,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[4,21]},"title":"DKindAndType"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[4,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[4,1]},"title":"DKindAndType"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[7,26],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[7,1]},"title":"TKindAndType"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[10,42],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[10,24]},"title":"NKindAndType"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[10,42],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[10,1]},"title":"NKindAndType"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[14,34],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[14,3]},"title":"fooKindAndType"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[14,34],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[13,1]},"title":"CKindAndType"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[19,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[19,18]},"title":"DKindOnly"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[19,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[19,1]},"title":"DKindOnly"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[22,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[22,1]},"title":"TKindOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[25,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[25,21]},"title":"NKindOnly"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[25,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[25,1]},"title":"NKindOnly"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[29,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[29,3]},"title":"fooKindOnly"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[29,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[28,1]},"title":"CKindOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[34,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[34,18]},"title":"DTypeOnly"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[34,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[34,1]},"title":"DTypeOnly"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[37,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[37,1]},"title":"TTypeOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[40,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[40,21]},"title":"NTypeOnly"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[40,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[40,1]},"title":"NTypeOnly"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[44,3]},"title":"fooTypeOnly"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[44,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[43,1]},"title":"CTypeOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[48,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[48,18]},"title":"DImplicit"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[48,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[48,1]},"title":"DImplicit"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[50,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[50,1]},"title":"TImplicit"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[52,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[52,21]},"title":"NImplicit"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[52,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[52,1]},"title":"NImplicit"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[55,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[55,3]},"title":"fooImplicit"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[55,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[54,1]},"title":"CImplicit"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[59,29],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[59,20]},"title":"DHidden"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":null,"sourceSpan":{"end":[59,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[59,1]},"title":"DHidden"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[61,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[61,1]},"title":"DNothing"},{"children":[],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DHidden"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[63,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[63,1]},"title":"THidden"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DHidden"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[65,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[65,23]},"title":"NHidden"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":null,"sourceSpan":{"end":[65,48],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[65,1]},"title":"NHidden"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[68,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[68,3]},"title":"fooHidden"}],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[68,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[67,1]},"title":"CHidden"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[70,15],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[70,1]},"title":"CNothing"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Nominal"],"typeArguments":[["t0",null],["t1",null]]},"kind":null,"sourceSpan":{"end":[74,55],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[74,1]},"title":"FFI_Hidden"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal"],"typeArguments":[["t0",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[75,56],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[75,1]},"title":"FFI_Shown"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[79,63],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[79,1]},"title":"FFI_RedundantParenthesis"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[82,59],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[82,33]},"title":"DataRedundantParenthesis"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[82,59],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[82,1]},"title":"DataRedundantParenthesis"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[85,34],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[85,1]},"title":"ClassRedundantParenthesis"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[88,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[88,25]},"title":"DataHeadParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[88,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[88,1]},"title":"DataHeadParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[91,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[91,25]},"title":"DataTailParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[91,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[91,1]},"title":"DataTailParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[94,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[94,26]},"title":"DataWholeParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[94,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[94,1]},"title":"DataWholeParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[97,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[97,21]},"title":"DataSelfParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[97,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[97,1]},"title":"DataSelfParens"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[100,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[100,1]},"title":"ClassSelfParens"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[102,57],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[102,37]},"title":"DataKindAnnotation"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}]]},"kind":null,"sourceSpan":{"end":[102,59],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[102,1]},"title":"DataKindAnnotation"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[104,79],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[104,49]},"title":"DataKindAnnotationWithParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",{"annotation":[],"contents":{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"},"tag":"ParensInType"}]]},"kind":null,"sourceSpan":{"end":[104,81],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[104,1]},"title":"DataKindAnnotationWithParens"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[107,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[107,24]},"title":"FunctionParens1"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[107,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[107,1]},"title":"FunctionParens1"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[110,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[110,24]},"title":"FunctionParens2"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[110,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[110,1]},"title":"FunctionParens2"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[113,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[113,24]},"title":"FunctionParens3"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[113,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[113,1]},"title":"FunctionParens3"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[116,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[116,19]},"title":"DShown"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["f",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[116,39],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[116,1]},"title":"DShown"},{"children":[],"comments":null,"info":{"arguments":[["f",null],["b",null],["c",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DShown"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"f","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[118,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[118,1]},"title":"TShown"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DShown"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"f","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[120,45],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[120,22]},"title":"NShown"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["f",null],["c",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[120,45],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[120,1]},"title":"NShown"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[123,40],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[123,3]},"title":"fooShown"}],"comments":null,"info":{"arguments":[["f",null],["a",null],["b",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[123,40],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[122,1]},"title":"CShown"}],"name":"KindSignatureDocs","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[4,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[4,21]},"title":"DKindAndType"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[4,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[4,1]},"title":"DKindAndType"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[7,26],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[7,1]},"title":"TKindAndType"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[10,42],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[10,24]},"title":"NKindAndType"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[10,42],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[10,1]},"title":"NKindAndType"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[14,34],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[14,3]},"title":"fooKindAndType"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[14,34],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[13,1]},"title":"CKindAndType"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[19,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[19,18]},"title":"DKindOnly"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[19,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[19,1]},"title":"DKindOnly"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[22,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[22,1]},"title":"TKindOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[25,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[25,21]},"title":"NKindOnly"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[25,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[25,1]},"title":"NKindOnly"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[29,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[29,3]},"title":"fooKindOnly"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[29,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[28,1]},"title":"CKindOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[34,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[34,18]},"title":"DTypeOnly"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[34,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[34,1]},"title":"DTypeOnly"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[37,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[37,1]},"title":"TTypeOnly"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[40,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[40,21]},"title":"NTypeOnly"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[40,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[40,1]},"title":"NTypeOnly"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[44,3]},"title":"fooTypeOnly"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[44,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[43,1]},"title":"CTypeOnly"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[48,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[48,18]},"title":"DImplicit"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[48,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[48,1]},"title":"DImplicit"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[50,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[50,1]},"title":"TImplicit"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[52,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[52,21]},"title":"NImplicit"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[52,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[52,1]},"title":"NImplicit"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[55,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[55,3]},"title":"fooImplicit"}],"comments":null,"info":{"arguments":[["a",null],["k",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[55,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[54,1]},"title":"CImplicit"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[59,29],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[59,20]},"title":"DHidden"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":null,"sourceSpan":{"end":[59,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[59,1]},"title":"DHidden"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[61,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[61,1]},"title":"DNothing"},{"children":[],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DHidden"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[63,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[63,1]},"title":"THidden"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DHidden"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[65,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[65,23]},"title":"NHidden"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":null,"sourceSpan":{"end":[65,48],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[65,1]},"title":"NHidden"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[68,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[68,3]},"title":"fooHidden"}],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[68,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[67,1]},"title":"CHidden"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[70,15],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[70,1]},"title":"CNothing"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Nominal"],"typeArguments":[["t0",null],["t1",null]]},"kind":null,"sourceSpan":{"end":[74,55],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[74,1]},"title":"FFI_Hidden"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal"],"typeArguments":[["t0",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[75,56],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[75,1]},"title":"FFI_Shown"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal"],"typeArguments":[["t0",null]]},"kind":null,"sourceSpan":{"end":[79,63],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[79,1]},"title":"FFI_RedundantParenthesis"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[82,59],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[82,33]},"title":"DataRedundantParenthesis"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[82,59],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[82,1]},"title":"DataRedundantParenthesis"},{"children":[],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[85,34],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[85,1]},"title":"ClassRedundantParenthesis"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[88,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[88,25]},"title":"DataHeadParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[88,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[88,1]},"title":"DataHeadParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[91,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[91,25]},"title":"DataTailParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[91,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[91,1]},"title":"DataTailParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[94,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[94,26]},"title":"DataWholeParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Phantom"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[94,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[94,1]},"title":"DataWholeParens"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[97,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[97,21]},"title":"DataSelfParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[97,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[97,1]},"title":"DataSelfParens"},{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[100,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[100,1]},"title":"ClassSelfParens"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[102,57],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[102,37]},"title":"DataKindAnnotation"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}]]},"kind":null,"sourceSpan":{"end":[102,59],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[102,1]},"title":"DataKindAnnotation"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[104,79],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[104,49]},"title":"DataKindAnnotationWithParens"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",{"annotation":[],"contents":{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"},"tag":"ParensInType"}]]},"kind":null,"sourceSpan":{"end":[104,81],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[104,1]},"title":"DataKindAnnotationWithParens"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[107,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[107,24]},"title":"FunctionParens1"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[107,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[107,1]},"title":"FunctionParens1"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[110,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[110,24]},"title":"FunctionParens2"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[110,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[110,1]},"title":"FunctionParens2"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[113,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[113,24]},"title":"FunctionParens3"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[113,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[113,1]},"title":"FunctionParens3"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[116,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[116,19]},"title":"DShown"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["b",null],["f",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[116,39],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[116,1]},"title":"DShown"},{"children":[],"comments":null,"info":{"arguments":[["f",null],["b",null],["c",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DShown"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"f","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":{"keyword":"type","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[118,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[118,1]},"title":"TShown"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["KindSignatureDocs"],"DShown"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"f","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[120,45],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[120,22]},"title":"NShown"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":["Representational","Representational","Representational"],"typeArguments":[["a",null],["f",null],["c",null]]},"kind":{"keyword":"newtype","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[120,45],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[120,1]},"title":"NShown"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[123,40],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[123,3]},"title":"fooShown"}],"comments":null,"info":{"arguments":[["f",null],["a",null],["b",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[123,40],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/KindSignatureDocs.purs","start":[122,1]},"title":"CShown"}],"name":"KindSignatureDocs","reExports":[]}
diff --git a/tests/purs/docs/output/MultiVirtual1/docs.json b/tests/purs/docs/output/MultiVirtual1/docs.json
--- a/tests/purs/docs/output/MultiVirtual1/docs.json
+++ b/tests/purs/docs/output/MultiVirtual1/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/MultiVirtual1.purs","start":[3,1]},"title":"foo"}],"name":"MultiVirtual1","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/MultiVirtual1.purs","start":[3,1]},"title":"foo"}],"name":"MultiVirtual1","reExports":[]}
diff --git a/tests/purs/docs/output/MultiVirtual2/docs.json b/tests/purs/docs/output/MultiVirtual2/docs.json
--- a/tests/purs/docs/output/MultiVirtual2/docs.json
+++ b/tests/purs/docs/output/MultiVirtual2/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[8,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/MultiVirtual2.purs","start":[8,1]},"title":"bar"}],"name":"MultiVirtual2","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[8,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/MultiVirtual2.purs","start":[8,1]},"title":"bar"}],"name":"MultiVirtual2","reExports":[]}
diff --git a/tests/purs/docs/output/MultiVirtual3/docs.json b/tests/purs/docs/output/MultiVirtual3/docs.json
--- a/tests/purs/docs/output/MultiVirtual3/docs.json
+++ b/tests/purs/docs/output/MultiVirtual3/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/MultiVirtual3.purs","start":[3,1]},"title":"baz"}],"name":"MultiVirtual3","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,11],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/MultiVirtual3.purs","start":[3,1]},"title":"baz"}],"name":"MultiVirtual3","reExports":[]}
diff --git a/tests/purs/docs/output/NewOperators2/docs.json b/tests/purs/docs/output/NewOperators2/docs.json
--- a/tests/purs/docs/output/NewOperators2/docs.json
+++ b/tests/purs/docs/output/NewOperators2/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"alias":[["NewOperators2"],{"Right":{"Left":{"Ident":"_compose"}}}],"declType":"alias","fixity":{"associativity":"infixl","precedence":8}},"kind":null,"sourceSpan":{"end":[3,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/NewOperators2.purs","start":[3,1]},"title":"(>>>)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,59],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/NewOperators2.purs","start":[5,1]},"title":"_compose"}],"name":"NewOperators2","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"alias":[["NewOperators2"],{"Right":{"Left":{"Ident":"_compose"}}}],"declType":"alias","fixity":{"associativity":"infixl","precedence":8}},"kind":null,"sourceSpan":{"end":[3,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/NewOperators2.purs","start":[3,1]},"title":"(>>>)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[5,59],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/NewOperators2.purs","start":[5,1]},"title":"_compose"}],"name":"NewOperators2","reExports":[]}
diff --git a/tests/purs/docs/output/OperatorSection/docs.json b/tests/purs/docs/output/OperatorSection/docs.json
--- a/tests/purs/docs/output/OperatorSection/docs.json
+++ b/tests/purs/docs/output/OperatorSection/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[3,18],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,13]},"title":"Nil"},{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[3,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,19]},"title":"Cons"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"Foldable"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[16,21],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[10,1]},"title":"<anonymous>"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[3,36],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,1]},"title":"List"},{"children":[],"comments":null,"info":{"alias":[["OperatorSection"],{"Right":{"Right":"Cons"}}],"declType":"alias","fixity":{"associativity":"infixr","precedence":6}},"kind":null,"sourceSpan":{"end":[5,19],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[5,1]},"title":"(:)"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[8,54],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[8,3]},"title":"foldl"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"Foldable"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[16,21],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[10,1]},"title":"<anonymous>"}],"comments":null,"info":{"arguments":[["f",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[8,54],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/OperatorSection.purs","start":[7,1]},"title":"Foldable"}],"name":"OperatorSection","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[3,18],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,13]},"title":"Nil"},{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},"tag":"ParensInType"}],"declType":"dataConstructor"},"sourceSpan":{"end":[3,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,19]},"title":"Cons"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"Foldable"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[16,21],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[10,1]},"title":"<anonymous>"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational"],"typeArguments":[["a",null]]},"kind":null,"sourceSpan":{"end":[3,36],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[3,1]},"title":"List"},{"children":[],"comments":null,"info":{"alias":[["OperatorSection"],{"Right":{"Right":"Cons"}}],"declType":"alias","fixity":{"associativity":"infixr","precedence":6}},"kind":null,"sourceSpan":{"end":[5,19],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[5,1]},"title":"(:)"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":"f","tag":"TypeVar"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[8,54],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[8,3]},"title":"foldl"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["OperatorSection"],"Foldable"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["OperatorSection"],"List"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[16,21],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[10,1]},"title":"<anonymous>"}],"comments":null,"info":{"arguments":[["f",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[8,54],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/OperatorSection.purs","start":[7,1]},"title":"Foldable"}],"name":"OperatorSection","reExports":[]}
diff --git a/tests/purs/docs/output/PrimSubmodules/docs.json b/tests/purs/docs/output/PrimSubmodules/docs.json
--- a/tests/purs/docs/output/PrimSubmodules/docs.json
+++ b/tests/purs/docs/output/PrimSubmodules/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[5,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[5,28]},"title":"Lol"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",{"annotation":[],"contents":[["Prim","Ordering"],"Ordering"],"tag":"TypeConstructor"}]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"Ordering"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[5,37],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[5,1]},"title":"Lol"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["PrimSubmodules"],"Lol"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"LT"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[7,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[7,1]},"title":"x"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["PrimSubmodules"],"Lol"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"EQ"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[10,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[10,1]},"title":"y"}],"name":"PrimSubmodules","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[5,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[5,28]},"title":"Lol"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom"],"typeArguments":[["a",{"annotation":[],"contents":[["Prim","Ordering"],"Ordering"],"tag":"TypeConstructor"}]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"Ordering"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[5,37],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[5,1]},"title":"Lol"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["PrimSubmodules"],"Lol"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"LT"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[7,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[7,1]},"title":"x"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["PrimSubmodules"],"Lol"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim","Ordering"],"EQ"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[10,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/PrimSubmodules.purs","start":[10,1]},"title":"y"}],"name":"PrimSubmodules","reExports":[]}
diff --git a/tests/purs/docs/output/RoleAnnotationDocs/docs.json b/tests/purs/docs/output/RoleAnnotationDocs/docs.json
--- a/tests/purs/docs/output/RoleAnnotationDocs/docs.json
+++ b/tests/purs/docs/output/RoleAnnotationDocs/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[3,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[3,18]},"title":"D_RNP"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[3,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[3,1]},"title":"D_RNP"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[6,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[6,18]},"title":"D_NPR"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Phantom","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[6,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[6,1]},"title":"D_NPR"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[9,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[9,18]},"title":"D_PRN"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Representational","Nominal"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[9,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[9,1]},"title":"D_PRN"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Nominal","Nominal"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[12,60],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[12,1]},"title":"FFI_NNN"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[14,60],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[14,1]},"title":"FFI_RNP"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[17,74],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[17,1]},"title":"FFI_Higher1"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[20,74],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[20,1]},"title":"FFI_Higher2"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,74],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[23,1]},"title":"FFI_Higher3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[26,84],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[26,1]},"title":"FFI_Higher4"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[29,69],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[29,1]},"title":"FFI_HeadParens"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[32,69],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[32,1]},"title":"FFI_TailParens"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[35,70],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[35,1]},"title":"FFI_WholeParens"}],"name":"RoleAnnotationDocs","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[3,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[3,18]},"title":"D_RNP"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[3,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[3,1]},"title":"D_RNP"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[6,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[6,18]},"title":"D_NPR"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Phantom","Representational"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[6,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[6,1]},"title":"D_NPR"},{"children":[{"comments":null,"info":{"arguments":[],"declType":"dataConstructor"},"sourceSpan":{"end":[9,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[9,18]},"title":"D_PRN"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Phantom","Representational","Nominal"],"typeArguments":[["a",null],["b",null],["c",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[9,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[9,1]},"title":"D_PRN"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Nominal","Nominal","Nominal"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[12,60],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[12,1]},"title":"FFI_NNN"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[14,60],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[14,1]},"title":"FFI_RNP"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[17,74],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[17,1]},"title":"FFI_Higher1"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[20,74],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[20,1]},"title":"FFI_Higher2"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[23,74],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[23,1]},"title":"FFI_Higher3"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":{"keyword":"data","kind":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},"tag":"ParensInType"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[26,84],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[26,1]},"title":"FFI_Higher4"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[29,69],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[29,1]},"title":"FFI_HeadParens"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[32,69],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[32,1]},"title":"FFI_TailParens"},{"children":[],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Nominal","Phantom"],"typeArguments":[["t0",null],["t1",null],["t2",null]]},"kind":null,"sourceSpan":{"end":[35,70],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/RoleAnnotationDocs.purs","start":[35,1]},"title":"FFI_WholeParens"}],"name":"RoleAnnotationDocs","reExports":[]}
diff --git a/tests/purs/docs/output/SomeTypeClass/docs.json b/tests/purs/docs/output/SomeTypeClass/docs.json
--- a/tests/purs/docs/output/SomeTypeClass/docs.json
+++ b/tests/purs/docs/output/SomeTypeClass/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[5,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/SomeTypeClass.purs","start":[5,3]},"title":"member"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[5,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/SomeTypeClass.purs","start":[4,1]},"title":"SomeClass"}],"name":"SomeTypeClass","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[5,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/SomeTypeClass.purs","start":[5,3]},"title":"member"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[5,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/SomeTypeClass.purs","start":[4,1]},"title":"SomeClass"}],"name":"SomeTypeClass","reExports":[]}
diff --git a/tests/purs/docs/output/Transitive3/docs.json b/tests/purs/docs/output/Transitive3/docs.json
--- a/tests/purs/docs/output/Transitive3/docs.json
+++ b/tests/purs/docs/output/Transitive3/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,19],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/Transitive3.purs","start":[3,1]},"title":"transitive3"}],"name":"Transitive3","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,19],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/Transitive3.purs","start":[3,1]},"title":"transitive3"}],"name":"Transitive3","reExports":[]}
diff --git a/tests/purs/docs/output/TypeClassWithFunDeps/docs.json b/tests/purs/docs/output/TypeClassWithFunDeps/docs.json
--- a/tests/purs/docs/output/TypeClassWithFunDeps/docs.json
+++ b/tests/purs/docs/output/TypeClassWithFunDeps/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[5,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","start":[5,3]},"title":"aMember"}],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"declType":"typeClass","fundeps":[[["a","b"],["c"]],[["c"],["d","e"]]],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[5,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","start":[4,1]},"title":"TypeClassWithFunDeps"}],"name":"TypeClassWithFunDeps","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"sourceSpan":{"end":[5,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","start":[5,3]},"title":"aMember"}],"comments":null,"info":{"arguments":[["a",null],["b",null],["c",null],["d",null],["e",null]],"declType":"typeClass","fundeps":[[["a","b"],["c"]],[["c"],["d","e"]]],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k1",{"annotation":[],"contents":["k2",{"annotation":[],"contents":["k3",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Type"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k1","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k2","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k3","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"sourceSpan":{"end":[5,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeClassWithFunDeps.purs","start":[4,1]},"title":"TypeClassWithFunDeps"}],"name":"TypeClassWithFunDeps","reExports":[]}
diff --git a/tests/purs/docs/output/TypeLevelString/docs.json b/tests/purs/docs/output/TypeLevelString/docs.json
--- a/tests/purs/docs/output/TypeLevelString/docs.json
+++ b/tests/purs/docs/output/TypeLevelString/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim","TypeError"],"Text"],"tag":"TypeConstructor"},{"annotation":[],"contents":"oops","tag":"TypeLevelString"}],"tag":"TypeApp"}],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeLevelString"],"Bar"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeLevelString"],"Foo"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,49],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[9,1]},"title":"fooBar"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[5,9],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[5,1]},"title":"Foo"},{"children":[{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim","TypeError"],"Text"],"tag":"TypeConstructor"},{"annotation":[],"contents":"oops","tag":"TypeLevelString"}],"tag":"TypeApp"}],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeLevelString"],"Bar"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeLevelString"],"Foo"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,49],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[9,1]},"title":"fooBar"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[7,12],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[7,1]},"title":"Bar"}],"name":"TypeLevelString","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim","TypeError"],"Text"],"tag":"TypeConstructor"},{"annotation":[],"contents":"oops","tag":"TypeLevelString"}],"tag":"TypeApp"}],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeLevelString"],"Bar"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeLevelString"],"Foo"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,49],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[9,1]},"title":"fooBar"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[5,9],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[5,1]},"title":"Foo"},{"children":[{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim","TypeError"],"Text"],"tag":"TypeConstructor"},{"annotation":[],"contents":"oops","tag":"TypeLevelString"}],"tag":"TypeApp"}],"constraintClass":[["Prim","TypeError"],"Fail"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeLevelString"],"Bar"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeLevelString"],"Foo"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,49],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[9,1]},"title":"fooBar"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":{"keyword":"class","kind":{"annotation":[],"contents":["k",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"k","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Constraint"],"tag":"TypeConstructor"}],"tag":"TypeApp"},null],"tag":"ForAll"}},"sourceSpan":{"end":[7,12],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeLevelString.purs","start":[7,1]},"title":"Bar"}],"name":"TypeLevelString","reExports":[]}
diff --git a/tests/purs/docs/output/TypeOpAliases/docs.json b/tests/purs/docs/output/TypeOpAliases/docs.json
--- a/tests/purs/docs/output/TypeOpAliases/docs.json
+++ b/tests/purs/docs/output/TypeOpAliases/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[3,24],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[3,1]},"title":"AltFn"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"AltFn"}],"declType":"alias","fixity":{"associativity":"infixr","precedence":6}},"kind":null,"sourceSpan":{"end":[5,26],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[5,1]},"title":"type (~>)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[7,43],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[7,1]},"title":"test1"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[8,50],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[8,1]},"title":"test2"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":["d",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"d","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[9,59],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[9,1]},"title":"test3"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":["d",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"d","tag":"TypeVar"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[10,61],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[10,1]},"title":"test4"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[12,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[12,16]},"title":"Tuple"},{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["TypeOpAliases"],"Show"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[28,24],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[27,1]},"title":"showTuple"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[12,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[12,1]},"title":"Tuple"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Right":{"Right":"Tuple"}}],"declType":"alias","fixity":{"associativity":"infixl","precedence":6}},"kind":null,"sourceSpan":{"end":[14,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[14,1]},"title":"(×)"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"Tuple"}],"declType":"alias","fixity":{"associativity":"infixl","precedence":6}},"kind":null,"sourceSpan":{"end":[15,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[15,1]},"title":"type (×)"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[17,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,17]},"title":"Left"},{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[17,33],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,26]},"title":"Right"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[17,35],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,1]},"title":"Either"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"Either"}],"declType":"alias","fixity":{"associativity":"infixl","precedence":5}},"kind":null,"sourceSpan":{"end":[19,26],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[19,1]},"title":"type (⊕)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"×"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"×"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[21,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[21,1]},"title":"third"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[25,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[25,3]},"title":"show"},{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["TypeOpAliases"],"Show"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[28,24],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[27,1]},"title":"showTuple"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[25,22],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[24,1]},"title":"Show"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[33,13],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[33,3]},"title":"testL"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[33,13],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[32,1]},"title":"TestL"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[36,13],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[36,3]},"title":"testR"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[36,13],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[35,1]},"title":"TestR"}],"name":"TypeOpAliases","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[["a",null],["b",null]],"declType":"typeSynonym","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[3,24],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[3,1]},"title":"AltFn"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"AltFn"}],"declType":"alias","fixity":{"associativity":"infixr","precedence":6}},"kind":null,"sourceSpan":{"end":[5,26],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[5,1]},"title":"type (~>)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[7,43],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[7,1]},"title":"test1"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[8,50],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[8,1]},"title":"test2"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":["d",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"d","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[9,59],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[9,1]},"title":"test3"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":["d",{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"~>"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"},"tag":"ParensInType"},{"annotation":[],"contents":"d","tag":"TypeVar"}],"tag":"BinaryNoParensType"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[10,61],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[10,1]},"title":"test4"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[12,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[12,16]},"title":"Tuple"},{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["TypeOpAliases"],"Show"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[28,24],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[27,1]},"title":"showTuple"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[12,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[12,1]},"title":"Tuple"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Right":{"Right":"Tuple"}}],"declType":"alias","fixity":{"associativity":"infixl","precedence":6}},"kind":null,"sourceSpan":{"end":[14,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[14,1]},"title":"(×)"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"Tuple"}],"declType":"alias","fixity":{"associativity":"infixl","precedence":6}},"kind":null,"sourceSpan":{"end":[15,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[15,1]},"title":"type (×)"},{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[17,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,17]},"title":"Left"},{"comments":null,"info":{"arguments":[{"annotation":[],"contents":"b","tag":"TypeVar"}],"declType":"dataConstructor"},"sourceSpan":{"end":[17,33],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,26]},"title":"Right"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"dataDeclType":"data","declType":"data","roles":["Representational","Representational"],"typeArguments":[["a",null],["b",null]]},"kind":null,"sourceSpan":{"end":[17,35],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[17,1]},"title":"Either"},{"children":[],"comments":null,"info":{"alias":[["TypeOpAliases"],{"Left":"Either"}],"declType":"alias","fixity":{"associativity":"infixl","precedence":5}},"kind":null,"sourceSpan":{"end":[19,26],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[19,1]},"title":"type (⊕)"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":["a",{"annotation":[],"contents":["b",{"annotation":[],"contents":["c",{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"×"],"tag":"TypeOp"},{"annotation":[],"contents":"a","tag":"TypeVar"},{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"×"],"tag":"TypeOp"},{"annotation":[],"contents":"b","tag":"TypeVar"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"BinaryNoParensType"}],"tag":"BinaryNoParensType"}],"tag":"TypeApp"},{"annotation":[],"contents":"c","tag":"TypeVar"}],"tag":"TypeApp"},null],"tag":"ForAll"},null],"tag":"ForAll"},null],"tag":"ForAll"}},"kind":null,"sourceSpan":{"end":[21,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[21,1]},"title":"third"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Prim"],"Function"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"sourceSpan":{"end":[25,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[25,3]},"title":"show"},{"comments":null,"info":{"declType":"instance","dependencies":[{"constraintAnn":[],"constraintArgs":[{"annotation":[],"contents":"a","tag":"TypeVar"}],"constraintClass":[["TypeOpAliases"],"Show"],"constraintData":null,"constraintKindArgs":[]}],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Show"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":"a","tag":"TypeVar"}],"tag":"TypeApp"},{"annotation":[],"contents":"b","tag":"TypeVar"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[28,24],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[27,1]},"title":"showTuple"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[25,22],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[24,1]},"title":"Show"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[33,13],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[33,3]},"title":"testL"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestL"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[40,27],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[39,1]},"title":"testLEither"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[33,13],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[32,1]},"title":"TestL"},{"children":[{"comments":null,"info":{"declType":"typeClassMember","type":{"annotation":[],"contents":"a","tag":"TypeVar"}},"sourceSpan":{"end":[36,13],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[36,3]},"title":"testR"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"TestR"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Either"],"tag":"TypeConstructor"},{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["TypeOpAliases"],"Tuple"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"},{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"tag":"TypeApp"}],"tag":"TypeApp"}},"sourceSpan":{"end":[44,23],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[43,1]},"title":"testREither"}],"comments":null,"info":{"arguments":[["a",null]],"declType":"typeClass","fundeps":[],"superclasses":[]},"kind":null,"sourceSpan":{"end":[36,13],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeOpAliases.purs","start":[35,1]},"title":"TestR"}],"name":"TypeOpAliases","reExports":[]}
diff --git a/tests/purs/docs/output/TypeSynonym/docs.json b/tests/purs/docs/output/TypeSynonym/docs.json
--- a/tests/purs/docs/output/TypeSynonym/docs.json
+++ b/tests/purs/docs/output/TypeSynonym/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,17],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeSynonym.purs","start":[3,1]},"title":"MyInt"}],"name":"TypeSynonym","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":null,"info":{"arguments":[],"declType":"typeSynonym","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[3,17],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeSynonym.purs","start":[3,1]},"title":"MyInt"}],"name":"TypeSynonym","reExports":[]}
diff --git a/tests/purs/docs/output/TypeSynonymInstance/docs.json b/tests/purs/docs/output/TypeSynonymInstance/docs.json
--- a/tests/purs/docs/output/TypeSynonymInstance/docs.json
+++ b/tests/purs/docs/output/TypeSynonymInstance/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["TypeSynonym"],"MyInt"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[7,26],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[7,14]},"title":"MyNT"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Data","Newtype"],"Newtype"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeSynonymInstance"],"MyNT"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":null,"tag":"TypeWildcard"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,41],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[9,1]},"title":"ntMyNT"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[7,26],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[7,1]},"title":"MyNT"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[11,8],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[11,1]},"title":"foo"}],"name":"TypeSynonymInstance","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["TypeSynonym"],"MyInt"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[7,26],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[7,14]},"title":"MyNT"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Data","Newtype"],"Newtype"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["TypeSynonymInstance"],"MyNT"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":null,"tag":"TypeWildcard"}],"tag":"TypeApp"}},"sourceSpan":{"end":[9,41],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[9,1]},"title":"ntMyNT"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[7,26],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[7,1]},"title":"MyNT"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Prim"],"Int"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[11,8],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/TypeSynonymInstance.purs","start":[11,1]},"title":"foo"}],"name":"TypeSynonymInstance","reExports":[]}
diff --git a/tests/purs/docs/output/UTF8/docs.json b/tests/purs/docs/output/UTF8/docs.json
--- a/tests/purs/docs/output/UTF8/docs.json
+++ b/tests/purs/docs/output/UTF8/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[],"comments":"üÜäÄ 😰\n","info":{"declType":"value","type":{"annotation":[],"contents":[["Prelude"],"Unit"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,14],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/docs/src/UTF8.purs","start":[6,1]},"title":"thing"}],"name":"UTF8","reExports":[]}
+{"comments":null,"declarations":[{"children":[],"comments":"üÜäÄ 😰\n","info":{"declType":"value","type":{"annotation":[],"contents":[["Prelude"],"Unit"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[6,14],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/docs/src/UTF8.purs","start":[6,1]},"title":"thing"}],"name":"UTF8","reExports":[]}
diff --git a/tests/purs/docs/output/cache-db.json b/tests/purs/docs/output/cache-db.json
--- a/tests/purs/docs/output/cache-db.json
+++ b/tests/purs/docs/output/cache-db.json
@@ -1,1 +1,1 @@
-{"Ado":{"src/Ado.purs":["2022-04-04T14:32:49.37443093Z","bd980ae20d61e0e34d23507b1d25598f27407a78cf70084327506f21cc02d85df1bd1b6937459665a8dd9df5bb43ec5947b6e94c16c852aba233747e05a9d58f"]},"ChildDeclOrder":{"src/ChildDeclOrder.purs":["2022-04-04T14:32:49.37443093Z","41a7be97fffe1bbbf925ccb56b68246abb8684b23529fc25e07827b57b32b60ccd82d5c9a2279dc23be1f8803cff8267fa296509b873ec337ffa15ee0e32e2c9"]},"Clash":{"src/Clash.purs":["2022-04-04T14:32:49.37443093Z","7b70d019ea46b72149e185d82bc1345113e8a3977a886aa31ac8a268c6c63c7b93553e1586c45e023e49e485d3f6523a4a11efc8dc70dd8bac5d8b9cac4e4c2d"]},"Clash1":{"src/Clash1.purs":["2022-04-04T14:32:49.37443093Z","bd09c1fd0308ce61d83bef03d3b2366601df559ef8cc9c09f17d963a1bfb2b2e373dcbf5729a3e465c635fbf0035ae09ea3ba58b7844b56586dc3baf9d857bb5"]},"Clash1a":{"src/Clash1a.purs":["2022-04-04T14:32:49.37443093Z","b5c374c74a46d3f633c948de256e299dc2713857ce09441b5ae2f03afdd0468610088f39854f69848c1c9aecf3441b1b39e0919e499280a19d69b83de07d5d0b"]},"Clash2":{"src/Clash2.purs":["2022-04-04T14:32:49.37443093Z","10c61c6600084fdcc0ee93608a354fd7efa7edab67ac8cce131e522b597080b2927dc7bb1a6c98765dfc9a30583dc5bea2514d2932554ab1657c664a81a0a81b"]},"Clash2a":{"src/Clash2a.purs":["2022-04-04T14:32:49.37443093Z","b002aac5be65ac1cb55d10518840293780ea6d4a42b045172544ab3478ea83252f0672f0e1d4ad1599db3955f55202738ba1ee254b8ad94e914fc43fc1f6750f"]},"ConstrainedArgument":{"src/ConstrainedArgument.purs":["2022-04-04T14:32:49.37443093Z","6caa6cc505c6574957afe8e703f6e9869211e9c0a0676ba36a79d2a8b7e3c2c1570aae714cd6acc37e5b206745941460c1cf370a3bbd783c79b89351681ec890"]},"Data.Newtype":{"bower_components/purescript-newtype/src/Data/Newtype.purs":["2021-11-04T16:46:24.652281269Z","408eb6f95efb52faff05d73c757d21cebdd3b58dce3f5b8cfb5f0772224ca7e6ff9b5df0ab9ea40ce0f8448664fe56028af844b2c5dc32e5712b7d9d1541f2b7"]},"DeclOrder":{"src/DeclOrder.purs":["2022-04-04T14:32:49.37443093Z","a8c6ab9c335037c255ae6e0124a107f2e2462c2eebc2ff3637273ba436f2f3589ae203919ff5c8c61106b0542114ba3eba66426d8b5e316089bc1f4efb72643a"]},"DeclOrderNoExportList":{"src/DeclOrderNoExportList.purs":["2022-04-04T14:32:49.37443093Z","379def50dfd7a01dd2b057c707ea8ee53147d41c7dc28083c3827ccc213816840fd26d784a78bd1eabd105231e5479c7bfeebfcb03d1e2f3e8174ab173d740c4"]},"Desugar":{"src/Desugar.purs":["2022-04-04T14:32:49.37443093Z","50ceefe5cbac286908cc7070f4e94f57c62b5c91245d5a8c66d7f4565e3d037e4cf11524c4c790664588a0a5c4216390b5138be9ec93e14d0f82a2c59c8f561a"]},"DocComments":{"src/DocComments.purs":["2022-04-04T14:32:49.37443093Z","220498626601722feb58dd23dd80ac970f6ba7df8e8c2ad604ed833933f6b36219fb5f1d0b9963ffc7e9314043760055ab547fac5784a28416a4851f257a635b"]},"DocCommentsClassMethod":{"src/DocCommentsClassMethod.purs":["2022-04-04T14:32:49.37443093Z","f55a03f2b2624a9ca01adc8372bad4b7e46e8ef1a52ec41c5992767146c9a2354320a3a38587cbf2e78fec118430f193fdcb1cdd9600cd9f755dbbc2e36e46b7"]},"DocCommentsDataConstructor":{"src/DocCommentsDataConstructor.purs":["2022-04-04T14:32:49.37443093Z","68d644ce63642bd55d8338e78e0070c409d3c970a2967338cf612d7a3217813fd98a08e1905776572819cadbc08cdd4bec4a7c1473974a9f3f5d5b1149d33257"]},"DocCommentsMerge":{"src/DocCommentsMerge.purs":["2022-04-04T14:32:49.37443093Z","08e74333f59b1991e5c044debca1b8d2be7193898cc501c6c422b2f3e4c6e6aba8562cfa7b38dac2363e567357722e79d0fcc4757ee91ed067e7179a3615bdbd"]},"DuplicateNames":{"src/DuplicateNames.purs":["2022-04-04T14:32:49.37443093Z","5652f5da0ae79185fb27bce13793bd7752779364e0d1c7c56be2d213853c26ad0abff8536a0d34090a079980e498c837026521efe4a8cfc1b1a16ec70c724eed"]},"Example":{"src/Example.purs":["2022-04-04T14:32:49.37443093Z","3b700a99cc5ee257009553d27a2d25f71f68f006e9deec2b3578f01c7fe4e77de1e929dc110dfcd51d68685ad3ab6b09b0147fe63719861e8a9e480a64e286d9"]},"Example2":{"src/Example2.purs":["2022-04-04T14:32:49.37443093Z","6a479db4e40f66b1e29889516a55cfb22b15b2b8c4531b9cf20307a965af3dc0a6dab4eccc31cca4eacaaa158a01c58ff995ac6f01b2e1ed5571c44fa3bf2536"]},"ExplicitExport":{"src/ExplicitExport.purs":["2022-04-04T14:32:49.37443093Z","fe733409eb325c971f84b6414a1fc9e08793d2271eebcd670ceefd5c5aef837ee76ec5cb5bed96d87ea791a7521c76668a71be5cd8fb14209414893dc20d3d47"]},"ExplicitTypeSignatures":{"src/ExplicitTypeSignatures.purs":["2022-04-04T14:32:49.37443093Z","78a70441c9966f04c6c32a74cbba299f0f8ea870c664e738eb0d8f8cc5929edb7bb697170fc306c9ee69fa4e2f0112af15c8bdb29d63645cdf6f2916a122a0bd"]},"ImportedTwice":{"src/ImportedTwice.purs":["2022-04-04T14:32:49.37443093Z","be9a0cb1e75c689c3af6817a5750862915e70a0017476cce4c539a3c7ce5b33554aa14d2668bd131b89bb28d65b5ddaa79abfb2a538d606f1b11b5ef0ec79067"]},"ImportedTwiceA":{"src/ImportedTwiceA.purs":["2022-04-04T14:32:49.37443093Z","883c8abaefe0dbacbcdea4c53eab41da26687680274419720b1e5d6510bf5127b7ba06df23515ad34f7ffc4626f0064d7867e2b4a5f255a6b573d219926364de"]},"ImportedTwiceB":{"src/ImportedTwiceB.purs":["2022-04-04T14:32:49.37443093Z","48cc2ac8ce40b1d0e3782fcb8ec798cf9c4838a595148055f1bb830d9b07d58780170ad3f8a90f43ac561aff2c52a5d8793480526a4768ebf1c8af1ff1b68751"]},"KindSignatureDocs":{"src/KindSignatureDocs.purs":["2022-04-04T14:32:49.37443093Z","c2a224affb04b4c5db4712d15bfa830999c634c135bf1595f4930dd682258f5a278477ffeba297c42af5d74878e73694180a932ee2ebf7ad8a2ff66c4df2135d"]},"MultiVirtual":{"src/MultiVirtual.purs":["2022-04-04T14:32:49.37443093Z","31bc7e2c2ebee39dbc89536db51493a2cb1843a9e1aed8b288ef16660877fd1abd5f4224d3325a415aabcf79bd5fe76ebb9257738b0193a50c79a20d48b5ab29"]},"MultiVirtual1":{"src/MultiVirtual1.purs":["2022-04-04T14:32:49.37443093Z","23f7975f7494bb84f9fc6fde9071ce04e86df774d81e2b027a85ab46c8237f9921ee926f4a4ad3e03c7799e485ce39e542d1dd94953c50c0d58ea0003cfc3842"]},"MultiVirtual2":{"src/MultiVirtual2.purs":["2022-04-04T14:32:49.37443093Z","f424ed7c0db709b6bb1e57f87069f484fd0db9dddd0475cd15d36bd58743e98729c42efd2df6ee8fbd18609c36c2247cf3428a5a7f1f5ed11e233a2b134990ba"]},"MultiVirtual3":{"src/MultiVirtual3.purs":["2022-04-04T14:32:49.37443093Z","a42415e3b8309bfa81ef127c61dba6f4001188dcee160a8e2f73399179a11262f12daf0205d6bec38fc605b637550f16b62e84a0f2a0f6999355d56ff2540405"]},"NewOperators":{"src/NewOperators.purs":["2022-04-04T14:32:49.37443093Z","f74cae05c73db1f629e199692c517866fb1683caab3c4509657a371733f30319f0c505ed57208757b3e43795aab5191000c834a501d9bd2bf0e58875873c5c40"]},"NewOperators2":{"src/NewOperators2.purs":["2022-04-04T14:32:49.37443093Z","c551a91aa792fb9ee4b5758c010761a53d4a14b8fbaa6b76b6bd9a318a28f245c9b090bdc4f77b904c873d9b71d59fbad3ccd9ad7c8773f5c1e57a22a0204844"]},"NotAllCtors":{"src/NotAllCtors.purs":["2022-04-04T14:32:49.37443093Z","6e0af26cf897b5dd6e8dd4d75988e5607118f6fdd5219aa192f477cc4d760d504bdec930d46af82a44950e3de4fe6c37664a4560a523a45097503b85c161bd96"]},"OperatorSection":{"src/OperatorSection.purs":["2022-05-27T04:56:24.251223972Z","64a9d1bdc2b7df3fe4124651fee37440b9c53b61d25fba7e9a1974c713c12679f227fdc700a6d97218c3628dce4ea9c8c3c5b4e30b5b8f8ecf6a5f6781599c7b"]},"Prelude":{"bower_components/purescript-prelude/src/Prelude.purs":["2021-10-25T20:49:21.236373121Z","7eb0b2f9b7aec29693f79be4642ccea792b1f54c7022a4f1395fb8f3a9b1ad6cbfb2e7685940b89ab21890c02949ec90d4823bd5c36a6b566ca9cb8ec561958f"]},"PrimSubmodules":{"src/PrimSubmodules.purs":["2022-05-27T04:56:24.251223972Z","6b03520e209171032fd18661077ef49b0547b488667b8316e8ec6104a49914fe58929d1dea64fde39ed5a88d814304d0db1d5cd56a3a4b2b5a625585666e42c6"]},"ReExportedTypeClass":{"src/ReExportedTypeClass.purs":["2022-04-04T14:32:49.378431019Z","1cc581d68e1ce113162ab851872e73645807f0deb1d2b970ebc04b314184fe30c3431212ffcf9eec09a56a2291e0050750ac6905f1884bc74d406d0323c4f804"]},"RoleAnnotationDocs":{"src/RoleAnnotationDocs.purs":["2022-04-04T14:32:49.378431019Z","87b1012eaa7e6312ca43aa23efa0ec76eefd72d9e306233a35d4ab9dd3d74ad2051ab11555a5d1136ea2c1800bbfadfa0b52bad30a5a4b9ef3a9aa6498474506"]},"Shebang1Undocumented":{"src/Shebang1Undocumented.purs":["2022-06-08T12:25:40.293728057Z","55cff97ade15395974b1d714467dd824c260851b08a4aa365abf1980e5e746b378379d6b62ac4f1174f20c56600df82b05ca17f21643d529d8f21cb54069d5dc"]},"Shebang2Undocumented":{"src/Shebang2Undocumented.purs":["2022-06-08T12:25:40.293728057Z","d64e34906077c41cc542cbd50a604fb5c311526805a8f62be192cd05c1f6c68b03b728cb9cb90ff005d99f6e60a2384b584800fc23cd0064104d077aa3e22108"]},"Shebang3Undocumented":{"src/Shebang3Undocumented.purs":["2022-06-08T12:25:40.293728057Z","b3f811c431e42fef7eb9682fd1312e49d60b0394df825dcc34c083b191ca0361250ad503d9e4bcb5e7da6c715dab6ad51e47f936a595a0e77b771d5b547a1e3d"]},"Shebang4Undocumented":{"src/Shebang4Undocumented.purs":["2022-06-08T12:25:40.293728057Z","96139bf4debfdfa7f7b250aec10644f819a017f87127acd0cac613da51402f88664f7aea99767cfdfc6658efbe7eba5fba57b127ea5a8d15ba70057f7b6ee0a6"]},"SolitaryTypeClassMember":{"src/SolitaryTypeClassMember.purs":["2022-04-04T14:32:49.378431019Z","f627c589b0a8f58d7bfdf28ecf87891a74e64e8399ce0ab645b7c58049fddc1ea3cbb3c34b862bec8576108d5258d9548ecfbbab98598671cc645a3f358ac852"]},"SomeTypeClass":{"src/SomeTypeClass.purs":["2022-04-04T14:32:49.378431019Z","d09fc77e6c6350e7e4941e2911e012271a49db4a75c57cf738d5865ca622d60b69337f969aa02b13fc869484cba00479212e4b8dbcb458c5723e7a5d73888368"]},"Transitive1":{"src/Transitive1.purs":["2022-04-04T14:32:49.378431019Z","42681f3d0fa143d36474d1cb2f464820bdb907bbc432cd91349f6acdd82657ecb4d9ad1d075c96c551bed37dada4615dd3ff64f912f2cc8a6d99b5e02ee51979"]},"Transitive2":{"src/Transitive2.purs":["2022-04-04T14:32:49.378431019Z","110a1bae420e0f0c05e9846fad483a1d035dfc3ba82c2cd81e44f548fd97965055b1a687ab86256f8cb6a3d79b4c4abe6f45d4728bbc04a7a1b0fedbca115b1e"]},"Transitive3":{"src/Transitive3.purs":["2022-04-04T14:32:49.378431019Z","65f7bb366ac8fab63084ff0229c9d55293db8126b539ff2cb53e511505995f426d50f4cca7d1f61fc53aaaaeed9d72791f9d9f12cc569d92e7bbe1d1908b093c"]},"TypeClassWithFunDeps":{"src/TypeClassWithFunDeps.purs":["2022-04-04T14:32:49.378431019Z","c828f194c8c679d97425ed7e04eb3c9bb04bc4c32542d7d6d7e4a36c6c734eb8ba1ef472ad2b0085d9a042a0724648b85a4605d8fe4995e1a32839b1fb1f0f23"]},"TypeClassWithoutMembers":{"src/TypeClassWithoutMembers.purs":["2022-04-04T14:32:49.378431019Z","3eac42652ce295ee47c340c4b86c91d0f6a8ad1f81824475fa4fc4ae8fd8bb77ceee6a46e31bebe9d2e8a980a7923432b41b0eff5cbf75580ee149e7d997e098"]},"TypeClassWithoutMembersIntermediate":{"src/TypeClassWithoutMembersIntermediate.purs":["2022-04-04T14:32:49.378431019Z","76d65083da1f6240b4c3b6c910af1326b9b9a538f4eb278b00ddf0bf67d9547c1cab0fae7661bbe4af6e7ecdea9fd26cc9ff9ea5b289d3c3994b3ccb3d099ba8"]},"TypeLevelString":{"src/TypeLevelString.purs":["2022-04-04T14:32:49.378431019Z","361dc3825ebd3efcd9a53dd900cc623f5eca14df82afc93f4d485d8b38e51eb0a72929b6cfb783b3d5c9bef46e6fd18c139fdbd10de484beb335e09ecee79388"]},"TypeOpAliases":{"src/TypeOpAliases.purs":["2022-04-04T14:32:49.378431019Z","5f1279d355f0e8f8c7d063950007ba060f0afdb83524fa10361f389d25fdacdf149c907cbdd94cf3d1a77751903701f22ba377203cd3b5d0c40e504699f94249"]},"TypeSynonym":{"src/TypeSynonym.purs":["2022-04-04T14:32:49.378431019Z","d1a0af1c2592e7f150bb0bf1dca4fc82ffe95b4f96be611408828d105d28bb6a4243a4c2799b1c35875a352e51a19464e4507b9c81d9cd34f0f55f8c94898ed9"]},"TypeSynonymInstance":{"src/TypeSynonymInstance.purs":["2022-04-04T14:32:49.378431019Z","336ba7262428a526f3824306f4ac472aebf637181b8aa23d823e6e70641539a14d57b52272d844af3e3a7fa85cdf4094042e464b61622a5a1c290ee8a6684733"]},"UTF8":{"src/UTF8.purs":["2022-04-04T14:32:49.378431019Z","60771c6d4974ef36414775e5a2511e99d08d5ba3945b010d7a399b77b88b310e10ad7d0016f7946ca3f524e7bbd1dce3575f7b2d81f8154bde197a3da411a624"]},"Virtual":{"src/Virtual.purs":["2022-04-04T14:32:49.378431019Z","a1e01c8b1a7c86c86942611649702ebf6689cf7559ce9ca0ba66052eafe64826b0770b33089e72cc26a3c90d75bcf62e0b75a6a90e085e70a6ec946b16456de2"]}}
+{"Ado":{"src/Ado.purs":["2021-11-28T09:05:27.296398356Z","bd980ae20d61e0e34d23507b1d25598f27407a78cf70084327506f21cc02d85df1bd1b6937459665a8dd9df5bb43ec5947b6e94c16c852aba233747e05a9d58f"]},"ChildDeclOrder":{"src/ChildDeclOrder.purs":["2021-11-28T09:05:27.296398356Z","41a7be97fffe1bbbf925ccb56b68246abb8684b23529fc25e07827b57b32b60ccd82d5c9a2279dc23be1f8803cff8267fa296509b873ec337ffa15ee0e32e2c9"]},"Clash":{"src/Clash.purs":["2021-11-28T09:05:27.296398356Z","7b70d019ea46b72149e185d82bc1345113e8a3977a886aa31ac8a268c6c63c7b93553e1586c45e023e49e485d3f6523a4a11efc8dc70dd8bac5d8b9cac4e4c2d"]},"Clash1":{"src/Clash1.purs":["2021-11-28T09:05:27.296398356Z","bd09c1fd0308ce61d83bef03d3b2366601df559ef8cc9c09f17d963a1bfb2b2e373dcbf5729a3e465c635fbf0035ae09ea3ba58b7844b56586dc3baf9d857bb5"]},"Clash1a":{"src/Clash1a.purs":["2021-11-28T09:05:27.296398356Z","b5c374c74a46d3f633c948de256e299dc2713857ce09441b5ae2f03afdd0468610088f39854f69848c1c9aecf3441b1b39e0919e499280a19d69b83de07d5d0b"]},"Clash2":{"src/Clash2.purs":["2021-11-28T09:05:27.296398356Z","10c61c6600084fdcc0ee93608a354fd7efa7edab67ac8cce131e522b597080b2927dc7bb1a6c98765dfc9a30583dc5bea2514d2932554ab1657c664a81a0a81b"]},"Clash2a":{"src/Clash2a.purs":["2021-11-28T09:05:27.296398356Z","b002aac5be65ac1cb55d10518840293780ea6d4a42b045172544ab3478ea83252f0672f0e1d4ad1599db3955f55202738ba1ee254b8ad94e914fc43fc1f6750f"]},"ConstrainedArgument":{"src/ConstrainedArgument.purs":["2021-11-28T09:05:27.296398356Z","6caa6cc505c6574957afe8e703f6e9869211e9c0a0676ba36a79d2a8b7e3c2c1570aae714cd6acc37e5b206745941460c1cf370a3bbd783c79b89351681ec890"]},"Data.Newtype":{"bower_components/purescript-newtype/src/Data/Newtype.purs":["2021-11-28T09:05:27.293064974Z","408eb6f95efb52faff05d73c757d21cebdd3b58dce3f5b8cfb5f0772224ca7e6ff9b5df0ab9ea40ce0f8448664fe56028af844b2c5dc32e5712b7d9d1541f2b7"]},"DeclOrder":{"src/DeclOrder.purs":["2021-11-28T09:05:27.296398356Z","a8c6ab9c335037c255ae6e0124a107f2e2462c2eebc2ff3637273ba436f2f3589ae203919ff5c8c61106b0542114ba3eba66426d8b5e316089bc1f4efb72643a"]},"DeclOrderNoExportList":{"src/DeclOrderNoExportList.purs":["2021-11-28T09:05:27.296398356Z","379def50dfd7a01dd2b057c707ea8ee53147d41c7dc28083c3827ccc213816840fd26d784a78bd1eabd105231e5479c7bfeebfcb03d1e2f3e8174ab173d740c4"]},"Desugar":{"src/Desugar.purs":["2021-11-28T09:05:27.296398356Z","50ceefe5cbac286908cc7070f4e94f57c62b5c91245d5a8c66d7f4565e3d037e4cf11524c4c790664588a0a5c4216390b5138be9ec93e14d0f82a2c59c8f561a"]},"DocComments":{"src/DocComments.purs":["2021-11-28T09:05:27.296398356Z","220498626601722feb58dd23dd80ac970f6ba7df8e8c2ad604ed833933f6b36219fb5f1d0b9963ffc7e9314043760055ab547fac5784a28416a4851f257a635b"]},"DocCommentsClassMethod":{"src/DocCommentsClassMethod.purs":["2021-11-28T09:05:27.296398356Z","f55a03f2b2624a9ca01adc8372bad4b7e46e8ef1a52ec41c5992767146c9a2354320a3a38587cbf2e78fec118430f193fdcb1cdd9600cd9f755dbbc2e36e46b7"]},"DocCommentsDataConstructor":{"src/DocCommentsDataConstructor.purs":["2021-11-28T09:05:27.296398356Z","68d644ce63642bd55d8338e78e0070c409d3c970a2967338cf612d7a3217813fd98a08e1905776572819cadbc08cdd4bec4a7c1473974a9f3f5d5b1149d33257"]},"DocCommentsMerge":{"src/DocCommentsMerge.purs":["2022-01-25T08:15:07.04967942Z","08e74333f59b1991e5c044debca1b8d2be7193898cc501c6c422b2f3e4c6e6aba8562cfa7b38dac2363e567357722e79d0fcc4757ee91ed067e7179a3615bdbd"]},"DuplicateNames":{"src/DuplicateNames.purs":["2021-11-28T09:05:27.296398356Z","5652f5da0ae79185fb27bce13793bd7752779364e0d1c7c56be2d213853c26ad0abff8536a0d34090a079980e498c837026521efe4a8cfc1b1a16ec70c724eed"]},"Example":{"src/Example.purs":["2021-11-28T09:05:27.296398356Z","3b700a99cc5ee257009553d27a2d25f71f68f006e9deec2b3578f01c7fe4e77de1e929dc110dfcd51d68685ad3ab6b09b0147fe63719861e8a9e480a64e286d9"]},"Example2":{"src/Example2.purs":["2021-11-28T09:05:27.296398356Z","6a479db4e40f66b1e29889516a55cfb22b15b2b8c4531b9cf20307a965af3dc0a6dab4eccc31cca4eacaaa158a01c58ff995ac6f01b2e1ed5571c44fa3bf2536"]},"ExplicitExport":{"src/ExplicitExport.purs":["2021-11-28T09:05:27.296398356Z","fe733409eb325c971f84b6414a1fc9e08793d2271eebcd670ceefd5c5aef837ee76ec5cb5bed96d87ea791a7521c76668a71be5cd8fb14209414893dc20d3d47"]},"ExplicitTypeSignatures":{"src/ExplicitTypeSignatures.purs":["2021-11-28T09:05:27.296398356Z","78a70441c9966f04c6c32a74cbba299f0f8ea870c664e738eb0d8f8cc5929edb7bb697170fc306c9ee69fa4e2f0112af15c8bdb29d63645cdf6f2916a122a0bd"]},"ImportedTwice":{"src/ImportedTwice.purs":["2021-11-28T09:05:27.296398356Z","be9a0cb1e75c689c3af6817a5750862915e70a0017476cce4c539a3c7ce5b33554aa14d2668bd131b89bb28d65b5ddaa79abfb2a538d606f1b11b5ef0ec79067"]},"ImportedTwiceA":{"src/ImportedTwiceA.purs":["2021-11-28T09:05:27.296398356Z","883c8abaefe0dbacbcdea4c53eab41da26687680274419720b1e5d6510bf5127b7ba06df23515ad34f7ffc4626f0064d7867e2b4a5f255a6b573d219926364de"]},"ImportedTwiceB":{"src/ImportedTwiceB.purs":["2021-11-28T09:05:27.296398356Z","48cc2ac8ce40b1d0e3782fcb8ec798cf9c4838a595148055f1bb830d9b07d58780170ad3f8a90f43ac561aff2c52a5d8793480526a4768ebf1c8af1ff1b68751"]},"KindSignatureDocs":{"src/KindSignatureDocs.purs":["2022-01-25T08:15:07.04967942Z","c2a224affb04b4c5db4712d15bfa830999c634c135bf1595f4930dd682258f5a278477ffeba297c42af5d74878e73694180a932ee2ebf7ad8a2ff66c4df2135d"]},"MultiVirtual":{"src/MultiVirtual.purs":["2021-11-28T09:05:27.296398356Z","31bc7e2c2ebee39dbc89536db51493a2cb1843a9e1aed8b288ef16660877fd1abd5f4224d3325a415aabcf79bd5fe76ebb9257738b0193a50c79a20d48b5ab29"]},"MultiVirtual1":{"src/MultiVirtual1.purs":["2021-11-28T09:05:27.296398356Z","23f7975f7494bb84f9fc6fde9071ce04e86df774d81e2b027a85ab46c8237f9921ee926f4a4ad3e03c7799e485ce39e542d1dd94953c50c0d58ea0003cfc3842"]},"MultiVirtual2":{"src/MultiVirtual2.purs":["2021-11-28T09:05:27.296398356Z","f424ed7c0db709b6bb1e57f87069f484fd0db9dddd0475cd15d36bd58743e98729c42efd2df6ee8fbd18609c36c2247cf3428a5a7f1f5ed11e233a2b134990ba"]},"MultiVirtual3":{"src/MultiVirtual3.purs":["2021-11-28T09:05:27.296398356Z","a42415e3b8309bfa81ef127c61dba6f4001188dcee160a8e2f73399179a11262f12daf0205d6bec38fc605b637550f16b62e84a0f2a0f6999355d56ff2540405"]},"NewOperators":{"src/NewOperators.purs":["2021-11-28T09:05:27.296398356Z","f74cae05c73db1f629e199692c517866fb1683caab3c4509657a371733f30319f0c505ed57208757b3e43795aab5191000c834a501d9bd2bf0e58875873c5c40"]},"NewOperators2":{"src/NewOperators2.purs":["2021-11-28T09:05:27.296398356Z","c551a91aa792fb9ee4b5758c010761a53d4a14b8fbaa6b76b6bd9a318a28f245c9b090bdc4f77b904c873d9b71d59fbad3ccd9ad7c8773f5c1e57a22a0204844"]},"NotAllCtors":{"src/NotAllCtors.purs":["2021-11-28T09:05:27.296398356Z","6e0af26cf897b5dd6e8dd4d75988e5607118f6fdd5219aa192f477cc4d760d504bdec930d46af82a44950e3de4fe6c37664a4560a523a45097503b85c161bd96"]},"OperatorSection":{"src/OperatorSection.purs":["2022-04-22T14:06:09.859228226Z","64a9d1bdc2b7df3fe4124651fee37440b9c53b61d25fba7e9a1974c713c12679f227fdc700a6d97218c3628dce4ea9c8c3c5b4e30b5b8f8ecf6a5f6781599c7b"]},"Prelude":{"bower_components/purescript-prelude/src/Prelude.purs":["2021-11-28T09:05:27.293064974Z","7eb0b2f9b7aec29693f79be4642ccea792b1f54c7022a4f1395fb8f3a9b1ad6cbfb2e7685940b89ab21890c02949ec90d4823bd5c36a6b566ca9cb8ec561958f"]},"PrimSubmodules":{"src/PrimSubmodules.purs":["2022-04-22T14:06:09.859228226Z","6b03520e209171032fd18661077ef49b0547b488667b8316e8ec6104a49914fe58929d1dea64fde39ed5a88d814304d0db1d5cd56a3a4b2b5a625585666e42c6"]},"ReExportedTypeClass":{"src/ReExportedTypeClass.purs":["2021-11-28T09:05:27.296398356Z","1cc581d68e1ce113162ab851872e73645807f0deb1d2b970ebc04b314184fe30c3431212ffcf9eec09a56a2291e0050750ac6905f1884bc74d406d0323c4f804"]},"RoleAnnotationDocs":{"src/RoleAnnotationDocs.purs":["2022-01-25T08:15:07.04967942Z","87b1012eaa7e6312ca43aa23efa0ec76eefd72d9e306233a35d4ab9dd3d74ad2051ab11555a5d1136ea2c1800bbfadfa0b52bad30a5a4b9ef3a9aa6498474506"]},"Shebang1Undocumented":{"src/Shebang1Undocumented.purs":["2022-06-09T02:21:13.161043075Z","55cff97ade15395974b1d714467dd824c260851b08a4aa365abf1980e5e746b378379d6b62ac4f1174f20c56600df82b05ca17f21643d529d8f21cb54069d5dc"]},"Shebang2Undocumented":{"src/Shebang2Undocumented.purs":["2022-06-09T02:21:13.161043075Z","d64e34906077c41cc542cbd50a604fb5c311526805a8f62be192cd05c1f6c68b03b728cb9cb90ff005d99f6e60a2384b584800fc23cd0064104d077aa3e22108"]},"Shebang3Undocumented":{"src/Shebang3Undocumented.purs":["2022-06-09T02:21:13.161043075Z","b3f811c431e42fef7eb9682fd1312e49d60b0394df825dcc34c083b191ca0361250ad503d9e4bcb5e7da6c715dab6ad51e47f936a595a0e77b771d5b547a1e3d"]},"Shebang4Undocumented":{"src/Shebang4Undocumented.purs":["2022-06-09T02:21:13.161043075Z","96139bf4debfdfa7f7b250aec10644f819a017f87127acd0cac613da51402f88664f7aea99767cfdfc6658efbe7eba5fba57b127ea5a8d15ba70057f7b6ee0a6"]},"SolitaryTypeClassMember":{"src/SolitaryTypeClassMember.purs":["2021-11-28T09:05:27.296398356Z","f627c589b0a8f58d7bfdf28ecf87891a74e64e8399ce0ab645b7c58049fddc1ea3cbb3c34b862bec8576108d5258d9548ecfbbab98598671cc645a3f358ac852"]},"SomeTypeClass":{"src/SomeTypeClass.purs":["2021-11-28T09:05:27.296398356Z","d09fc77e6c6350e7e4941e2911e012271a49db4a75c57cf738d5865ca622d60b69337f969aa02b13fc869484cba00479212e4b8dbcb458c5723e7a5d73888368"]},"Transitive1":{"src/Transitive1.purs":["2021-11-28T09:05:27.296398356Z","42681f3d0fa143d36474d1cb2f464820bdb907bbc432cd91349f6acdd82657ecb4d9ad1d075c96c551bed37dada4615dd3ff64f912f2cc8a6d99b5e02ee51979"]},"Transitive2":{"src/Transitive2.purs":["2021-11-28T09:05:27.296398356Z","110a1bae420e0f0c05e9846fad483a1d035dfc3ba82c2cd81e44f548fd97965055b1a687ab86256f8cb6a3d79b4c4abe6f45d4728bbc04a7a1b0fedbca115b1e"]},"Transitive3":{"src/Transitive3.purs":["2021-11-28T09:05:27.296398356Z","65f7bb366ac8fab63084ff0229c9d55293db8126b539ff2cb53e511505995f426d50f4cca7d1f61fc53aaaaeed9d72791f9d9f12cc569d92e7bbe1d1908b093c"]},"TypeClassWithFunDeps":{"src/TypeClassWithFunDeps.purs":["2021-11-28T09:05:27.296398356Z","c828f194c8c679d97425ed7e04eb3c9bb04bc4c32542d7d6d7e4a36c6c734eb8ba1ef472ad2b0085d9a042a0724648b85a4605d8fe4995e1a32839b1fb1f0f23"]},"TypeClassWithoutMembers":{"src/TypeClassWithoutMembers.purs":["2021-11-28T09:05:27.296398356Z","3eac42652ce295ee47c340c4b86c91d0f6a8ad1f81824475fa4fc4ae8fd8bb77ceee6a46e31bebe9d2e8a980a7923432b41b0eff5cbf75580ee149e7d997e098"]},"TypeClassWithoutMembersIntermediate":{"src/TypeClassWithoutMembersIntermediate.purs":["2021-11-28T09:05:27.296398356Z","76d65083da1f6240b4c3b6c910af1326b9b9a538f4eb278b00ddf0bf67d9547c1cab0fae7661bbe4af6e7ecdea9fd26cc9ff9ea5b289d3c3994b3ccb3d099ba8"]},"TypeLevelString":{"src/TypeLevelString.purs":["2021-11-28T09:05:27.296398356Z","361dc3825ebd3efcd9a53dd900cc623f5eca14df82afc93f4d485d8b38e51eb0a72929b6cfb783b3d5c9bef46e6fd18c139fdbd10de484beb335e09ecee79388"]},"TypeOpAliases":{"src/TypeOpAliases.purs":["2021-11-28T09:05:27.296398356Z","5f1279d355f0e8f8c7d063950007ba060f0afdb83524fa10361f389d25fdacdf149c907cbdd94cf3d1a77751903701f22ba377203cd3b5d0c40e504699f94249"]},"TypeSynonym":{"src/TypeSynonym.purs":["2021-11-28T09:05:27.296398356Z","d1a0af1c2592e7f150bb0bf1dca4fc82ffe95b4f96be611408828d105d28bb6a4243a4c2799b1c35875a352e51a19464e4507b9c81d9cd34f0f55f8c94898ed9"]},"TypeSynonymInstance":{"src/TypeSynonymInstance.purs":["2021-11-28T09:05:27.296398356Z","336ba7262428a526f3824306f4ac472aebf637181b8aa23d823e6e70641539a14d57b52272d844af3e3a7fa85cdf4094042e464b61622a5a1c290ee8a6684733"]},"UTF8":{"src/UTF8.purs":["2021-11-28T09:05:27.316398646Z","60771c6d4974ef36414775e5a2511e99d08d5ba3945b010d7a399b77b88b310e10ad7d0016f7946ca3f524e7bbd1dce3575f7b2d81f8154bde197a3da411a624"]},"Virtual":{"src/Virtual.purs":["2021-11-28T09:05:27.316398646Z","a1e01c8b1a7c86c86942611649702ebf6689cf7559ce9ca0ba66052eafe64826b0770b33089e72cc26a3c90d75bcf62e0b75a6a90e085e70a6ec946b16456de2"]}}
diff --git a/tests/purs/failing/4382.out b/tests/purs/failing/4382.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/4382.out
@@ -0,0 +1,55 @@
+Error 1 of 5:
+
+  in module [33mMain[0m
+  at tests/purs/failing/4382.purs:10:7 - 10:14 (line 10, column 7 - line 10, column 14)
+
+    Unknown type class [33mRinku[0m
+
+
+  See https://github.com/purescript/documentation/blob/master/errors/UnknownName.md for more information,
+  or to contribute content related to this error.
+
+Error 2 of 5:
+
+  in module [33mMain[0m
+  at tests/purs/failing/4382.purs:13:10 - 13:17 (line 13, column 10 - line 13, column 17)
+
+    Unknown type class [33mRinku[0m
+
+
+  See https://github.com/purescript/documentation/blob/master/errors/UnknownName.md for more information,
+  or to contribute content related to this error.
+
+Error 3 of 5:
+
+  in module [33mMain[0m
+  at tests/purs/failing/4382.purs:16:10 - 16:17 (line 16, column 10 - line 16, column 17)
+
+    Unknown type class [33mRinku[0m
+
+
+  See https://github.com/purescript/documentation/blob/master/errors/UnknownName.md for more information,
+  or to contribute content related to this error.
+
+Error 4 of 5:
+
+  in module [33mMain[0m
+  at tests/purs/failing/4382.purs:18:17 - 18:28 (line 18, column 17 - line 18, column 28)
+
+    Unknown type class [33mRinku[0m
+
+
+  See https://github.com/purescript/documentation/blob/master/errors/UnknownName.md for more information,
+  or to contribute content related to this error.
+
+Error 5 of 5:
+
+  in module [33mMain[0m
+  at tests/purs/failing/4382.purs:20:25 - 20:36 (line 20, column 25 - line 20, column 36)
+
+    Unknown type class [33mRinku[0m
+
+
+  See https://github.com/purescript/documentation/blob/master/errors/UnknownName.md for more information,
+  or to contribute content related to this error.
+
diff --git a/tests/purs/failing/4382.purs b/tests/purs/failing/4382.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/4382.purs
@@ -0,0 +1,20 @@
+-- @shouldFailWith UnknownName
+-- @shouldFailWith UnknownName
+-- @shouldFailWith UnknownName
+-- @shouldFailWith UnknownName
+-- @shouldFailWith UnknownName
+module Main where
+
+newtype T a = T a
+
+class Rinku a <= Maho a where
+  tPose :: a -> a
+
+instance Rinku a => Maho a where
+  tPose = \a -> a
+
+instance Rinku a
+
+derive instance Rinku (T a)
+
+derive newtype instance Rinku (T a)
diff --git a/tests/purs/failing/FoldableInstance1.out b/tests/purs/failing/FoldableInstance1.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance1.out
@@ -0,0 +1,24 @@
+Error found:
+in module [33mMain[0m
+at tests/purs/failing/FoldableInstance1.purs:9:26 - 9:29 (line 9, column 26 - line 9, column 29)
+
+  Could not match kind
+  [33m      [0m
+  [33m  Type[0m
+  [33m      [0m
+  with kind
+  [33m              [0m
+  [33m  Type -> Type[0m
+  [33m              [0m
+
+while checking that type [33mFoo[0m
+  has kind [33mType -> Type[0m
+while inferring the kind of [33mFoldable Foo[0m
+in type class instance
+[33m                            [0m
+[33m  Data.Foldable.Foldable Foo[0m
+[33m                            [0m
+
+See https://github.com/purescript/documentation/blob/master/errors/KindsDoNotUnify.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance1.purs b/tests/purs/failing/FoldableInstance1.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance1.purs
@@ -0,0 +1,9 @@
+-- @shouldFailWith KindsDoNotUnify
+module Main where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data Foo = Bar
+
+derive instance Foldable Foo
diff --git a/tests/purs/failing/FoldableInstance10.out b/tests/purs/failing/FoldableInstance10.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance10.out
@@ -0,0 +1,16 @@
+Error found:
+in module [33mFoldableInstance10[0m
+at tests/purs/failing/FoldableInstance10.purs:11:1 - 11:30 (line 11, column 1 - line 11, column 30)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance10.purs:
+  [90m    9[0m [33m[0m
+  [90m   10[0m [33mdata Test a = Test (Variant (left :: [7ma[27m, right :: Array [7ma[27m))[0m
+  [90m   11[0m [33mderive instance Foldable Test[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance10.purs b/tests/purs/failing/FoldableInstance10.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance10.purs
@@ -0,0 +1,11 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance10 where
+
+import Prelude
+import Data.Tuple (Tuple)
+import Data.Foldable (class Foldable)
+
+foreign import data Variant :: Row Type -> Type
+
+data Test a = Test (Variant (left :: a, right :: Array a))
+derive instance Foldable Test
diff --git a/tests/purs/failing/FoldableInstance2.out b/tests/purs/failing/FoldableInstance2.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance2.out
@@ -0,0 +1,24 @@
+Error found:
+in module [33mMain[0m
+at tests/purs/failing/FoldableInstance2.purs:10:26 - 10:29 (line 10, column 26 - line 10, column 29)
+
+  Could not match kind
+  [33m      [0m
+  [33m  Type[0m
+  [33m      [0m
+  with kind
+  [33m              [0m
+  [33m  Type -> Type[0m
+  [33m              [0m
+
+while checking that type [33mFoo[0m
+  has kind [33mType -> Type[0m
+while inferring the kind of [33mFoldable Foo[0m
+in type class instance
+[33m                            [0m
+[33m  Data.Foldable.Foldable Foo[0m
+[33m                            [0m
+
+See https://github.com/purescript/documentation/blob/master/errors/KindsDoNotUnify.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance2.purs b/tests/purs/failing/FoldableInstance2.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance2.purs
@@ -0,0 +1,10 @@
+-- @shouldFailWith KindsDoNotUnify
+module Main where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data Foo :: (Type -> Type) -> Type
+data Foo a = Bar
+
+derive instance Foldable Foo
diff --git a/tests/purs/failing/FoldableInstance3.out b/tests/purs/failing/FoldableInstance3.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance3.out
@@ -0,0 +1,24 @@
+Error found:
+in module [33mMain[0m
+at tests/purs/failing/FoldableInstance3.purs:9:26 - 9:29 (line 9, column 26 - line 9, column 29)
+
+  Could not match kind
+  [33m      [0m
+  [33m  Type[0m
+  [33m      [0m
+  with kind
+  [33m              [0m
+  [33m  Type -> Type[0m
+  [33m              [0m
+
+while checking that type [33mFoo[0m
+  has kind [33mType -> Type[0m
+while inferring the kind of [33mFoldable Foo[0m
+in type class instance
+[33m                            [0m
+[33m  Data.Foldable.Foldable Foo[0m
+[33m                            [0m
+
+See https://github.com/purescript/documentation/blob/master/errors/KindsDoNotUnify.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance3.purs b/tests/purs/failing/FoldableInstance3.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance3.purs
@@ -0,0 +1,9 @@
+-- @shouldFailWith KindsDoNotUnify
+module Main where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data Foo f = Bar (f Int)
+
+derive instance Foldable Foo
diff --git a/tests/purs/failing/FoldableInstance4.out b/tests/purs/failing/FoldableInstance4.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance4.out
@@ -0,0 +1,23 @@
+Error found:
+in module [33mFoldableInstance4[0m
+at tests/purs/failing/FoldableInstance4.purs:8:1 - 8:27 (line 8, column 1 - line 8, column 27)
+
+  No type class instance was found for
+  [33m                                      [0m
+  [33m  Data.Foldable.Foldable (Function t3)[0m
+  [33m                                      [0m
+  The instance head contains unknown type variables. Consider adding a type annotation.
+
+while applying a function [33mfoldl[0m
+  of type [33mFoldable t0 => (t1 -> t2 -> t1) -> t1 -> t0 t2 -> t1[0m
+  to argument [33m$f1[0m
+while inferring the type of [33mfoldl $f1[0m
+
+where [33mt0[0m is an unknown type
+      [33mt2[0m is an unknown type
+      [33mt1[0m is an unknown type
+      [33mt3[0m is an unknown type
+
+See https://github.com/purescript/documentation/blob/master/errors/NoInstanceFound.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance4.purs b/tests/purs/failing/FoldableInstance4.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance4.purs
@@ -0,0 +1,8 @@
+-- @shouldFailWith NoInstanceFound
+module FoldableInstance4 where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data T a = T (forall t. Show t => t -> a)
+derive instance Foldable T
diff --git a/tests/purs/failing/FoldableInstance5.out b/tests/purs/failing/FoldableInstance5.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance5.out
@@ -0,0 +1,16 @@
+Error found:
+in module [33mFoldableInstance5[0m
+at tests/purs/failing/FoldableInstance5.purs:9:1 - 9:30 (line 9, column 1 - line 9, column 30)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance5.purs:
+  [90m    7[0m [33m[0m
+  [90m    8[0m [33mdata Test a = Test (Tuple [7ma[27m Int)[0m
+  [90m    9[0m [33mderive instance Foldable Test[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance5.purs b/tests/purs/failing/FoldableInstance5.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance5.purs
@@ -0,0 +1,9 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance5 where
+
+import Prelude
+import Data.Foldable (class Foldable)
+import Data.Tuple (Tuple(..))
+
+data Test a = Test (Tuple a Int)
+derive instance Foldable Test
diff --git a/tests/purs/failing/FoldableInstance6.out b/tests/purs/failing/FoldableInstance6.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance6.out
@@ -0,0 +1,16 @@
+Error found:
+in module [33mFoldableInstance6[0m
+at tests/purs/failing/FoldableInstance6.purs:8:1 - 8:30 (line 8, column 1 - line 8, column 30)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance6.purs:
+  [90m    6[0m [33m[0m
+  [90m    7[0m [33mdata Test a = Test ([7ma[27m -> Int)[0m
+  [90m    8[0m [33mderive instance Foldable Test[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance6.purs b/tests/purs/failing/FoldableInstance6.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance6.purs
@@ -0,0 +1,8 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance6 where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data Test a = Test (a -> Int)
+derive instance Foldable Test
diff --git a/tests/purs/failing/FoldableInstance7.out b/tests/purs/failing/FoldableInstance7.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance7.out
@@ -0,0 +1,16 @@
+Error found:
+in module [33mFoldableInstance6[0m
+at tests/purs/failing/FoldableInstance7.purs:9:1 - 9:30 (line 9, column 1 - line 9, column 30)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance7.purs:
+  [90m    7[0m [33m[0m
+  [90m    8[0m [33mdata Test a = Test (Tuple [7ma[27m a)[0m
+  [90m    9[0m [33mderive instance Foldable Test[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance7.purs b/tests/purs/failing/FoldableInstance7.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance7.purs
@@ -0,0 +1,9 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance6 where
+
+import Prelude
+import Data.Tuple (Tuple(..))
+import Data.Foldable (class Foldable)
+
+data Test a = Test (Tuple a a)
+derive instance Foldable Test
diff --git a/tests/purs/failing/FoldableInstance8.out b/tests/purs/failing/FoldableInstance8.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance8.out
@@ -0,0 +1,16 @@
+Error found:
+in module [33mFoldableInstance6[0m
+at tests/purs/failing/FoldableInstance8.purs:8:1 - 8:34 (line 8, column 1 - line 8, column 34)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance8.purs:
+  [90m    6[0m [33m[0m
+  [90m    7[0m [33mdata Test f a = Test (f [7ma[27m a)[0m
+  [90m    8[0m [33mderive instance Foldable (Test f)[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance8.purs b/tests/purs/failing/FoldableInstance8.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance8.purs
@@ -0,0 +1,8 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance6 where
+
+import Prelude
+import Data.Foldable (class Foldable)
+
+data Test f a = Test (f a a)
+derive instance Foldable (Test f)
diff --git a/tests/purs/failing/FoldableInstance9.out b/tests/purs/failing/FoldableInstance9.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance9.out
@@ -0,0 +1,49 @@
+Error found:
+in module [33mFoldableInstance9[0m
+at tests/purs/failing/FoldableInstance9.purs:53:1 - 53:38 (line 53, column 1 - line 53, column 38)
+
+  One or more type variables are in positions that prevent [33mFoldable[0m from being derived.
+  To derive this class, make sure that these variables are only used as the final arguments to type constructors, and that those type constructors themselves have instances of [33mFoldable[0m.
+
+  tests/purs/failing/FoldableInstance9.purs:
+  [90m   15[0m [33mdata Test f g h a[0m
+  [90m   16[0m [33m  = Test1 (f [7ma[27m [7ma[27m a) (f Int [7ma[27m a) (f [7ma[27m [7ma[27m Int) (f Int [7ma[27m Int) (f Int Int Int)[0m
+  [90m   17[0m [33m  | Test2 { all :: f [7ma[27m [7ma[27m a[0m
+  [90m   18[0m [33m          , rights :: f Int [7ma[27m a[0m
+  [90m   19[0m [33m          , lefts :: f [7ma[27m [7ma[27m Int[0m
+  [90m   20[0m [33m          , middle :: f Int [7ma[27m Int[0m
+  [90m   21[0m [33m          , none :: f Int Int Int[0m
+  [90m   22[0m [33m          }[0m
+  [90m   23[0m [33m  | Test3 (g[0m
+  [90m   24[0m [33m            { all :: f [7ma[27m [7ma[27m [7ma[27m[0m
+  [90m   25[0m [33m            , rights :: f Int [7ma[27m [7ma[27m[0m
+  [90m   26[0m [33m            , lefts :: f [7ma[27m [7ma[27m Int[0m
+  [90m   27[0m [33m            , middle :: f Int [7ma[27m Int[0m
+  [90m   28[0m [33m            , none :: f Int Int Int[0m
+  [90m  ...[0m
+  [90m   32[0m [33m            { nested1 ::[0m
+  [90m   33[0m [33m                { all :: f [7ma[27m [7ma[27m [7ma[27m[0m
+  [90m   34[0m [33m                , rights :: f Int [7ma[27m [7ma[27m[0m
+  [90m   35[0m [33m                , lefts :: f [7ma[27m [7ma[27m Int[0m
+  [90m   36[0m [33m                , middle :: f Int [7ma[27m Int[0m
+  [90m   37[0m [33m                , none :: f Int Int Int[0m
+  [90m  ...[0m
+  [90m   40[0m [33m                g[0m
+  [90m   41[0m [33m                  { all :: f [7ma[27m [7ma[27m [7ma[27m[0m
+  [90m   42[0m [33m                  , rights :: f Int [7ma[27m [7ma[27m[0m
+  [90m   43[0m [33m                  , lefts :: f [7ma[27m [7ma[27m Int[0m
+  [90m   44[0m [33m                  , middle :: f Int [7ma[27m Int[0m
+  [90m   45[0m [33m                  , none :: f Int Int Int[0m
+  [90m   46[0m [33m                  }[0m
+  [90m   47[0m [33m                  [7ma[27m[0m
+  [90m   48[0m [33m            }[0m
+  [90m   49[0m [33m            a)[0m
+  [90m   50[0m [33m  | Test5 (Rec f [7ma[27m)[0m
+  [90m   51[0m [33m  | Test6 (g (Rec f [7ma[27m) a)[0m
+  [90m   52[0m [33m  | Test7 (h { nested1 :: Rec f [7ma[27m, nested2 :: g (Rec f [7ma[27m) [7ma[27m } a)[0m
+  [90m   53[0m [33mderive instance Foldable (Test f g h)[0m
+
+
+See https://github.com/purescript/documentation/blob/master/errors/CannotDeriveInvalidConstructorArg.md for more information,
+or to contribute content related to this error.
+
diff --git a/tests/purs/failing/FoldableInstance9.purs b/tests/purs/failing/FoldableInstance9.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/FoldableInstance9.purs
@@ -0,0 +1,53 @@
+-- @shouldFailWith CannotDeriveInvalidConstructorArg
+module FoldableInstance9 where
+
+import Prelude
+import Data.Tuple (Tuple)
+import Data.Foldable (class Foldable)
+
+type Rec f a =
+  { all :: f a a a
+  , rights :: f Int a a
+  , lefts :: f a a Int
+  , middle :: f Int a Int
+  , none :: f Int Int Int
+  }
+data Test f g h a
+  = Test1 (f a a a) (f Int a a) (f a a Int) (f Int a Int) (f Int Int Int)
+  | Test2 { all :: f a a a
+          , rights :: f Int a a
+          , lefts :: f a a Int
+          , middle :: f Int a Int
+          , none :: f Int Int Int
+          }
+  | Test3 (g
+            { all :: f a a a
+            , rights :: f Int a a
+            , lefts :: f a a Int
+            , middle :: f Int a Int
+            , none :: f Int Int Int
+            }
+            a)
+  | Test4 (h
+            { nested1 ::
+                { all :: f a a a
+                , rights :: f Int a a
+                , lefts :: f a a Int
+                , middle :: f Int a Int
+                , none :: f Int Int Int
+                }
+            , nested2 ::
+                g
+                  { all :: f a a a
+                  , rights :: f Int a a
+                  , lefts :: f a a Int
+                  , middle :: f Int a Int
+                  , none :: f Int Int Int
+                  }
+                  a
+            }
+            a)
+  | Test5 (Rec f a)
+  | Test6 (g (Rec f a) a)
+  | Test7 (h { nested1 :: Rec f a, nested2 :: g (Rec f a) a } a)
+derive instance Foldable (Test f g h)
diff --git a/tests/purs/failing/TypedHole4.out b/tests/purs/failing/TypedHole4.out
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/TypedHole4.out
@@ -0,0 +1,52 @@
+Error 1 of 2:
+
+  in module [33mMain[0m
+  at tests/purs/failing/TypedHole4.purs:8:9 - 8:14 (line 8, column 9 - line 8, column 14)
+
+    Hole '[33mhelp[0m' has the inferred type
+    [33m    [0m
+    [33m  a0[0m
+    [33m    [0m
+    You could substitute the hole with one of these values:
+    [33m          [0m
+    [33m  b  :: a0[0m
+    [33m          [0m
+    in the following context:
+
+      b :: [33ma0[0m
+
+
+  in value declaration [33mf[0m
+
+  where [33ma0[0m is a rigid type variable
+          bound at (line 0, column 0 - line 0, column 0)
+
+  See https://github.com/purescript/documentation/blob/master/errors/HoleInferredType.md for more information,
+  or to contribute content related to this error.
+
+Error 2 of 2:
+
+  in module [33mMain[0m
+  at tests/purs/failing/TypedHole4.purs:9:9 - 9:14 (line 9, column 9 - line 9, column 14)
+
+    Hole '[33mhelp[0m' has the inferred type
+    [33m    [0m
+    [33m  a0[0m
+    [33m    [0m
+    You could substitute the hole with one of these values:
+    [33m          [0m
+    [33m  b  :: a0[0m
+    [33m          [0m
+    in the following context:
+
+      b :: [33ma0[0m
+
+
+  in value declaration [33mf[0m
+
+  where [33ma0[0m is a rigid type variable
+          bound at (line 0, column 0 - line 0, column 0)
+
+  See https://github.com/purescript/documentation/blob/master/errors/HoleInferredType.md for more information,
+  or to contribute content related to this error.
+
diff --git a/tests/purs/failing/TypedHole4.purs b/tests/purs/failing/TypedHole4.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/failing/TypedHole4.purs
@@ -0,0 +1,9 @@
+-- @shouldFailWith HoleInferredType
+-- @shouldFailWith HoleInferredType
+module Main where
+
+data F = X | Y
+
+f :: forall a. F -> a -> a
+f X b = ?help
+f Y b = ?help
diff --git a/tests/purs/optimize/4386.out.js b/tests/purs/optimize/4386.out.js
new file mode 100644
--- /dev/null
+++ b/tests/purs/optimize/4386.out.js
@@ -0,0 +1,26 @@
+var mySTFn2 = function (a, b) {
+    return a + b | 0;
+};
+var mySTFn1 = function (a) {
+    return a + 1 | 0;
+};
+var myInt2 = function () {
+    return mySTFn2(0, 1);
+};
+var myInt1 = function () {
+    return mySTFn1(0);
+};
+var otherTest = function __do() {
+    var a = mySTFn2(0, 1);
+    var b = mySTFn1(2);
+    var c = myInt1();
+    var d = myInt2();
+    return ((a + b | 0) + c | 0) + d | 0;
+};
+export {
+    mySTFn1,
+    mySTFn2,
+    myInt1,
+    myInt2,
+    otherTest
+};
diff --git a/tests/purs/optimize/4386.purs b/tests/purs/optimize/4386.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/optimize/4386.purs
@@ -0,0 +1,25 @@
+module Main where
+
+import Prelude
+import Control.Monad.ST (ST)
+import Control.Monad.ST.Uncurried (STFn1, STFn2, mkSTFn1, mkSTFn2, runSTFn1, runSTFn2)
+
+mySTFn1 :: forall r. STFn1 Int r Int
+mySTFn1 = mkSTFn1 \a -> pure (a + 1)
+
+mySTFn2 :: forall r. STFn2 Int Int r Int
+mySTFn2 = mkSTFn2 \a b -> pure (a + b)
+
+myInt1 :: forall r. ST r Int
+myInt1 = runSTFn1 mySTFn1 0
+
+myInt2 :: forall r. ST r Int
+myInt2 = runSTFn2 mySTFn2 0 1
+
+otherTest :: forall r. ST r Int
+otherTest = do
+  a <- runSTFn2 mySTFn2 0 1
+  b <- runSTFn1 mySTFn1 2
+  c <- myInt1
+  d <- myInt2
+  pure $ a + b + c + d
diff --git a/tests/purs/passing/4194.purs b/tests/purs/passing/4194.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/passing/4194.purs
@@ -0,0 +1,14 @@
+module Main where
+
+import Effect.Console (log)
+
+data Identity a
+data Maybe a
+
+class ErrorSemigroup o m w | w -> o m, o m -> w
+
+instance ErrorSemigroup (Identity o) (Identity m) (Identity w)
+
+instance ErrorSemigroup o (Maybe m) (Maybe w)
+
+main = log "Done"
diff --git a/tests/purs/passing/DerivingFoldable.purs b/tests/purs/passing/DerivingFoldable.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/passing/DerivingFoldable.purs
@@ -0,0 +1,89 @@
+module Main where
+
+import Prelude
+import Effect.Console (log)
+import Data.Foldable (class Foldable, foldl, foldr, foldMap)
+import Test.Assert
+
+-- Fold is done in alphabetical ordering of labels,
+-- not their order in definition
+type RecordFields f a =
+  { a :: a
+  , zArrayA :: Array a
+  , fa :: f a
+  , ignore :: Int
+  , arrayIgnore :: Array Int
+  , fIgnore :: f Int
+  }
+
+data M f a
+  = M0
+  | M1 a (Array a)
+  | M2 Int (forall a. Array a -> Array a)
+  | M3 (f a)
+  | M4 (RecordFields f a)
+  | M5 { nested :: RecordFields f a }
+  | M6 Int a (Array Int) (Array a) (f a) (f Int) (RecordFields f a) { nested :: RecordFields f a }
+  | M7 (f (f { nested :: RecordFields f a }))
+
+derive instance foldableM :: Foldable f => Foldable (M f)
+
+type MArrStr = M Array String
+
+foldlStr :: forall f. Foldable f => f String -> String
+foldlStr = foldl (\acc next -> acc <> "<" <> next) "Start"
+
+foldrStr :: forall f. Foldable f => f String -> String
+foldrStr = foldr (\next acc -> next <> ">" <> acc) "Start"
+
+foldMapStr :: forall f. Foldable f => f String -> String
+foldMapStr = foldMap identity
+
+m0 = M0 :: MArrStr
+m1 = M1 "a" ["b", "c"] :: MArrStr
+m2 = M2 0 identity :: MArrStr
+m3 = M3 ["a", "b", "c"] :: MArrStr
+m4 = M4 recordValue :: MArrStr
+m5 = M5 { nested: recordValue } :: MArrStr
+m6 = M6 1 "a" [] ["b"] ["c"] [] recordValue { nested: recordValue } :: MArrStr
+m7 = M7 [[{ nested: recordValue }]] :: MArrStr
+
+recordValue :: RecordFields Array String
+recordValue =
+  { a: "a"
+  , zArrayA: ["c"]
+  , fa: ["b"]
+  , ignore: 1
+  , arrayIgnore: [2, 3]
+  , fIgnore: [4]
+  }
+
+main = do
+  assertEqual' "foldl - M0" { expected: "Start", actual: foldlStr m0 }
+  assertEqual' "foldl - M1" { expected: "Start<a<b<c", actual: foldlStr m1 }
+  assertEqual' "foldl - M2" { expected: "Start", actual: foldlStr m2 }
+  assertEqual' "foldl - M3" { expected: "Start<a<b<c", actual: foldlStr m3 }
+  assertEqual' "foldl - M4" { expected: "Start<a<b<c", actual: foldlStr m4 }
+  assertEqual' "foldl - M5" { expected: "Start<a<b<c", actual: foldlStr m5 }
+  assertEqual' "foldl - M6" { expected: "Start<a<b<c<a<b<c<a<b<c", actual: foldlStr m6 }
+  assertEqual' "foldl - M7" { expected: "Start<a<b<c", actual: foldlStr m7 }
+
+  assertEqual' "foldr - M0" { expected: "Start", actual: foldrStr m0 }
+  assertEqual' "foldr - M1" { expected: "a>b>c>Start", actual: foldrStr m1 }
+  assertEqual' "foldr - M2" { expected: "Start", actual: foldrStr m2 }
+  assertEqual' "foldr - M3" { expected: "a>b>c>Start", actual: foldrStr m3 }
+  assertEqual' "foldr - M4" { expected: "a>b>c>Start", actual: foldrStr m4 }
+  assertEqual' "foldr - M5" { expected: "a>b>c>Start", actual: foldrStr m5 }
+  assertEqual' "foldr - M6" { expected: "a>b>c>a>b>c>a>b>c>Start", actual: foldrStr m6 }
+  assertEqual' "foldr - M7" { expected: "a>b>c>Start", actual: foldrStr m7 }
+
+  assertEqual' "foldMap - M0" { expected: "", actual: foldMapStr m0 }
+  assertEqual' "foldMap - M1" { expected: "abc", actual: foldMapStr m1 }
+  assertEqual' "foldMap - M2" { expected: "", actual: foldMapStr m2 }
+  assertEqual' "foldMap - M3" { expected: "abc", actual: foldMapStr m3 }
+  assertEqual' "foldMap - M4" { expected: "abc", actual: foldMapStr m4 }
+  assertEqual' "foldMap - M5" { expected: "abc", actual: foldMapStr m5 }
+  assertEqual' "foldMap - M6" { expected: "abcabcabc", actual: foldMapStr m6 }
+  assertEqual' "foldMap - M7" { expected: "abc", actual: foldMapStr m7 }
+
+  log "Done"
diff --git a/tests/purs/passing/DerivingFunctor.purs b/tests/purs/passing/DerivingFunctor.purs
--- a/tests/purs/passing/DerivingFunctor.purs
+++ b/tests/purs/passing/DerivingFunctor.purs
@@ -3,34 +3,122 @@
 import Prelude
 import Data.Eq (class Eq1)
 import Effect.Console (log)
+import Data.List (List(..), (:))
+import Data.Tuple (Tuple(..))
 import Test.Assert
 
-type MyRecord a = { myField :: a }
+type RecordFields f a =
+  { a :: a
+  , zArrayA :: Array a
+  , fa :: f a
+  , ignore :: Int
+  , recursiveA :: Array (Tuple Int (Array a))
+  , arrayIgnore :: Array Int
+  , fIgnore :: f Int
+  , empty :: {}
+  }
 
 data M f a
   = M0 a (Array a)
   | M1 Int
   | M2 (f a)
-  | M3 { foo :: Int, bar :: a, baz :: f a }
-  | M4 (MyRecord a)
+  | M3 (RecordFields f a)
+  | M4 { nested :: RecordFields f a }
+  | M5 Int a (Array Int) (Array a) (f a) (f Int) (RecordFields f a) { nested :: RecordFields f a }
+  | M6 (Array (Array (Array a)))
 
 derive instance eqM :: (Eq1 f, Eq a) => Eq (M f a)
 derive instance functorM :: Functor f => Functor (M f)
 
+type MA = M Array
+
+m0L = M0 0 [1, 2] :: MA Int
+m0R = M0 "0" ["1", "2"] :: MA String
+
+m1L = M1 0 :: MA Int
+m1R = M1 0 :: MA String
+
+m2L = M2 [0, 1] :: MA Int
+m2R = M2 ["0", "1"] :: MA String
+
+m3L = M3 recordValueL :: MA Int
+m3R = M3 recordValueR :: MA String
+
+m4L = M4 { nested: recordValueL } :: MA Int
+m4R = M4 { nested: recordValueR } :: MA String
+
+m5L = M5 0 1 [2, 3] [3, 4] [5, 6] [7, 8] recordValueL { nested: recordValueL } :: MA Int
+m5R = M5 0 "1" [2, 3] ["3", "4"] ["5", "6"] [7, 8] recordValueR { nested: recordValueR } :: MA String
+
+recordValueL :: RecordFields Array Int
+recordValueL = { a: 71, zArrayA: [72], fa: [73], ignore: 91, recursiveA: [ Tuple 1 [1], Tuple 2 [2] ], arrayIgnore: [92, 93], fIgnore: [94], empty: {} }
+
+recordValueR :: RecordFields Array String
+recordValueR = { a: "71", zArrayA: ["72"], fa: ["73"], ignore: 91, recursiveA: [ Tuple 1 ["1"], Tuple 2 ["2"] ], arrayIgnore: [92, 93], fIgnore: [94], empty: {} }
+
+m6L = M6 [[[1, 2]]] :: MA Int
+m6R = M6 [[["1", "2"]]] :: MA String
+
+maTests = do
+  assert' "map - M0" $ map show m0L == m0R
+  assert' "map - M1" $ map show m1L == m1R
+  assert' "map - M2" $ map show m2L == m2R
+  assert' "map - M3" $ map show m3L == m3R
+  assert' "map - M4" $ map show m4L == m4R
+  assert' "map - M5" $ map show m5L == m5R
+  assert' "map - M6" $ map show m6L == m6R
+
+data Fun1 a = Fun1 (Int -> Int -> a)
+derive instance Functor Fun1
+
+f1Test = do
+  assert' "map - Fun1" do
+    let
+      fn = show
+      left a b = a + b
+      right a b = fn $ left a b
+      Fun1 left' = map fn $ Fun1 left
+    left' 1 2 == right 1 2
+
+data Fun2 a = Fun2 (Int -> Int -> Array (Array a))
+derive instance Functor Fun2
+
+f2Test = do
+  assert' "map - Fun2" do
+    let
+      fn = show
+      left a b = [[a + b]]
+      right a b = map (map fn) $ left a b
+      Fun2 left' = map fn $ Fun2 left
+    left' 1 2 == right 1 2
+
+data Fun3 f a = Fun3 (Unit -> Array (f (Array { nested :: RecordFields f a })))
+derive instance Functor f => Functor (Fun3 f)
+
+f3Test = do
+  assert' "map - Fun3" do
+    let
+      left _ = [[[{ nested: recordValueL }]]]
+      right _ = [[[{ nested: recordValueR }]]]
+      Fun3 left' = map show $ Fun3 left
+    left' unit == right unit
+
 data T a = T (forall t. Show t => t -> a)
 derive instance functorT :: Functor T
 
-type MA = M Array
+taTests = do
+  case map show (T \_ -> 42) of
+    T f -> assert' "map show T" $ f "hello" == "42"
+    _   -> assert' "map show T" false
 
-main = do
-  assert $ map show (M0 0 [1, 2] :: MA Int) == M0 "0" ["1", "2"]
-  assert $ map show (M1 0 :: MA Int) == M1 0
-  assert $ map show (M2 [0, 1] :: MA Int) == M2 ["0", "1"]
-  assert $ map show (M3 {foo: 0, bar: 1, baz: [2, 3]} :: MA Int) == M3 {foo: 0, bar: "1", baz: ["2", "3"]}
-  assert $ map show (M4 { myField: 42 }) == (M4 { myField: "42" } :: MA String)
+funTests = do
+  f1Test
+  f2Test
+  f3Test
+  taTests
 
-  case map show (T \_ -> 42) of
-    T f -> assert $ f "hello" == "42"
-    _   -> assert false
+main = do
+  maTests
+  funTests
 
   log "Done"
diff --git a/tests/purs/passing/DerivingTraversable.purs b/tests/purs/passing/DerivingTraversable.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/passing/DerivingTraversable.purs
@@ -0,0 +1,110 @@
+module Main where
+
+import Prelude
+
+import Effect.Console (log)
+import Data.Eq (class Eq1)
+import Data.Foldable (class Foldable)
+import Data.Traversable (class Traversable, traverse, sequence)
+import Test.Assert
+
+-- Traverse order is done in alphabetical ordering of labels,
+-- not their order in definition
+type RecordFields f a =
+  { a :: a
+  , zArrayA :: Array a
+  , fa :: f a
+  , ignore :: Int
+  , arrayIgnore :: Array Int
+  , fIgnore :: f Int
+  }
+
+data M f a
+  = M0
+  | M1 a (Array a)
+  | M2 Int
+  | M3 (f a)
+  | M4 (RecordFields f a)
+  | M5 { nested :: RecordFields f a }
+  | M6 Int a (Array Int) (Array a) (f a) (f Int) (RecordFields f a) { nested :: RecordFields f a }
+  | M7 (f (f { nested :: RecordFields f a }))
+
+-- Note: all 4 of these constraints are needed to compile this code
+derive instance
+  ( Eq1 f
+  , Eq (f (f { nested :: RecordFields f a }))
+  , Eq (f { nested :: RecordFields f a })
+  , Eq a
+  ) => Eq (M f a)
+derive instance Functor f => Functor (M f)
+derive instance Foldable f => Foldable (M f)
+derive instance Traversable f => Traversable (M f)
+
+type MArrStr = M Array String
+
+traverseStr :: forall f. Traversable f => f String -> Array (f String)
+traverseStr = traverse pure
+
+sequenceStr :: forall f. Traversable f => f (Array String) -> Array (f String)
+sequenceStr = sequence
+
+m0 = M0 :: MArrStr
+m1 = M1 "a" ["b", "c"] :: MArrStr
+m2 = M2 0 :: MArrStr
+m3 = M3 ["a", "b", "c"] :: MArrStr
+m4 = M4 recordValue :: MArrStr
+m5 = M5 { nested: recordValue } :: MArrStr
+m6 = M6 1 "a" [] ["b"] ["c"] [] recordValue { nested: recordValue } :: MArrStr
+m7 = M7 [ [ { nested: recordValue } ] ] :: MArrStr
+
+recordValue :: RecordFields Array String
+recordValue =
+  { a: "a"
+  , zArrayA: ["c"]
+  , fa: ["b"]
+  , ignore: 1
+  , arrayIgnore: [2, 3]
+  , fIgnore: [4]
+  }
+
+type MArrArrStr = M Array (Array String)
+
+m0' = M0 :: MArrArrStr
+m1' = M1 ["a"] [["b"], ["c"]] :: MArrArrStr
+m2' = M2 0 :: MArrArrStr
+m3' = M3 [["a"], ["b"], ["c"]] :: MArrArrStr
+m4' = M4 recordValue' :: MArrArrStr
+m5' = M5 { nested: recordValue' } :: MArrArrStr
+m6' = M6 1 ["a"] [] [["b"]] [["c"]] [] recordValue' { nested: recordValue' } :: MArrArrStr
+m7' = M7 [ [ { nested: recordValue' } ] ] :: MArrArrStr
+
+recordValue' :: RecordFields Array (Array String)
+recordValue' =
+  { a: ["a"]
+  , zArrayA: [["c"]]
+  , fa: [["b"]]
+  , ignore: 1
+  , arrayIgnore: [2, 3]
+  , fIgnore: [4]
+  }
+
+main = do
+  assert' "traverse - m0" $ traverseStr m0 == [m0]
+  assert' "traverse - m1" $ traverseStr m1 == [m1]
+  assert' "traverse - m2" $ traverseStr m2 == [m2]
+  assert' "traverse - m3" $ traverseStr m3 == [m3]
+  assert' "traverse - m4" $ traverseStr m4 == [m4]
+  assert' "traverse - m5" $ traverseStr m5 == [m5]
+  assert' "traverse - m6" $ traverseStr m6 == [m6]
+  assert' "traverse - m7" $ traverseStr m7 == [m7]
+
+  assert' "sequence - m0" $ sequenceStr m0' == [m0]
+  assert' "sequence - m1" $ sequenceStr m1' == [m1]
+  assert' "sequence - m2" $ sequenceStr m2' == [m2]
+  assert' "sequence - m3" $ sequenceStr m3' == [m3]
+  assert' "sequence - m4" $ sequenceStr m4' == [m4]
+  assert' "sequence - m5" $ sequenceStr m5' == [m5]
+  assert' "sequence - m6" $ sequenceStr m6' == [m6]
+  assert' "sequence - m7" $ sequenceStr m7' == [m7]
+
+  log "Done"
diff --git a/tests/purs/passing/SingleInstanceFundep.purs b/tests/purs/passing/SingleInstanceFundep.purs
new file mode 100644
--- /dev/null
+++ b/tests/purs/passing/SingleInstanceFundep.purs
@@ -0,0 +1,21 @@
+module Main where
+
+import Prelude
+import Effect.Console (log)
+import Type.Proxy (Proxy(..))
+
+-- This class can only have a single instance due to the functional dependency
+class SingleInstanceFundep (r :: Row Type) | -> r where
+  unified :: Proxy r
+
+-- The row literal is valid in this instance head since it is fully determined
+instance SingleInstanceFundep ( x :: Unit ) where
+  unified = Proxy
+
+-- This should infer `test :: Proxy ( x :: Unit )` by committing to the instance
+test :: Proxy _
+test = unified
+
+main = do
+  let (Proxy :: Proxy ( x :: Unit )) = test
+  log "Done"
diff --git a/tests/purs/publish/basic-example/output/Main/docs.json b/tests/purs/publish/basic-example/output/Main/docs.json
--- a/tests/purs/publish/basic-example/output/Main/docs.json
+++ b/tests/purs/publish/basic-example/output/Main/docs.json
@@ -1,1 +1,1 @@
-{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[8,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[8,16]},"title":"Target"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Data","Newtype"],"Newtype"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Main"],"Target"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":null,"tag":"TypeWildcard"}],"tag":"TypeApp"}},"sourceSpan":{"end":[10,50],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[10,1]},"title":"newtypeTarget"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[8,31],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[8,1]},"title":"Target"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Main"],"Target"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[12,25],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[12,1]},"title":"greetingTarget"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["Effect"],"Effect"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Data","Unit"],"Unit"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[15,20],"name":"/home/jordan/Programming/Projects/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[15,1]},"title":"main"}],"name":"Main","reExports":[]}
+{"comments":null,"declarations":[{"children":[{"comments":null,"info":{"arguments":[{"annotation":[],"contents":[["Prim"],"String"],"tag":"TypeConstructor"}],"declType":"dataConstructor"},"sourceSpan":{"end":[8,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[8,16]},"title":"Target"},{"comments":null,"info":{"declType":"instance","dependencies":[],"type":{"annotation":[],"contents":[{"annotation":[],"contents":[{"annotation":[],"contents":[["Data","Newtype"],"Newtype"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Main"],"Target"],"tag":"TypeConstructor"}],"tag":"TypeApp"},{"annotation":[],"contents":null,"tag":"TypeWildcard"}],"tag":"TypeApp"}},"sourceSpan":{"end":[10,50],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[10,1]},"title":"newtypeTarget"}],"comments":null,"info":{"dataDeclType":"newtype","declType":"data","roles":[],"typeArguments":[]},"kind":null,"sourceSpan":{"end":[8,31],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[8,1]},"title":"Target"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[["Main"],"Target"],"tag":"TypeConstructor"}},"kind":null,"sourceSpan":{"end":[12,25],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[12,1]},"title":"greetingTarget"},{"children":[],"comments":null,"info":{"declType":"value","type":{"annotation":[],"contents":[{"annotation":[],"contents":[["Effect"],"Effect"],"tag":"TypeConstructor"},{"annotation":[],"contents":[["Data","Unit"],"Unit"],"tag":"TypeConstructor"}],"tag":"TypeApp"}},"kind":null,"sourceSpan":{"end":[15,20],"name":"/home/pure/PureFunctor/Haskell/purescript/tests/purs/publish/basic-example/src/Main.purs","start":[15,1]},"title":"main"}],"name":"Main","reExports":[]}
diff --git a/tests/purs/publish/basic-example/output/cache-db.json b/tests/purs/publish/basic-example/output/cache-db.json
--- a/tests/purs/publish/basic-example/output/cache-db.json
+++ b/tests/purs/publish/basic-example/output/cache-db.json
@@ -1,1 +1,1 @@
-{"Control.Applicative":{"../../../support/bower_components/purescript-prelude/src/Control/Applicative.purs":["2022-04-27T13:37:39Z","5889c8a23c34d2d9c7d1fe41df1512314055fafda79900099b37a76451fb6394dac06633caf5c206c432817a9c07b892b18c3b99d1013a298acc85a579aee2f1"]},"Control.Apply":{"../../../support/bower_components/purescript-prelude/src/Control/Apply.js":["2022-04-27T13:37:39Z","73ee829e5dfad80f1d5f957d0e52b1d069ea798919d608b4733cedda4736681ec26d7e33501428966bf213b8a344c1272f7658867780c7237baf90da4c9d5ad3"],"../../../support/bower_components/purescript-prelude/src/Control/Apply.purs":["2022-04-27T13:37:39Z","524e797c42f16dbc375aa2403a4867a5744116d9302bda790333251ccf88d773e079fb8c3af1f87eccdc0c0bbf682b932a48506ca5f51ef441832177fafd4eb0"]},"Control.Bind":{"../../../support/bower_components/purescript-prelude/src/Control/Bind.js":["2022-04-27T13:37:39Z","abbbecd9697ae2109a9b74f70bfce37c0589e0d99b10e090660e1c76a491744c84fd459c53172256c70cdaffde3f0dc1abe0464fa32b977cf71e789425ca8bfe"],"../../../support/bower_components/purescript-prelude/src/Control/Bind.purs":["2022-04-27T13:37:39Z","27f217ea2d5e4ab2745ad05b6d0aa36ee8809dc9d5c22162f722b2f003cf140bb18747f158daeca469a1083b7b054f9a6a9681d092598b3ea25cada7fe510d75"]},"Control.Category":{"../../../support/bower_components/purescript-prelude/src/Control/Category.purs":["2022-04-27T13:37:39Z","6431719d022f6d4230f338935381a7e116a18cdf80c67bdf76d87a7624518bc9fd1e4adfe45c8a59d77f07caf7c8e9faae741e99fada42455143c4fb924e7988"]},"Control.Monad":{"../../../support/bower_components/purescript-prelude/src/Control/Monad.purs":["2022-04-27T13:37:39Z","5d13918b1f360fb201125c334399566fdef398f1b44af0754cb261b6e514481b26a0d4ad892944d4a52d513c41a20702d9973be000d9e2436c4fb48940cc07ca"]},"Control.Semigroupoid":{"../../../support/bower_components/purescript-prelude/src/Control/Semigroupoid.purs":["2022-04-27T13:37:39Z","f5b1e9fdd81471d37f763b7fff8bd94f2111fd9ad6092bc925e409d5c69261860045230cde5c95ebbb3141acce54372bcf4d01c9b044fd59959822c9576135e8"]},"Data.Boolean":{"../../../support/bower_components/purescript-prelude/src/Data/Boolean.purs":["2022-04-27T13:37:39Z","aa81cf83948d1c45051dcfb835b0caef7a8ed8a39c58d8126f4efde1973880dbcd169d36bbe8c82a62586c386810bf0824f018674a93c606e43bc451fb6c3819"]},"Data.BooleanAlgebra":{"../../../support/bower_components/purescript-prelude/src/Data/BooleanAlgebra.purs":["2022-04-27T13:37:39Z","464f2df7f5bc3fc5e64cb0462c841f93fa2a609545e10f0adce637185e345aa45eed2a7e164ba648bb947168279c999ef8cd9f5dab9fce9af3b9329a8829b971"]},"Data.Bounded":{"../../../support/bower_components/purescript-prelude/src/Data/Bounded.js":["2022-04-27T13:37:39Z","8bfa62b2e886ce6d58793d840513c68cefc1fa0c4a15a5e6a0c0ee5d607fea425f8080365c0f3f421116c4362eba447617cd65a221ee1e4cc0a75610752d3b75"],"../../../support/bower_components/purescript-prelude/src/Data/Bounded.purs":["2022-04-27T13:37:39Z","36762aa05b71843e1d2f23cc64b1a17ea3acf91745de39e8723a04f3cc12f50c83e6a9b8a58c0463eaed0e93dfe3112e1f896130bab0660a5a009391f00ed468"]},"Data.Bounded.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Bounded/Generic.purs":["2022-04-27T13:37:39Z","15f4f3499dd9c2a1f37345357db2f131cc57e37a4ddfaa8497dabd3d123abd8b9670bdd3910b84b6c44c8b63bf1873af783adb1edc8455985f244b6ecbef733b"]},"Data.CommutativeRing":{"../../../support/bower_components/purescript-prelude/src/Data/CommutativeRing.purs":["2022-04-27T13:37:39Z","c8bf53bf06454a74ba3a605d100b59bb5ba9111dd20e073713422c080075555b653bcaddde078d55130e737de30ba336920a099a6016fd4158af88b1f430b631"]},"Data.DivisionRing":{"../../../support/bower_components/purescript-prelude/src/Data/DivisionRing.purs":["2022-04-27T13:37:39Z","1f3c74ecd87798ace30371f036ef1590f7e4dbc5be05f51162f9b3700d61c0befd6a5b53ace34626103e500043de3b67225de2c442841106f6d8960658355aae"]},"Data.Eq":{"../../../support/bower_components/purescript-prelude/src/Data/Eq.js":["2022-04-27T13:37:39Z","6718a356e77f3fe29c3f353f02fd94583b4edf5a0a0d7bdfdbcb046e7ef3440781aaa466ee88f12be6a72f274eb9c51d4d051673f4893fc408e9053bb8d84368"],"../../../support/bower_components/purescript-prelude/src/Data/Eq.purs":["2022-04-27T13:37:39Z","65598d7093548c9848e1c661bb778ebd402f09b4584570c09082d765997056b335bf0f05397cd788c44bb2f00b3bd2115cba2ed45033ade9ac40d91efd64301d"]},"Data.Eq.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Eq/Generic.purs":["2022-04-27T13:37:39Z","88d9841c3e55b1063721bc8ff168aa8b53cd3581a8c3ffee6ed71a96ba4d2d20b7b454cb0e7f13b2fa7a6bcaf4ca0dfc609ce624f5ad74eece1e13a93b0a121d"]},"Data.EuclideanRing":{"../../../support/bower_components/purescript-prelude/src/Data/EuclideanRing.js":["2022-04-27T13:37:39Z","9bf37abbb8d5c826e2152f62c99251e9cfeac8226ead81262527a2c544765336b6a0a8df731664d1b7d7804ad821ddfb0bd2c58d91d61fea6232d6adaeb6fc69"],"../../../support/bower_components/purescript-prelude/src/Data/EuclideanRing.purs":["2022-04-27T13:37:39Z","252c8162d273ea69e96619d760b48f7302ad048ed2bdd542695fbf0489948d24369b2bd40addd7fa505e810cf411727fe9fd57546a3011ebe1fa3c534beac414"]},"Data.Field":{"../../../support/bower_components/purescript-prelude/src/Data/Field.purs":["2022-04-27T13:37:39Z","21c8a682ad74b9389e1c538ca1dbc5cc4da34b13945a1bd11812631f8f56e723e65f9452eba5b43ea8209f88c57e8566529667673b6b78ade1a08350a28b04cc"]},"Data.Function":{"../../../support/bower_components/purescript-prelude/src/Data/Function.purs":["2022-04-27T13:37:39Z","42320940aa4cdbab54308acc9ad8eac48cb3facf1f695eeb32c8473bdf31e6d51e9d689bd256c833cedd3cf40882c484153f56e8582bfc1353cc0f3b7867aa0f"]},"Data.Functor":{"../../../support/bower_components/purescript-prelude/src/Data/Functor.js":["2022-04-27T13:37:39Z","889e7781cb01bcb3007c8400d844b250905a7cc893d0391a09c2f907c8993271b0daf081548206d4c5a3948fdc7a51df5a99c6fe38c61a90ccdcb38f22886ae7"],"../../../support/bower_components/purescript-prelude/src/Data/Functor.purs":["2022-04-27T13:37:39Z","077d9d6d3e754807e5200b970988daf12894942995bb7f8698c0e0a2d08b64842dc5257efe088c045d7d0a6de2a10cb6c58b976b26243f66f69d0fa9791f60e7"]},"Data.Generic.Rep":{"../../../support/bower_components/purescript-prelude/src/Data/Generic/Rep.purs":["2022-04-27T13:37:39Z","69c6cac0ae8035b7a0bad28c1fb8c0c0d99bc93087392f5dbebac6a30bca3b5fa352741f93f432b7aa4c617e1f23d59939a69c716775e84375e112b4bb9175d1"]},"Data.HeytingAlgebra":{"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra.js":["2022-04-27T13:37:39Z","3603479b96cd22a9b312ef922b95d5b342ecd8d4b1b8984a15fcfa64b92ec66128f14fdc795c2c525c9b6e6912934f2ea542df9f30b3caac3bbb085ba3326265"],"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra.purs":["2022-04-27T13:37:39Z","d8942636d4f1804c94eb7527b48f48f500843d34e2ec0b45515f4d5c836ce4437806feb4a603735f1a799243f244a72c6fda218ffe5d58f7f0cbbcbfadb01bbd"]},"Data.HeytingAlgebra.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra/Generic.purs":["2022-04-27T13:37:39Z","ea49a37bf16af73cb930d0eb573bca8cc8e63de0a796c504f531f05d503976a59f464fa5a039a2ae9b486c9ba70857008bfb06acaaeaad6ee0f9f429355043e2"]},"Data.Monoid":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid.purs":["2022-04-27T13:37:39Z","172ecdf1da579ac35b44cb9d87424b7bb45f27b2f49a0e51be34cc1d2863a15929436321b8ed46059601b3ba171053b4129067066be0596da42607d697d8d484"]},"Data.Monoid.Additive":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Additive.purs":["2022-04-27T13:37:39Z","514e26851127fb9b52c618a36f17758513d9a7ea6724866b208e2c2447c3c3b3a9a18218b715b765e5e1e00908e2ebc0d9f2e67171ab3e46543a01508b54de67"]},"Data.Monoid.Conj":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Conj.purs":["2022-04-27T13:37:39Z","441eb08d322aa39654f68fe39676ba5fe470252adc4da087c590245ff7b0b624885c57ade6e66f24485862873767198678a219afbd7c2fc68f2ca59978d7d9c2"]},"Data.Monoid.Disj":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Disj.purs":["2022-04-27T13:37:39Z","f38cea70c5a7216b6b17c796dfbc8b08d9f05bed22d81d3784322f9f06f127435b4c9009a2027c24efc998c781796b9007bc70bc3bd1eee935b1a9695077bc7a"]},"Data.Monoid.Dual":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Dual.purs":["2022-04-27T13:37:39Z","54058218c4c5323d42e95d54a1c64b9e2ded8afdaeef2f846ef123bd4fd6772551e2158a6a9802ca327bbc4fb995f4fd5d416fd59c7a6efc8f8fe9bc5e7dc709"]},"Data.Monoid.Endo":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Endo.purs":["2022-04-27T13:37:39Z","543f16c8df42353334deddd7e25a58340aaa3f4a902a997d6b08e3128ca0afb82b3ac720e8ca8d4475cfc063906df1439afd3f2e22f7684aeb9ee0bc2992e774"]},"Data.Monoid.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Generic.purs":["2022-04-27T13:37:39Z","9e2ef0cf0469c1e798f8767cb472ee1b0103dfd6b08ed0a777c89d5043358b70cf14c2784ea59f05795f648daf80e11b2150fa89a05bc8c0afa6dafeb2fc09ac"]},"Data.Monoid.Multiplicative":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Multiplicative.purs":["2022-04-27T13:37:39Z","f0c40f939ed3a3f00712fc7485926733668101c201e5d57e19d72ce6be84455b7b2d7360d747154a9d071df9b72e4e5ad2ac2a36db093a1b702fed4e6f4de9e3"]},"Data.NaturalTransformation":{"../../../support/bower_components/purescript-prelude/src/Data/NaturalTransformation.purs":["2022-04-27T13:37:39Z","6b9fc42ec524a517d464dea99867c64345cdbcbada4260a772373a956961ad1c9a4a3a4f8ed4a0c7c7f3e36120068954141841c5d6bdc4e5898ea06435104bb7"]},"Data.Newtype":{"../../../support/bower_components/purescript-newtype/src/Data/Newtype.purs":["2022-04-27T15:04:33Z","4289a67b60c9760f41b6fb86b71bb0bb2c576b279ae447be7fe4c3ff408ea4705ca17522647bcd8da582ef646a4abfd53fc3310d4d9d6c68816a8ccd480140be"]},"Data.Ord":{"../../../support/bower_components/purescript-prelude/src/Data/Ord.js":["2022-04-27T13:37:39Z","d3f620d4e07a9ce41745d2df0c43701dc41726e4be601b790bb054089ca52d97380299b90fe88f166e2195d76c4cbe195d941e8619fd2d14242a6a347881b1a9"],"../../../support/bower_components/purescript-prelude/src/Data/Ord.purs":["2022-04-27T13:37:39Z","f622298f91432fabf4a9b79f8ffc449a50a074d991ac8bafe19458bb8befc9377865359de1d612f156f3a3bc4b024f0eca3c758f6ce8dc1328e5a519de673f31"]},"Data.Ord.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Ord/Generic.purs":["2022-04-27T13:37:39Z","d566cfa79ec03e335f632d3edc3b913081583188d8496897c1b0904c1895525caeb5b0464b76d40ae5ef79e5c7b516ad061c1d98aa6e1c649f555be4c839087e"]},"Data.Ordering":{"../../../support/bower_components/purescript-prelude/src/Data/Ordering.purs":["2022-04-27T13:37:39Z","321b8de9b25c2616a3dbc6bff2e2def1cf7592ad54e575bd2b62d440d5dd88d7b5332f6c68fc010424e36ac13d61b5bcaadcf619ff940c667360b2c102f6e2af"]},"Data.Reflectable":{"../../../support/bower_components/purescript-prelude/src/Data/Reflectable.js":["2022-04-27T13:37:39Z","1bbaef3b7bb472cbc13eb30d9a75f2d580d5950fe692a3e137322558a651d0352f8a7499538028404a611afecde17f551b7cbc4030bdaf0b50e6828362cf29bd"],"../../../support/bower_components/purescript-prelude/src/Data/Reflectable.purs":["2022-04-27T13:37:39Z","02beca227031091fd31673ff64153c2f84ba22c61f362acc88411643233fe91d8cabf6206319785f7b910d8dff7c81528ca7e05048e284bfc720e71f804f7a6c"]},"Data.Ring":{"../../../support/bower_components/purescript-prelude/src/Data/Ring.js":["2022-04-27T13:37:39Z","bce8767b39bf1d9af8182f80f91e376db07ae8912b991fcea6eaf37900f91c6b6ede6fb874c40ff5b3d40fc6a893468d0f0cb31106f6188ca52514ae0a081da6"],"../../../support/bower_components/purescript-prelude/src/Data/Ring.purs":["2022-04-27T13:37:39Z","4e727f1f786ced8ce8202805713a9a2810c6ef9522694535c219ce22f66e032ca374163c82db137dd7d2ded6ae4dc2786ee8b6efd1df810d5cbda9c7e2c0832e"]},"Data.Ring.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Ring/Generic.purs":["2022-04-27T13:37:39Z","8c94b1a5765b99950600e690e01e3da65cd7e43fe78f651f8531c45d41775572af47e62f21705857c82ae52251626c34f0f41180ee0563115f749c7bc0459324"]},"Data.Semigroup":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup.js":["2022-04-27T13:37:39Z","fb416511575b93baf1081317aba42e97da52fdb724c07110a05c360e5254528f54715a47fa22ed4298bbdfb62c8641c8ea5ef92af9a259d51164cf541026fabc"],"../../../support/bower_components/purescript-prelude/src/Data/Semigroup.purs":["2022-04-27T13:37:39Z","43c3fbd4ab0a7a5346bdc69ce26ad3e6143f1f0e92bf8e7601af43d2ad68cfe4080411029ba3a9f29592f75e139a8fb923e67237b8e1cee3024c54b32ccf0b5d"]},"Data.Semigroup.First":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/First.purs":["2022-04-27T13:37:39Z","8ff357056284af9050954e7695babcc76f5f632019b66f635a49502170508a37b2cb20a2e863f022bf077726480d2cc32951fb910c80559806e50830f25e884e"]},"Data.Semigroup.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/Generic.purs":["2022-04-27T13:37:39Z","8c07803971e03a3c3d4a617198eae5a3e825c411fd17af68eee57571717a2301eaf5ec5bd34bfddf14da1f1c40d780ab9538d02f22d1d19117135388c848ca89"]},"Data.Semigroup.Last":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/Last.purs":["2022-04-27T13:37:39Z","75b3660341f9c0570031d2304c83eb8592098e2d96577c030ae969b3b958d00b21234c2c836377e7b338e4323fa4aa0c97a4a8abb7ed49e2741907a411eb0b08"]},"Data.Semiring":{"../../../support/bower_components/purescript-prelude/src/Data/Semiring.js":["2022-04-27T13:37:39Z","71c1f69848adaf5667acc7668bb53b42a14dd64f559e72d88ae879f123aa9d5892debb1758067b8c48bfcdbbd7392e2e9ea0e5d18603ab62dbdde5032662cf33"],"../../../support/bower_components/purescript-prelude/src/Data/Semiring.purs":["2022-04-27T13:37:39Z","70fe8b0c9eb461a6058b6c89ad182fb99d4e930f158b015a386ee67ece2445b5e7aba5e539dd7377822de1b045b80d1e439f191a2274c6e95c7fb3dba535d8c0"]},"Data.Semiring.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Semiring/Generic.purs":["2022-04-27T13:37:39Z","e1aeb61208e3b96999f07cc41307d50fa8025c2f688e9dc24d7286933a11cc1ec253375e10e25fb578801bcda7b18b7342bb13275f4ca72478a2aff9ea872799"]},"Data.Show":{"../../../support/bower_components/purescript-prelude/src/Data/Show.js":["2022-04-27T13:37:39Z","2a936ee3c9835b353e0e23d37709f80dbf675fd6a3761f48a61c15db808b36f50cb4c758f7710ce7bf7e72389a9e51b1cd605ea793a30565de0f02a5866a91c4"],"../../../support/bower_components/purescript-prelude/src/Data/Show.purs":["2022-04-27T13:37:39Z","e846644987565d11a205b5f5c1ba8349a057c9710c88a461ebf2ab0bfe2f83a4f1de8c1a5653d33eca13d00fd65a086caf28ea0498c974a1fc3e7619a719a1b8"]},"Data.Show.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Show/Generic.js":["2022-04-27T13:37:39Z","f8b9a3c651ceb9e8f2ee15ae532ecd371794b4e9f3b14eb0508656c1ae853654d7e3d3c719a9a98f0dcbc81df3b03266c05d3bc01c9b62d6d8ce29d4794e4b1b"],"../../../support/bower_components/purescript-prelude/src/Data/Show/Generic.purs":["2022-04-27T13:37:39Z","37b5a1168cd88f5f6f2d2a584cfe2c69e326b9f3e62291ec607c6e4a12da144450088fe65e95cbd04204d9c616a04696b5b3d0d7e444e8628b4a1eb3597c534d"]},"Data.Symbol":{"../../../support/bower_components/purescript-prelude/src/Data/Symbol.js":["2022-04-27T13:37:39Z","c980adfe8e297bfe8e257903de3ac13f5675c6f52ed95e8c2786fcacc52adde10b5de56c9432859c3c7c8f51d1866f2e8d4a961d60e1bff656def39e3b3cdcf7"],"../../../support/bower_components/purescript-prelude/src/Data/Symbol.purs":["2022-04-27T13:37:39Z","579409ca0036164a1a0534b266cc1c90de7b020ecea470cdedf0a97cc34ae1f25ab441df9789798dc30f6a4c8f6c6368c79dc5523d9de336e57dcc6325127cb2"]},"Data.Unit":{"../../../support/bower_components/purescript-prelude/src/Data/Unit.js":["2022-04-27T13:37:39Z","d7185d75aa1f2fe353e4e200ab4181472e354d6295cb2e6587a56636b1bc733be77b2f5616b20275fe7be0138a6442b2979864b1b234a813f8d9237baa4cd5f3"],"../../../support/bower_components/purescript-prelude/src/Data/Unit.purs":["2022-04-27T13:37:39Z","a4bfca3ddacfc9d1e09019819fd94325c0fe756cb6d7e35c07a8bb6bb6c8bc6cca55a22b72f641b9fac6e5c09cae29cec932c847bdb34298310a161ee3fcfc92"]},"Data.Void":{"../../../support/bower_components/purescript-prelude/src/Data/Void.purs":["2022-04-27T13:37:39Z","a9d41b27b3dc34c74df497c4563d9c8fbe6b04ee1ee4cc32e18c3649972c84a5d330087cd3732b2cbbda204558fa79a8eea2bbba7e64916e45c49745af27d739"]},"Effect":{"../../../support/bower_components/purescript-effect/src/Effect.js":["2022-04-27T14:04:24Z","9683b917c04f50b5b8a41d8294b101d7787cd0a742840e6f05ec143f881bfb51807a2efd29a9296def2676e7c1860352f3d89f78f9205567575c5040f790da32"],"../../../support/bower_components/purescript-effect/src/Effect.purs":["2022-04-27T14:04:24Z","25ea461900466a6aade8a56c20921d46eb037a71efb12c4265dd378e760843e5793efb9f7cb47322511459136d9d4ecd6d09e5a089a432d96ef4af4530ad8e8d"]},"Effect.Class":{"../../../support/bower_components/purescript-effect/src/Effect/Class.purs":["2022-04-27T14:04:24Z","47e0114539e25826ffba341faf99133ed2499027f0955fa606d563d3504c6b41dc9d425dfa619c0c83b5fc2ab8dbb3c1bf2166b5980c5674fb93560c9b80d585"]},"Effect.Class.Console":{"../../../support/bower_components/purescript-console/src/Effect/Class/Console.purs":["2022-04-27T14:11:24Z","5a3a1a7efb4ca9d61673d954d5bed9be6eec0b512fcdffdbcca411b0fe10353da1ec9ac9e32d19f6ffe3ccb358a177cc6238064ae7dee8dfce2363ec26600edc"]},"Effect.Console":{"../../../support/bower_components/purescript-console/src/Effect/Console.js":["2022-04-27T14:11:24Z","37d5914c1c03387fb61991fa0c7273560b38a9cca1ab22a5a1071f58fb5e3cc41952c87e404f22a928e674c04fce0fa18d469b2481d6078645d20650280c9a84"],"../../../support/bower_components/purescript-console/src/Effect/Console.purs":["2022-04-27T14:11:24Z","71c92750574fc7e669d3e0a7d0f40101b91836e69275074eaf3b534fe5f68a6f3b4ebc1dc1f950f89a381996f8bdca297eac522893733bc0fd5ef2ce790af8c7"]},"Effect.Uncurried":{"../../../support/bower_components/purescript-effect/src/Effect/Uncurried.js":["2022-04-27T14:04:24Z","4c6c5db78b72ff3b84623d894b05dd916cc0732dc08d1fd45d8b0768983fdd7377b7299add3c70475459d0e190af99e2176e4c17a8cfbf295c675456bd5ba7d2"],"../../../support/bower_components/purescript-effect/src/Effect/Uncurried.purs":["2022-04-27T14:04:24Z","a948cb1cab11f5019fe20dd697b5c6e248c3b29c7ab332c2cb9d792cfcb58021a77c0f4f71e1c8d7c0b3b9cb18bd1497a0d2f40680926390f3303ecb1fe25beb"]},"Effect.Unsafe":{"../../../support/bower_components/purescript-effect/src/Effect/Unsafe.js":["2022-04-27T14:04:24Z","e66a1117e55534d61b7cd8e1859b54ef97446e0374116867383d2027bd85b73e510cbd1e4e74067b740fffb66c11e243af8d0976b2dc225d9865d882486cccdd"],"../../../support/bower_components/purescript-effect/src/Effect/Unsafe.purs":["2022-04-27T14:04:24Z","c112c559df0f177472e96655b09165d5535f68caddc2b419b4cdfe796af19b962b0659cb609a2ce501002da7de34e66592b5491ebe6f538824c2db8a1e800ea7"]},"Main":{"src/Main.purs":["2021-10-25T20:49:21.464382127Z","55bdd6dd11fb1679cb11793dd2996de21972f7aa53826557273bd649004f5907ff8cf6dff840718a12084c421529c9da7d70f698689d3923ab4ae3d608591c66"]},"Prelude":{"../../../support/bower_components/purescript-prelude/src/Prelude.purs":["2022-04-27T13:37:39Z","c67b6a882790c17476eb477da2cfc71dc4c26f297e7b4581b5ae9b0d08040ea7c7b55ed3afb3e824806e573ea4dd307eaa7cb49cfb2a756973b226ee1023e6fc"]},"Record.Unsafe":{"../../../support/bower_components/purescript-prelude/src/Record/Unsafe.js":["2022-04-27T13:37:39Z","667d613a0e1265a710e98c9f6e64ff791b9e9b7227cdf699c3a25724077c02e42726c807c0387ca4484454fd853d5b41522bf2e048887f22a894413ef80cbb92"],"../../../support/bower_components/purescript-prelude/src/Record/Unsafe.purs":["2022-04-27T13:37:39Z","af8a7c83127f5e61853ad0e572be799c04e321562a375d51ab133706ac6a6777e169b057f01a709ad7aae2d8c7a5ae8daa28eae8793c4fe92e2e8f0cfaecf870"]},"Safe.Coerce":{"../../../support/bower_components/purescript-safe-coerce/src/Safe/Coerce.purs":["2022-04-27T14:56:52Z","595abade13e21ed7893a92b338d9e7c7bf56e9067d51ca25c387d6d93a1c5542925f062e282602e89476a45501645c76dbd57eac31cc4e5c1cf341e2902beb89"]},"Type.Proxy":{"../../../support/bower_components/purescript-prelude/src/Type/Proxy.purs":["2022-04-27T13:37:39Z","333d0ae90b05098eada860ad476ed9e1eacd67d969dc1573c74375610cf8de22e85a358a7783a0a461d7ffa6fe322d8c3e90696be02555a02793ac99aba687f2"]},"Unsafe.Coerce":{"../../../support/bower_components/purescript-unsafe-coerce/src/Unsafe/Coerce.js":["2022-04-27T14:15:44Z","031c3187f7ce65110a359260041309506e1ff39a97b6eb22c9a8f2e5c14b35db87d509bb5929f245c5d80df6ccd6dadf83579ebe4ac46650acdfa34a493cfc0d"],"../../../support/bower_components/purescript-unsafe-coerce/src/Unsafe/Coerce.purs":["2022-04-27T14:15:44Z","04b214d9cbbf0c438bb2af4b25f8db5d04f247059241982f718c6d83322c3180f0eced0eb5c410860dcdb35650e9129a1cffe87f7279308cc4cf6c6570bba74f"]}}
+{"Control.Applicative":{"../../../support/bower_components/purescript-prelude/src/Control/Applicative.purs":["2022-04-27T13:37:39Z","5889c8a23c34d2d9c7d1fe41df1512314055fafda79900099b37a76451fb6394dac06633caf5c206c432817a9c07b892b18c3b99d1013a298acc85a579aee2f1"]},"Control.Apply":{"../../../support/bower_components/purescript-prelude/src/Control/Apply.js":["2022-04-27T13:37:39Z","73ee829e5dfad80f1d5f957d0e52b1d069ea798919d608b4733cedda4736681ec26d7e33501428966bf213b8a344c1272f7658867780c7237baf90da4c9d5ad3"],"../../../support/bower_components/purescript-prelude/src/Control/Apply.purs":["2022-04-27T13:37:39Z","524e797c42f16dbc375aa2403a4867a5744116d9302bda790333251ccf88d773e079fb8c3af1f87eccdc0c0bbf682b932a48506ca5f51ef441832177fafd4eb0"]},"Control.Bind":{"../../../support/bower_components/purescript-prelude/src/Control/Bind.js":["2022-04-27T13:37:39Z","abbbecd9697ae2109a9b74f70bfce37c0589e0d99b10e090660e1c76a491744c84fd459c53172256c70cdaffde3f0dc1abe0464fa32b977cf71e789425ca8bfe"],"../../../support/bower_components/purescript-prelude/src/Control/Bind.purs":["2022-04-27T13:37:39Z","27f217ea2d5e4ab2745ad05b6d0aa36ee8809dc9d5c22162f722b2f003cf140bb18747f158daeca469a1083b7b054f9a6a9681d092598b3ea25cada7fe510d75"]},"Control.Category":{"../../../support/bower_components/purescript-prelude/src/Control/Category.purs":["2022-04-27T13:37:39Z","6431719d022f6d4230f338935381a7e116a18cdf80c67bdf76d87a7624518bc9fd1e4adfe45c8a59d77f07caf7c8e9faae741e99fada42455143c4fb924e7988"]},"Control.Monad":{"../../../support/bower_components/purescript-prelude/src/Control/Monad.purs":["2022-04-27T13:37:39Z","5d13918b1f360fb201125c334399566fdef398f1b44af0754cb261b6e514481b26a0d4ad892944d4a52d513c41a20702d9973be000d9e2436c4fb48940cc07ca"]},"Control.Semigroupoid":{"../../../support/bower_components/purescript-prelude/src/Control/Semigroupoid.purs":["2022-04-27T13:37:39Z","f5b1e9fdd81471d37f763b7fff8bd94f2111fd9ad6092bc925e409d5c69261860045230cde5c95ebbb3141acce54372bcf4d01c9b044fd59959822c9576135e8"]},"Data.Boolean":{"../../../support/bower_components/purescript-prelude/src/Data/Boolean.purs":["2022-04-27T13:37:39Z","aa81cf83948d1c45051dcfb835b0caef7a8ed8a39c58d8126f4efde1973880dbcd169d36bbe8c82a62586c386810bf0824f018674a93c606e43bc451fb6c3819"]},"Data.BooleanAlgebra":{"../../../support/bower_components/purescript-prelude/src/Data/BooleanAlgebra.purs":["2022-04-27T13:37:39Z","464f2df7f5bc3fc5e64cb0462c841f93fa2a609545e10f0adce637185e345aa45eed2a7e164ba648bb947168279c999ef8cd9f5dab9fce9af3b9329a8829b971"]},"Data.Bounded":{"../../../support/bower_components/purescript-prelude/src/Data/Bounded.js":["2022-04-27T13:37:39Z","8bfa62b2e886ce6d58793d840513c68cefc1fa0c4a15a5e6a0c0ee5d607fea425f8080365c0f3f421116c4362eba447617cd65a221ee1e4cc0a75610752d3b75"],"../../../support/bower_components/purescript-prelude/src/Data/Bounded.purs":["2022-04-27T13:37:39Z","36762aa05b71843e1d2f23cc64b1a17ea3acf91745de39e8723a04f3cc12f50c83e6a9b8a58c0463eaed0e93dfe3112e1f896130bab0660a5a009391f00ed468"]},"Data.Bounded.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Bounded/Generic.purs":["2022-04-27T13:37:39Z","15f4f3499dd9c2a1f37345357db2f131cc57e37a4ddfaa8497dabd3d123abd8b9670bdd3910b84b6c44c8b63bf1873af783adb1edc8455985f244b6ecbef733b"]},"Data.CommutativeRing":{"../../../support/bower_components/purescript-prelude/src/Data/CommutativeRing.purs":["2022-04-27T13:37:39Z","c8bf53bf06454a74ba3a605d100b59bb5ba9111dd20e073713422c080075555b653bcaddde078d55130e737de30ba336920a099a6016fd4158af88b1f430b631"]},"Data.DivisionRing":{"../../../support/bower_components/purescript-prelude/src/Data/DivisionRing.purs":["2022-04-27T13:37:39Z","1f3c74ecd87798ace30371f036ef1590f7e4dbc5be05f51162f9b3700d61c0befd6a5b53ace34626103e500043de3b67225de2c442841106f6d8960658355aae"]},"Data.Eq":{"../../../support/bower_components/purescript-prelude/src/Data/Eq.js":["2022-04-27T13:37:39Z","6718a356e77f3fe29c3f353f02fd94583b4edf5a0a0d7bdfdbcb046e7ef3440781aaa466ee88f12be6a72f274eb9c51d4d051673f4893fc408e9053bb8d84368"],"../../../support/bower_components/purescript-prelude/src/Data/Eq.purs":["2022-04-27T13:37:39Z","65598d7093548c9848e1c661bb778ebd402f09b4584570c09082d765997056b335bf0f05397cd788c44bb2f00b3bd2115cba2ed45033ade9ac40d91efd64301d"]},"Data.Eq.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Eq/Generic.purs":["2022-04-27T13:37:39Z","88d9841c3e55b1063721bc8ff168aa8b53cd3581a8c3ffee6ed71a96ba4d2d20b7b454cb0e7f13b2fa7a6bcaf4ca0dfc609ce624f5ad74eece1e13a93b0a121d"]},"Data.EuclideanRing":{"../../../support/bower_components/purescript-prelude/src/Data/EuclideanRing.js":["2022-04-27T13:37:39Z","9bf37abbb8d5c826e2152f62c99251e9cfeac8226ead81262527a2c544765336b6a0a8df731664d1b7d7804ad821ddfb0bd2c58d91d61fea6232d6adaeb6fc69"],"../../../support/bower_components/purescript-prelude/src/Data/EuclideanRing.purs":["2022-04-27T13:37:39Z","252c8162d273ea69e96619d760b48f7302ad048ed2bdd542695fbf0489948d24369b2bd40addd7fa505e810cf411727fe9fd57546a3011ebe1fa3c534beac414"]},"Data.Field":{"../../../support/bower_components/purescript-prelude/src/Data/Field.purs":["2022-04-27T13:37:39Z","21c8a682ad74b9389e1c538ca1dbc5cc4da34b13945a1bd11812631f8f56e723e65f9452eba5b43ea8209f88c57e8566529667673b6b78ade1a08350a28b04cc"]},"Data.Function":{"../../../support/bower_components/purescript-prelude/src/Data/Function.purs":["2022-04-27T13:37:39Z","42320940aa4cdbab54308acc9ad8eac48cb3facf1f695eeb32c8473bdf31e6d51e9d689bd256c833cedd3cf40882c484153f56e8582bfc1353cc0f3b7867aa0f"]},"Data.Functor":{"../../../support/bower_components/purescript-prelude/src/Data/Functor.js":["2022-04-27T13:37:39Z","889e7781cb01bcb3007c8400d844b250905a7cc893d0391a09c2f907c8993271b0daf081548206d4c5a3948fdc7a51df5a99c6fe38c61a90ccdcb38f22886ae7"],"../../../support/bower_components/purescript-prelude/src/Data/Functor.purs":["2022-04-27T13:37:39Z","077d9d6d3e754807e5200b970988daf12894942995bb7f8698c0e0a2d08b64842dc5257efe088c045d7d0a6de2a10cb6c58b976b26243f66f69d0fa9791f60e7"]},"Data.Generic.Rep":{"../../../support/bower_components/purescript-prelude/src/Data/Generic/Rep.purs":["2022-04-27T13:37:39Z","69c6cac0ae8035b7a0bad28c1fb8c0c0d99bc93087392f5dbebac6a30bca3b5fa352741f93f432b7aa4c617e1f23d59939a69c716775e84375e112b4bb9175d1"]},"Data.HeytingAlgebra":{"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra.js":["2022-04-27T13:37:39Z","3603479b96cd22a9b312ef922b95d5b342ecd8d4b1b8984a15fcfa64b92ec66128f14fdc795c2c525c9b6e6912934f2ea542df9f30b3caac3bbb085ba3326265"],"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra.purs":["2022-04-27T13:37:39Z","d8942636d4f1804c94eb7527b48f48f500843d34e2ec0b45515f4d5c836ce4437806feb4a603735f1a799243f244a72c6fda218ffe5d58f7f0cbbcbfadb01bbd"]},"Data.HeytingAlgebra.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/HeytingAlgebra/Generic.purs":["2022-04-27T13:37:39Z","ea49a37bf16af73cb930d0eb573bca8cc8e63de0a796c504f531f05d503976a59f464fa5a039a2ae9b486c9ba70857008bfb06acaaeaad6ee0f9f429355043e2"]},"Data.Monoid":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid.purs":["2022-04-27T13:37:39Z","172ecdf1da579ac35b44cb9d87424b7bb45f27b2f49a0e51be34cc1d2863a15929436321b8ed46059601b3ba171053b4129067066be0596da42607d697d8d484"]},"Data.Monoid.Additive":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Additive.purs":["2022-04-27T13:37:39Z","514e26851127fb9b52c618a36f17758513d9a7ea6724866b208e2c2447c3c3b3a9a18218b715b765e5e1e00908e2ebc0d9f2e67171ab3e46543a01508b54de67"]},"Data.Monoid.Conj":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Conj.purs":["2022-04-27T13:37:39Z","441eb08d322aa39654f68fe39676ba5fe470252adc4da087c590245ff7b0b624885c57ade6e66f24485862873767198678a219afbd7c2fc68f2ca59978d7d9c2"]},"Data.Monoid.Disj":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Disj.purs":["2022-04-27T13:37:39Z","f38cea70c5a7216b6b17c796dfbc8b08d9f05bed22d81d3784322f9f06f127435b4c9009a2027c24efc998c781796b9007bc70bc3bd1eee935b1a9695077bc7a"]},"Data.Monoid.Dual":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Dual.purs":["2022-04-27T13:37:39Z","54058218c4c5323d42e95d54a1c64b9e2ded8afdaeef2f846ef123bd4fd6772551e2158a6a9802ca327bbc4fb995f4fd5d416fd59c7a6efc8f8fe9bc5e7dc709"]},"Data.Monoid.Endo":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Endo.purs":["2022-04-27T13:37:39Z","543f16c8df42353334deddd7e25a58340aaa3f4a902a997d6b08e3128ca0afb82b3ac720e8ca8d4475cfc063906df1439afd3f2e22f7684aeb9ee0bc2992e774"]},"Data.Monoid.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Generic.purs":["2022-04-27T13:37:39Z","9e2ef0cf0469c1e798f8767cb472ee1b0103dfd6b08ed0a777c89d5043358b70cf14c2784ea59f05795f648daf80e11b2150fa89a05bc8c0afa6dafeb2fc09ac"]},"Data.Monoid.Multiplicative":{"../../../support/bower_components/purescript-prelude/src/Data/Monoid/Multiplicative.purs":["2022-04-27T13:37:39Z","f0c40f939ed3a3f00712fc7485926733668101c201e5d57e19d72ce6be84455b7b2d7360d747154a9d071df9b72e4e5ad2ac2a36db093a1b702fed4e6f4de9e3"]},"Data.NaturalTransformation":{"../../../support/bower_components/purescript-prelude/src/Data/NaturalTransformation.purs":["2022-04-27T13:37:39Z","6b9fc42ec524a517d464dea99867c64345cdbcbada4260a772373a956961ad1c9a4a3a4f8ed4a0c7c7f3e36120068954141841c5d6bdc4e5898ea06435104bb7"]},"Data.Newtype":{"../../../support/bower_components/purescript-newtype/src/Data/Newtype.purs":["2022-04-27T15:04:33Z","4289a67b60c9760f41b6fb86b71bb0bb2c576b279ae447be7fe4c3ff408ea4705ca17522647bcd8da582ef646a4abfd53fc3310d4d9d6c68816a8ccd480140be"]},"Data.Ord":{"../../../support/bower_components/purescript-prelude/src/Data/Ord.js":["2022-04-27T13:37:39Z","d3f620d4e07a9ce41745d2df0c43701dc41726e4be601b790bb054089ca52d97380299b90fe88f166e2195d76c4cbe195d941e8619fd2d14242a6a347881b1a9"],"../../../support/bower_components/purescript-prelude/src/Data/Ord.purs":["2022-04-27T13:37:39Z","f622298f91432fabf4a9b79f8ffc449a50a074d991ac8bafe19458bb8befc9377865359de1d612f156f3a3bc4b024f0eca3c758f6ce8dc1328e5a519de673f31"]},"Data.Ord.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Ord/Generic.purs":["2022-04-27T13:37:39Z","d566cfa79ec03e335f632d3edc3b913081583188d8496897c1b0904c1895525caeb5b0464b76d40ae5ef79e5c7b516ad061c1d98aa6e1c649f555be4c839087e"]},"Data.Ordering":{"../../../support/bower_components/purescript-prelude/src/Data/Ordering.purs":["2022-04-27T13:37:39Z","321b8de9b25c2616a3dbc6bff2e2def1cf7592ad54e575bd2b62d440d5dd88d7b5332f6c68fc010424e36ac13d61b5bcaadcf619ff940c667360b2c102f6e2af"]},"Data.Reflectable":{"../../../support/bower_components/purescript-prelude/src/Data/Reflectable.js":["2022-04-27T13:37:39Z","1bbaef3b7bb472cbc13eb30d9a75f2d580d5950fe692a3e137322558a651d0352f8a7499538028404a611afecde17f551b7cbc4030bdaf0b50e6828362cf29bd"],"../../../support/bower_components/purescript-prelude/src/Data/Reflectable.purs":["2022-04-27T13:37:39Z","02beca227031091fd31673ff64153c2f84ba22c61f362acc88411643233fe91d8cabf6206319785f7b910d8dff7c81528ca7e05048e284bfc720e71f804f7a6c"]},"Data.Ring":{"../../../support/bower_components/purescript-prelude/src/Data/Ring.js":["2022-04-27T13:37:39Z","bce8767b39bf1d9af8182f80f91e376db07ae8912b991fcea6eaf37900f91c6b6ede6fb874c40ff5b3d40fc6a893468d0f0cb31106f6188ca52514ae0a081da6"],"../../../support/bower_components/purescript-prelude/src/Data/Ring.purs":["2022-04-27T13:37:39Z","4e727f1f786ced8ce8202805713a9a2810c6ef9522694535c219ce22f66e032ca374163c82db137dd7d2ded6ae4dc2786ee8b6efd1df810d5cbda9c7e2c0832e"]},"Data.Ring.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Ring/Generic.purs":["2022-04-27T13:37:39Z","8c94b1a5765b99950600e690e01e3da65cd7e43fe78f651f8531c45d41775572af47e62f21705857c82ae52251626c34f0f41180ee0563115f749c7bc0459324"]},"Data.Semigroup":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup.js":["2022-04-27T13:37:39Z","fb416511575b93baf1081317aba42e97da52fdb724c07110a05c360e5254528f54715a47fa22ed4298bbdfb62c8641c8ea5ef92af9a259d51164cf541026fabc"],"../../../support/bower_components/purescript-prelude/src/Data/Semigroup.purs":["2022-04-27T13:37:39Z","43c3fbd4ab0a7a5346bdc69ce26ad3e6143f1f0e92bf8e7601af43d2ad68cfe4080411029ba3a9f29592f75e139a8fb923e67237b8e1cee3024c54b32ccf0b5d"]},"Data.Semigroup.First":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/First.purs":["2022-04-27T13:37:39Z","8ff357056284af9050954e7695babcc76f5f632019b66f635a49502170508a37b2cb20a2e863f022bf077726480d2cc32951fb910c80559806e50830f25e884e"]},"Data.Semigroup.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/Generic.purs":["2022-04-27T13:37:39Z","8c07803971e03a3c3d4a617198eae5a3e825c411fd17af68eee57571717a2301eaf5ec5bd34bfddf14da1f1c40d780ab9538d02f22d1d19117135388c848ca89"]},"Data.Semigroup.Last":{"../../../support/bower_components/purescript-prelude/src/Data/Semigroup/Last.purs":["2022-04-27T13:37:39Z","75b3660341f9c0570031d2304c83eb8592098e2d96577c030ae969b3b958d00b21234c2c836377e7b338e4323fa4aa0c97a4a8abb7ed49e2741907a411eb0b08"]},"Data.Semiring":{"../../../support/bower_components/purescript-prelude/src/Data/Semiring.js":["2022-04-27T13:37:39Z","71c1f69848adaf5667acc7668bb53b42a14dd64f559e72d88ae879f123aa9d5892debb1758067b8c48bfcdbbd7392e2e9ea0e5d18603ab62dbdde5032662cf33"],"../../../support/bower_components/purescript-prelude/src/Data/Semiring.purs":["2022-04-27T13:37:39Z","70fe8b0c9eb461a6058b6c89ad182fb99d4e930f158b015a386ee67ece2445b5e7aba5e539dd7377822de1b045b80d1e439f191a2274c6e95c7fb3dba535d8c0"]},"Data.Semiring.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Semiring/Generic.purs":["2022-04-27T13:37:39Z","e1aeb61208e3b96999f07cc41307d50fa8025c2f688e9dc24d7286933a11cc1ec253375e10e25fb578801bcda7b18b7342bb13275f4ca72478a2aff9ea872799"]},"Data.Show":{"../../../support/bower_components/purescript-prelude/src/Data/Show.js":["2022-04-27T13:37:39Z","2a936ee3c9835b353e0e23d37709f80dbf675fd6a3761f48a61c15db808b36f50cb4c758f7710ce7bf7e72389a9e51b1cd605ea793a30565de0f02a5866a91c4"],"../../../support/bower_components/purescript-prelude/src/Data/Show.purs":["2022-04-27T13:37:39Z","e846644987565d11a205b5f5c1ba8349a057c9710c88a461ebf2ab0bfe2f83a4f1de8c1a5653d33eca13d00fd65a086caf28ea0498c974a1fc3e7619a719a1b8"]},"Data.Show.Generic":{"../../../support/bower_components/purescript-prelude/src/Data/Show/Generic.js":["2022-04-27T13:37:39Z","f8b9a3c651ceb9e8f2ee15ae532ecd371794b4e9f3b14eb0508656c1ae853654d7e3d3c719a9a98f0dcbc81df3b03266c05d3bc01c9b62d6d8ce29d4794e4b1b"],"../../../support/bower_components/purescript-prelude/src/Data/Show/Generic.purs":["2022-04-27T13:37:39Z","37b5a1168cd88f5f6f2d2a584cfe2c69e326b9f3e62291ec607c6e4a12da144450088fe65e95cbd04204d9c616a04696b5b3d0d7e444e8628b4a1eb3597c534d"]},"Data.Symbol":{"../../../support/bower_components/purescript-prelude/src/Data/Symbol.js":["2022-04-27T13:37:39Z","c980adfe8e297bfe8e257903de3ac13f5675c6f52ed95e8c2786fcacc52adde10b5de56c9432859c3c7c8f51d1866f2e8d4a961d60e1bff656def39e3b3cdcf7"],"../../../support/bower_components/purescript-prelude/src/Data/Symbol.purs":["2022-04-27T13:37:39Z","579409ca0036164a1a0534b266cc1c90de7b020ecea470cdedf0a97cc34ae1f25ab441df9789798dc30f6a4c8f6c6368c79dc5523d9de336e57dcc6325127cb2"]},"Data.Unit":{"../../../support/bower_components/purescript-prelude/src/Data/Unit.js":["2022-04-27T13:37:39Z","d7185d75aa1f2fe353e4e200ab4181472e354d6295cb2e6587a56636b1bc733be77b2f5616b20275fe7be0138a6442b2979864b1b234a813f8d9237baa4cd5f3"],"../../../support/bower_components/purescript-prelude/src/Data/Unit.purs":["2022-04-27T13:37:39Z","a4bfca3ddacfc9d1e09019819fd94325c0fe756cb6d7e35c07a8bb6bb6c8bc6cca55a22b72f641b9fac6e5c09cae29cec932c847bdb34298310a161ee3fcfc92"]},"Data.Void":{"../../../support/bower_components/purescript-prelude/src/Data/Void.purs":["2022-04-27T13:37:39Z","a9d41b27b3dc34c74df497c4563d9c8fbe6b04ee1ee4cc32e18c3649972c84a5d330087cd3732b2cbbda204558fa79a8eea2bbba7e64916e45c49745af27d739"]},"Effect":{"../../../support/bower_components/purescript-effect/src/Effect.js":["2022-04-27T14:04:24Z","9683b917c04f50b5b8a41d8294b101d7787cd0a742840e6f05ec143f881bfb51807a2efd29a9296def2676e7c1860352f3d89f78f9205567575c5040f790da32"],"../../../support/bower_components/purescript-effect/src/Effect.purs":["2022-04-27T14:04:24Z","25ea461900466a6aade8a56c20921d46eb037a71efb12c4265dd378e760843e5793efb9f7cb47322511459136d9d4ecd6d09e5a089a432d96ef4af4530ad8e8d"]},"Effect.Class":{"../../../support/bower_components/purescript-effect/src/Effect/Class.purs":["2022-04-27T14:04:24Z","47e0114539e25826ffba341faf99133ed2499027f0955fa606d563d3504c6b41dc9d425dfa619c0c83b5fc2ab8dbb3c1bf2166b5980c5674fb93560c9b80d585"]},"Effect.Class.Console":{"../../../support/bower_components/purescript-console/src/Effect/Class/Console.purs":["2022-04-27T14:11:24Z","5a3a1a7efb4ca9d61673d954d5bed9be6eec0b512fcdffdbcca411b0fe10353da1ec9ac9e32d19f6ffe3ccb358a177cc6238064ae7dee8dfce2363ec26600edc"]},"Effect.Console":{"../../../support/bower_components/purescript-console/src/Effect/Console.js":["2022-04-27T14:11:24Z","37d5914c1c03387fb61991fa0c7273560b38a9cca1ab22a5a1071f58fb5e3cc41952c87e404f22a928e674c04fce0fa18d469b2481d6078645d20650280c9a84"],"../../../support/bower_components/purescript-console/src/Effect/Console.purs":["2022-04-27T14:11:24Z","71c92750574fc7e669d3e0a7d0f40101b91836e69275074eaf3b534fe5f68a6f3b4ebc1dc1f950f89a381996f8bdca297eac522893733bc0fd5ef2ce790af8c7"]},"Effect.Uncurried":{"../../../support/bower_components/purescript-effect/src/Effect/Uncurried.js":["2022-04-27T14:04:24Z","4c6c5db78b72ff3b84623d894b05dd916cc0732dc08d1fd45d8b0768983fdd7377b7299add3c70475459d0e190af99e2176e4c17a8cfbf295c675456bd5ba7d2"],"../../../support/bower_components/purescript-effect/src/Effect/Uncurried.purs":["2022-04-27T14:04:24Z","a948cb1cab11f5019fe20dd697b5c6e248c3b29c7ab332c2cb9d792cfcb58021a77c0f4f71e1c8d7c0b3b9cb18bd1497a0d2f40680926390f3303ecb1fe25beb"]},"Effect.Unsafe":{"../../../support/bower_components/purescript-effect/src/Effect/Unsafe.js":["2022-04-27T14:04:24Z","e66a1117e55534d61b7cd8e1859b54ef97446e0374116867383d2027bd85b73e510cbd1e4e74067b740fffb66c11e243af8d0976b2dc225d9865d882486cccdd"],"../../../support/bower_components/purescript-effect/src/Effect/Unsafe.purs":["2022-04-27T14:04:24Z","c112c559df0f177472e96655b09165d5535f68caddc2b419b4cdfe796af19b962b0659cb609a2ce501002da7de34e66592b5491ebe6f538824c2db8a1e800ea7"]},"Main":{"src/Main.purs":["2021-11-28T09:05:27.556402135Z","55bdd6dd11fb1679cb11793dd2996de21972f7aa53826557273bd649004f5907ff8cf6dff840718a12084c421529c9da7d70f698689d3923ab4ae3d608591c66"]},"Prelude":{"../../../support/bower_components/purescript-prelude/src/Prelude.purs":["2022-04-27T13:37:39Z","c67b6a882790c17476eb477da2cfc71dc4c26f297e7b4581b5ae9b0d08040ea7c7b55ed3afb3e824806e573ea4dd307eaa7cb49cfb2a756973b226ee1023e6fc"]},"Record.Unsafe":{"../../../support/bower_components/purescript-prelude/src/Record/Unsafe.js":["2022-04-27T13:37:39Z","667d613a0e1265a710e98c9f6e64ff791b9e9b7227cdf699c3a25724077c02e42726c807c0387ca4484454fd853d5b41522bf2e048887f22a894413ef80cbb92"],"../../../support/bower_components/purescript-prelude/src/Record/Unsafe.purs":["2022-04-27T13:37:39Z","af8a7c83127f5e61853ad0e572be799c04e321562a375d51ab133706ac6a6777e169b057f01a709ad7aae2d8c7a5ae8daa28eae8793c4fe92e2e8f0cfaecf870"]},"Safe.Coerce":{"../../../support/bower_components/purescript-safe-coerce/src/Safe/Coerce.purs":["2022-04-27T14:56:52Z","595abade13e21ed7893a92b338d9e7c7bf56e9067d51ca25c387d6d93a1c5542925f062e282602e89476a45501645c76dbd57eac31cc4e5c1cf341e2902beb89"]},"Type.Proxy":{"../../../support/bower_components/purescript-prelude/src/Type/Proxy.purs":["2022-04-27T13:37:39Z","333d0ae90b05098eada860ad476ed9e1eacd67d969dc1573c74375610cf8de22e85a358a7783a0a461d7ffa6fe322d8c3e90696be02555a02793ac99aba687f2"]},"Unsafe.Coerce":{"../../../support/bower_components/purescript-unsafe-coerce/src/Unsafe/Coerce.js":["2022-04-27T14:15:44Z","031c3187f7ce65110a359260041309506e1ff39a97b6eb22c9a8f2e5c14b35db87d509bb5929f245c5d80df6ccd6dadf83579ebe4ac46650acdfa34a493cfc0d"],"../../../support/bower_components/purescript-unsafe-coerce/src/Unsafe/Coerce.purs":["2022-04-27T14:15:44Z","04b214d9cbbf0c438bb2af4b25f8db5d04f247059241982f718c6d83322c3180f0eced0eb5c410860dcdb35650e9129a1cffe87f7279308cc4cf6c6570bba74f"]}}
diff --git a/tests/support/bower.json b/tests/support/bower.json
--- a/tests/support/bower.json
+++ b/tests/support/bower.json
@@ -27,7 +27,7 @@
     "purescript-psci-support": "^6.0.0",
     "purescript-refs": "^6.0.0",
     "purescript-safe-coerce": "^2.0.0",
-    "purescript-st": "^6.0.0",
+    "purescript-st": "^6.1.0",
     "purescript-strings": "^6.0.0",
     "purescript-tailrec": "^6.1.0",
     "purescript-tuples": "^7.0.0",
diff --git a/tests/support/package-lock.json b/tests/support/package-lock.json
--- a/tests/support/package-lock.json
+++ b/tests/support/package-lock.json
@@ -17,9 +17,9 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
     "node_modules/bower": {
-      "version": "1.8.13",
-      "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.13.tgz",
-      "integrity": "sha512-8eWko16JlCTdaZZG70kddHPed17pHEbH8/IjfP4IFkQsfEqRsyNM09Dc8cDBFkSvtQ/2lTea7A+bMhRggG2a+Q==",
+      "version": "1.8.14",
+      "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz",
+      "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==",
       "bin": {
         "bower": "bin/bower"
       },
@@ -39,17 +39,17 @@
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "node_modules/glob": {
       "version": "5.0.15",
       "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-      "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+      "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
       "dependencies": {
         "inflight": "^1.0.4",
         "inherits": "2",
@@ -64,7 +64,7 @@
     "node_modules/inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -89,7 +89,7 @@
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dependencies": {
         "wrappy": "1"
       }
@@ -97,7 +97,7 @@
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -114,14 +114,14 @@
       }
     },
     "node_modules/rimraf/node_modules/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
         "inherits": "2",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.1",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
       },
@@ -133,9 +133,9 @@
       }
     },
     "node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
       "engines": {
         "node": ">= 8"
       }
@@ -153,9 +153,9 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
     "bower": {
-      "version": "1.8.13",
-      "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.13.tgz",
-      "integrity": "sha512-8eWko16JlCTdaZZG70kddHPed17pHEbH8/IjfP4IFkQsfEqRsyNM09Dc8cDBFkSvtQ/2lTea7A+bMhRggG2a+Q=="
+      "version": "1.8.14",
+      "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz",
+      "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ=="
     },
     "brace-expansion": {
       "version": "1.1.11",
@@ -169,17 +169,17 @@
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "glob": {
       "version": "5.0.15",
       "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-      "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+      "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
       "requires": {
         "inflight": "^1.0.4",
         "inherits": "2",
@@ -191,7 +191,7 @@
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -213,7 +213,7 @@
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "requires": {
         "wrappy": "1"
       }
@@ -221,7 +221,7 @@
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
     },
     "rimraf": {
       "version": "2.7.1",
@@ -232,14 +232,14 @@
       },
       "dependencies": {
         "glob": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-          "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
             "inherits": "2",
-            "minimatch": "^3.0.4",
+            "minimatch": "^3.1.1",
             "once": "^1.3.0",
             "path-is-absolute": "^1.0.0"
           }
@@ -247,9 +247,9 @@
       }
     },
     "source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="
     },
     "wrappy": {
       "version": "1.0.2",
