From c1e474f005c99ca3d2210411389970f5da55c422 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Mon, 9 Nov 2015 11:15:11 -0800
Subject: [PATCH] Restored Text.Pandoc.Compat.Monoid.

Don't use custom prelude for latest ghc.

This is a better approach to making 'stack ghci' and 'cabal repl'
work.  Instead of using NoImplicitPrelude, we only use the custom
prelude for older ghc versions.  The custom prelude presents a
uniform API that matches the current base version's prelude.
So, when developing (presumably with latest ghc), we don't
use a custom prelude at all and hence have no trouble with ghci.

The custom prelude no longer exports (<>):  we now want to
match the base 4.8 prelude behavior.
---
 pandoc.cabal                                  | 35 ++++++++++++-------
 prelude/Prelude.hs                            | 19 +++-------
 src/Text/Pandoc/Compat/Monoid.hs              | 17 +++++++++
 src/Text/Pandoc/PDF.hs                        |  1 +
 src/Text/Pandoc/Parsing.hs                    |  1 +
 src/Text/Pandoc/Pretty.hs                     |  1 +
 src/Text/Pandoc/Readers/EPUB.hs               |  1 +
 src/Text/Pandoc/Readers/HTML.hs               |  2 +-
 src/Text/Pandoc/Readers/Haddock.hs            |  1 +
 src/Text/Pandoc/Readers/Markdown.hs           |  1 +
 src/Text/Pandoc/Readers/MediaWiki.hs          |  1 +
 src/Text/Pandoc/Readers/Odt/Arrows/State.hs   |  1 +
 src/Text/Pandoc/Readers/Odt/Arrows/Utils.hs   |  2 +-
 .../Pandoc/Readers/Odt/Generic/Fallible.hs    |  2 +-
 src/Text/Pandoc/Readers/Org.hs                |  1 +
 src/Text/Pandoc/Readers/RST.hs                |  2 +-
 src/Text/Pandoc/Readers/Textile.hs            |  1 +
 src/Text/Pandoc/Readers/Txt2Tags.hs           |  1 +
 src/Text/Pandoc/Shared.hs                     |  1 +
 src/Text/Pandoc/Templates.hs                  |  1 +
 src/Text/Pandoc/Writers/Docx.hs               |  1 +
 src/Text/Pandoc/Writers/HTML.hs               |  1 +
 22 files changed, 64 insertions(+), 30 deletions(-)
 create mode 100644 src/Text/Pandoc/Compat/Monoid.hs

diff --git a/pandoc.cabal b/pandoc.cabal
index cba6d676d..d76b02d17 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -310,7 +310,10 @@ Library
                       ScopedTypeVariables, GeneralizedNewtypeDeriving,
                       RelaxedPolyRec, DeriveDataTypeable, TypeSynonymInstances,
                       FlexibleInstances
-  Hs-Source-Dirs:  src, prelude
+  Hs-Source-Dirs:  src
+  if impl(ghc < 7.10)
+     Hs-Source-Dirs: prelude
+     Other-Modules:  Prelude
 
   Exposed-Modules: Text.Pandoc,
                    Text.Pandoc.Options,
@@ -396,9 +399,9 @@ Library
                    Text.Pandoc.Compat.Time,
                    Text.Pandoc.Compat.Except,
                    Text.Pandoc.Compat.TagSoupEntity,
-                   Text.Pandoc.Compat.Directory
+                   Text.Pandoc.Compat.Directory,
+                   Text.Pandoc.Compat.Monoid,
                    Paths_pandoc
-                   Prelude
 
   Buildable:       True
 
@@ -429,15 +432,20 @@ Executable pandoc
                     ScopedTypeVariables, GeneralizedNewtypeDeriving,
                     RelaxedPolyRec, DeriveDataTypeable, TypeSynonymInstances,
                     FlexibleInstances
-  Hs-Source-Dirs:  ., prelude
+  Hs-Source-Dirs:  .
+  if impl(ghc < 7.10)
+     Hs-Source-Dirs: prelude
+     Other-Modules:  Prelude
   Main-Is:         pandoc.hs
   Buildable:       True
-  Other-Modules: Prelude
-                 Paths_pandoc
+  Other-Modules:   Paths_pandoc
 
 Executable trypandoc
   Main-Is:         trypandoc.hs
-  Hs-Source-Dirs:  trypandoc, prelude
+  Hs-Source-Dirs:  trypandoc
+  if impl(ghc < 7.10)
+     Hs-Source-Dirs: prelude
+     Other-Modules:  Prelude
   default-language: Haskell2010
   if flag(trypandoc)
     Build-Depends: base, aeson, pandoc, highlighting-kate,
@@ -445,12 +453,14 @@ Executable trypandoc
     Buildable:     True
   else
     Buildable:     False
-  Other-Modules: Prelude
 
 Test-Suite test-pandoc
   Type:           exitcode-stdio-1.0
   Main-Is:        test-pandoc.hs
-  Hs-Source-Dirs: tests, prelude
+  Hs-Source-Dirs: tests
+  if impl(ghc < 7.10)
+     Hs-Source-Dirs: prelude
+     Other-Modules:  Prelude
   Build-Depends:  base >= 4.2 && < 5,
                   syb >= 0.1 && < 0.7,
                   pandoc,
@@ -495,18 +505,19 @@ Test-Suite test-pandoc
                   Tests.Writers.LaTeX
                   Tests.Writers.Docx
                   Tests.Writers.RST
-                  Prelude
   Ghc-Options:  -rtsopts -Wall -fno-warn-unused-do-bind -threaded
   Default-Language: Haskell98
 
 benchmark benchmark-pandoc
   Type:            exitcode-stdio-1.0
   Main-Is:         benchmark-pandoc.hs
-  Hs-Source-Dirs:  benchmark, prelude
+  Hs-Source-Dirs:  benchmark
+  if impl(ghc < 7.10)
+     Hs-Source-Dirs: prelude
+     Other-Modules:  Prelude
   Build-Depends:   pandoc,
                    base >= 4.2 && < 5,
                    syb >= 0.1 && < 0.7,
                    criterion >= 1.0 && < 1.2
   Ghc-Options:   -rtsopts -Wall -fno-warn-unused-do-bind
   Default-Language: Haskell98
-  Other-Modules:   Prelude
diff --git a/prelude/Prelude.hs b/prelude/Prelude.hs
index ca5c687ea..50e86a7b9 100644
--- a/prelude/Prelude.hs
+++ b/prelude/Prelude.hs
@@ -1,23 +1,24 @@
 {-# LANGUAGE PackageImports #-}
 {-# LANGUAGE CPP #-}
 
+-- This custom Prelude emulates the API of the prelude
+-- with base 4.8.
+
 module Prelude
 (
   module P
-, Monoid(..)
-, Applicative(..)
 #if MIN_VERSION_base(4,8,0)
 #else
+, Monoid(..)
+, Applicative(..)
 , (<$>)
 , (<$)
 #endif
-, (<>)
 )
 where
 
 #if MIN_VERSION_base(4,8,0)
 import "base" Prelude as P
-import Data.Monoid ((<>))
 #elif MIN_VERSION_base(4,6,0)
 import "base" Prelude as P
 import Control.Applicative
@@ -27,13 +28,3 @@ import "base" Prelude as P hiding (catch)
 import Control.Applicative
 import Data.Monoid
 #endif
-
-#if MIN_VERSION_base(4,5,0)
-#else
-infixr 6 <>
-
--- | An infix synonym for 'mappend'.
-(<>) :: Monoid m => m -> m -> m
-(<>) = mappend
-{-# INLINE (<>) #-}
-#endif
diff --git a/src/Text/Pandoc/Compat/Monoid.hs b/src/Text/Pandoc/Compat/Monoid.hs
new file mode 100644
index 000000000..4daceb8e1
--- /dev/null
+++ b/src/Text/Pandoc/Compat/Monoid.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE CPP #-}
+module Text.Pandoc.Compat.Monoid ( (<>) )
+       where
+
+#if MIN_VERSION_base(4,5,0)
+import Data.Monoid ((<>))
+
+#else
+import Data.Monoid
+
+infixr 6 <>
+
+--- | An infix synonym for 'mappend'.
+(<>) :: Monoid m => m -> m -> m
+(<>) = mappend
+{-# INLINE (<>) #-}
+#endif
diff --git a/src/Text/Pandoc/PDF.hs b/src/Text/Pandoc/PDF.hs
index 025f7f576..ab94a289a 100644
--- a/src/Text/Pandoc/PDF.hs
+++ b/src/Text/Pandoc/PDF.hs
@@ -34,6 +34,7 @@ import Data.ByteString.Lazy (ByteString)
 import qualified Data.ByteString.Lazy as B
 import qualified Data.ByteString.Lazy.Char8 as BC
 import qualified Data.ByteString as BS
+import Text.Pandoc.Compat.Monoid ((<>))
 import System.Exit (ExitCode (..))
 import System.FilePath
 import System.IO (stderr, stdout)
diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs
index d2eaaf0d1..c64860ad9 100644
--- a/src/Text/Pandoc/Parsing.hs
+++ b/src/Text/Pandoc/Parsing.hs
@@ -185,6 +185,7 @@ import Text.TeXMath.Readers.TeX.Macros (applyMacros, Macro,
                                         parseMacroDefinitions)
 import Text.Pandoc.Compat.TagSoupEntity ( lookupEntity )
 import Text.Pandoc.Asciify (toAsciiChar)
+import Text.Pandoc.Compat.Monoid ((<>))
 import Data.Default
 import qualified Data.Set as Set
 import Control.Monad.Reader
diff --git a/src/Text/Pandoc/Pretty.hs b/src/Text/Pandoc/Pretty.hs
index f100fb75d..5771f3a89 100644
--- a/src/Text/Pandoc/Pretty.hs
+++ b/src/Text/Pandoc/Pretty.hs
@@ -80,6 +80,7 @@ import Data.List (intercalate)
 import Data.String
 import Control.Monad.State
 import Data.Char (isSpace)
+import Text.Pandoc.Compat.Monoid ((<>))
 
 data RenderState a = RenderState{
          output       :: [a]        -- ^ In reverse order
diff --git a/src/Text/Pandoc/Readers/EPUB.hs b/src/Text/Pandoc/Readers/EPUB.hs
index 2da5e9e18..b8698fe26 100644
--- a/src/Text/Pandoc/Readers/EPUB.hs
+++ b/src/Text/Pandoc/Readers/EPUB.hs
@@ -16,6 +16,7 @@ import Text.Pandoc.Options ( ReaderOptions(..), readerTrace)
 import Text.Pandoc.Shared (escapeURI, collapseFilePath, addMetaField)
 import Text.Pandoc.MediaBag (MediaBag, insertMedia)
 import Text.Pandoc.Compat.Except (MonadError, throwError, runExcept, Except)
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.MIME (MimeType)
 import qualified Text.Pandoc.Builder as B
 import Codec.Archive.Zip ( Archive (..), toArchive, fromEntry
diff --git a/src/Text/Pandoc/Readers/HTML.hs b/src/Text/Pandoc/Readers/HTML.hs
index a97285ae2..ce10a289e 100644
--- a/src/Text/Pandoc/Readers/HTML.hs
+++ b/src/Text/Pandoc/Readers/HTML.hs
@@ -66,7 +66,7 @@ import Control.Monad.Reader (Reader,ask, asks, local, runReader)
 import Network.URI (isURI)
 import Text.Pandoc.Error
 import Text.Pandoc.CSS (foldOrElse, pickStyleAttrProps)
-
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Parsec.Error
 
 
diff --git a/src/Text/Pandoc/Readers/Haddock.hs b/src/Text/Pandoc/Readers/Haddock.hs
index 2b74f5f62..16f3d7ef3 100644
--- a/src/Text/Pandoc/Readers/Haddock.hs
+++ b/src/Text/Pandoc/Readers/Haddock.hs
@@ -16,6 +16,7 @@ module Text.Pandoc.Readers.Haddock
 
 import Text.Pandoc.Builder (Blocks, Inlines)
 import qualified Text.Pandoc.Builder as B
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Shared (trim, splitBy)
 import Data.List (intersperse, stripPrefix)
 import Data.Maybe (fromMaybe)
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 58878feb5..d73b92fbd 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -62,6 +62,7 @@ import Text.HTML.TagSoup.Match (tagOpen)
 import qualified Data.Set as Set
 import Text.Printf (printf)
 import Debug.Trace (trace)
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Error
 
 type MarkdownParser = Parser [Char] ParserState
diff --git a/src/Text/Pandoc/Readers/MediaWiki.hs b/src/Text/Pandoc/Readers/MediaWiki.hs
index 4f5f9c293..ffac51e7b 100644
--- a/src/Text/Pandoc/Readers/MediaWiki.hs
+++ b/src/Text/Pandoc/Readers/MediaWiki.hs
@@ -39,6 +39,7 @@ module Text.Pandoc.Readers.MediaWiki ( readMediaWiki ) where
 import Text.Pandoc.Definition
 import qualified Text.Pandoc.Builder as B
 import Text.Pandoc.Builder (Inlines, Blocks, trimInlines)
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Options
 import Text.Pandoc.Readers.HTML ( htmlTag, isBlockTag, isCommentTag )
 import Text.Pandoc.XML ( fromEntities )
diff --git a/src/Text/Pandoc/Readers/Odt/Arrows/State.hs b/src/Text/Pandoc/Readers/Odt/Arrows/State.hs
index 2cc83183f..30f96c557 100644
--- a/src/Text/Pandoc/Readers/Odt/Arrows/State.hs
+++ b/src/Text/Pandoc/Readers/Odt/Arrows/State.hs
@@ -46,6 +46,7 @@ import           Control.Monad
 
 import           Data.Foldable
 
+import           Text.Pandoc.Compat.Monoid
 import           Text.Pandoc.Readers.Odt.Arrows.Utils
 import           Text.Pandoc.Readers.Odt.Generic.Fallible
 
diff --git a/src/Text/Pandoc/Readers/Odt/Arrows/Utils.hs b/src/Text/Pandoc/Readers/Odt/Arrows/Utils.hs
index fdc02d8d2..8c9ee0539 100644
--- a/src/Text/Pandoc/Readers/Odt/Arrows/Utils.hs
+++ b/src/Text/Pandoc/Readers/Odt/Arrows/Utils.hs
@@ -46,7 +46,7 @@ import qualified Data.Foldable                    as F
 
 import           Text.Pandoc.Readers.Odt.Generic.Fallible
 import           Text.Pandoc.Readers.Odt.Generic.Utils
-
+import           Text.Pandoc.Compat.Monoid
 
 and2 :: (Arrow a) => a b c -> a b c' -> a b (c,c')
 and2 = (&&&)
diff --git a/src/Text/Pandoc/Readers/Odt/Generic/Fallible.hs b/src/Text/Pandoc/Readers/Odt/Generic/Fallible.hs
index 343ec14ee..d0fdc228f 100644
--- a/src/Text/Pandoc/Readers/Odt/Generic/Fallible.hs
+++ b/src/Text/Pandoc/Readers/Odt/Generic/Fallible.hs
@@ -41,7 +41,7 @@ module Text.Pandoc.Readers.Odt.Generic.Fallible where
 
 import           Control.Applicative
 import           Control.Monad
-
+import           Text.Pandoc.Compat.Monoid ((<>))
 import qualified Data.Foldable       as F
 
 -- | Default for now. Will probably become a class at some point.
diff --git a/src/Text/Pandoc/Readers/Org.hs b/src/Text/Pandoc/Readers/Org.hs
index 90bc48b22..c04149e1f 100644
--- a/src/Text/Pandoc/Readers/Org.hs
+++ b/src/Text/Pandoc/Readers/Org.hs
@@ -34,6 +34,7 @@ import qualified Text.Pandoc.Builder as B
 import           Text.Pandoc.Builder ( Inlines, Blocks, HasMeta(..),
                                        trimInlines )
 import           Text.Pandoc.Definition
+import           Text.Pandoc.Compat.Monoid ((<>))
 import           Text.Pandoc.Options
 import qualified Text.Pandoc.Parsing as P
 import           Text.Pandoc.Parsing hiding ( F, unF, askF, asksF, runF
diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs
index 4fb30e6c4..199e7f3f8 100644
--- a/src/Text/Pandoc/Readers/RST.hs
+++ b/src/Text/Pandoc/Readers/RST.hs
@@ -48,7 +48,7 @@ import Text.Pandoc.Builder (Inlines, Blocks, trimInlines)
 import qualified Text.Pandoc.Builder as B
 import Data.Sequence (viewr, ViewR(..))
 import Data.Char (toLower, isHexDigit, isSpace)
-
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Error
 
 -- | Parse reStructuredText string and return Pandoc document.
diff --git a/src/Text/Pandoc/Readers/Textile.hs b/src/Text/Pandoc/Readers/Textile.hs
index 43aaa3f9a..b1bf463af 100644
--- a/src/Text/Pandoc/Readers/Textile.hs
+++ b/src/Text/Pandoc/Readers/Textile.hs
@@ -64,6 +64,7 @@ import Text.HTML.TagSoup.Match
 import Data.List ( intercalate )
 import Data.Char ( digitToInt, isUpper)
 import Control.Monad ( guard, liftM, when )
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Printf
 import Debug.Trace (trace)
 import Text.Pandoc.Error
diff --git a/src/Text/Pandoc/Readers/Txt2Tags.hs b/src/Text/Pandoc/Readers/Txt2Tags.hs
index 1c868f5f0..58841f2ce 100644
--- a/src/Text/Pandoc/Readers/Txt2Tags.hs
+++ b/src/Text/Pandoc/Readers/Txt2Tags.hs
@@ -34,6 +34,7 @@ module Text.Pandoc.Readers.Txt2Tags ( readTxt2Tags
 
 import qualified Text.Pandoc.Builder as B
 import Text.Pandoc.Builder ( Inlines, Blocks, trimInlines )
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Definition
 import Text.Pandoc.Options
 import Text.Pandoc.Shared (escapeURI,compactify', compactify'DL)
diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs
index a40b1d4e9..a82968c04 100644
--- a/src/Text/Pandoc/Shared.hs
+++ b/src/Text/Pandoc/Shared.hs
@@ -129,6 +129,7 @@ import System.IO (stderr)
 import System.IO.Temp
 import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
          renderOptions)
+import Text.Pandoc.Compat.Monoid ((<>))
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Char8 as B8
 import Data.ByteString.Base64 (decodeLenient)
diff --git a/src/Text/Pandoc/Templates.hs b/src/Text/Pandoc/Templates.hs
index f366299d5..a010433fa 100644
--- a/src/Text/Pandoc/Templates.hs
+++ b/src/Text/Pandoc/Templates.hs
@@ -98,6 +98,7 @@ import Control.Monad (guard, when)
 import Data.Aeson (ToJSON(..), Value(..))
 import qualified Text.Parsec as P
 import Text.Parsec.Text (Parser)
+import Text.Pandoc.Compat.Monoid ((<>))
 import qualified Data.Text as T
 import Data.Text (Text)
 import Data.Text.Encoding (encodeUtf8)
diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs
index 639818f2e..40dbd839c 100644
--- a/src/Text/Pandoc/Writers/Docx.hs
+++ b/src/Text/Pandoc/Writers/Docx.hs
@@ -60,6 +60,7 @@ import Data.Unique (hashUnique, newUnique)
 import System.Random (randomRIO)
 import Text.Printf (printf)
 import qualified Control.Exception as E
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.MIME (MimeType, getMimeType, getMimeTypeDef,
                          extensionFromMimeType)
 import Control.Applicative ((<|>))
diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs
index 9b362adf1..3a79897d6 100644
--- a/src/Text/Pandoc/Writers/HTML.hs
+++ b/src/Text/Pandoc/Writers/HTML.hs
@@ -31,6 +31,7 @@ Conversion of 'Pandoc' documents to HTML.
 -}
 module Text.Pandoc.Writers.HTML ( writeHtml , writeHtmlString ) where
 import Text.Pandoc.Definition
+import Text.Pandoc.Compat.Monoid ((<>))
 import Text.Pandoc.Shared
 import Text.Pandoc.Writers.Shared
 import Text.Pandoc.Options