haddock 2.11.1 → 2.29.1
raw patch · 527 files changed
This diff is very large; some files are shown as “too large to diff”. Download the raw patch for the complete diff.
Files
- CHANGES +0/−523
- CHANGES.md +893/−0
- LICENSE +23/−20
- README +0/−48
- README.md +34/−0
- Setup.lhs +3/−5
- doc/Makefile +6/−4
- doc/README +0/−25
- doc/README.md +10/−0
- doc/aclocal.m4 +0/−174
- doc/common-errors.rst +19/−0
- doc/conf.py +68/−0
- doc/config.mk.in +0/−15
- doc/configure.ac +0/−12
- doc/docbook-xml.mk +0/−130
- doc/fptools.css +0/−36
- doc/haddock.xml +0/−1856
- doc/index.rst +23/−0
- doc/intro.rst +124/−0
- doc/invoking.rst +563/−0
- doc/markup.rst +1264/−0
- doc/multi-components.rst +48/−0
- driver/Main.hs +7/−0
- examples/A.hs +0/−2
- examples/B.hs +0/−2
- examples/Bug1.hs +0/−6
- examples/Bug2.hs +0/−4
- examples/Bug3.hs +0/−6
- examples/Bug4.hs +0/−4
- examples/Bug6.hs +0/−23
- examples/Bug7.hs +0/−12
- examples/Bug8.hs +0/−8
- examples/Bug9.hs +0/−6
- examples/Hash.hs +0/−45
- examples/Hidden.hs +0/−4
- examples/Makefile +0/−11
- examples/NoLayout.hs +0/−4
- examples/Test.hs +0/−410
- examples/Visible.hs +0/−3
- examples/hide-bug/A.hs +0/−2
- examples/hide-bug/B.hs +0/−5
- examples/hide-bug/C.hs +0/−6
- examples/hide-bug/D.hs +0/−7
- haddock-api/src/Documentation/Haddock.hs +89/−0
- haddock-api/src/Haddock.hs +799/−0
- haddock-api/src/Haddock/Backends/HaddockDB.hs +175/−0
- haddock-api/src/Haddock/Backends/Hoogle.hs +428/−0
- haddock-api/src/Haddock/Backends/Hyperlinker.hs +114/−0
- haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs +406/−0
- haddock-api/src/Haddock/Backends/Hyperlinker/Renderer.hs +294/−0
- haddock-api/src/Haddock/Backends/Hyperlinker/Types.hs +51/−0
- haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs +144/−0
- haddock-api/src/Haddock/Backends/LaTeX.hs +1464/−0
- haddock-api/src/Haddock/Backends/Xhtml.hs +914/−0
- haddock-api/src/Haddock/Backends/Xhtml/Decl.hs +1312/−0
- haddock-api/src/Haddock/Backends/Xhtml/DocMarkup.hs +284/−0
- haddock-api/src/Haddock/Backends/Xhtml/Layout.hs +319/−0
- haddock-api/src/Haddock/Backends/Xhtml/Meta.hs +28/−0
- haddock-api/src/Haddock/Backends/Xhtml/Names.hs +198/−0
- haddock-api/src/Haddock/Backends/Xhtml/Themes.hs +208/−0
- haddock-api/src/Haddock/Backends/Xhtml/Types.hs +48/−0
- haddock-api/src/Haddock/Backends/Xhtml/Utils.hs +241/−0
- haddock-api/src/Haddock/Convert.hs +986/−0
- haddock-api/src/Haddock/Doc.hs +34/−0
- haddock-api/src/Haddock/GhcUtils.hs +777/−0
- haddock-api/src/Haddock/Interface.hs +434/−0
- haddock-api/src/Haddock/Interface/AttachInstances.hs +280/−0
- haddock-api/src/Haddock/Interface/Create.hs +1276/−0
- haddock-api/src/Haddock/Interface/Json.hs +268/−0
- haddock-api/src/Haddock/Interface/LexParseRn.hs +312/−0
- haddock-api/src/Haddock/Interface/ParseModuleHeader.hs +189/−0
- haddock-api/src/Haddock/Interface/Rename.hs +819/−0
- haddock-api/src/Haddock/Interface/Specialize.hs +407/−0
- haddock-api/src/Haddock/InterfaceFile.hs +682/−0
- haddock-api/src/Haddock/ModuleTree.hs +62/−0
- haddock-api/src/Haddock/Options.hs +454/−0
- haddock-api/src/Haddock/Parser.hs +56/−0
- haddock-api/src/Haddock/Syb.hs +73/−0
- haddock-api/src/Haddock/Types.hs +1142/−0
- haddock-api/src/Haddock/Utils.hs +343/−0
- haddock-api/src/Haddock/Utils/Json.hs +558/−0
- haddock-api/src/Haddock/Utils/Json/Parser.hs +102/−0
- haddock-api/src/Haddock/Utils/Json/Types.hs +42/−0
- haddock-api/src/Haddock/Version.hs +30/−0
- haddock-api/src/haddock.sh +7/−0
- haddock-library/src/CompatPrelude.hs +53/−0
- haddock-library/src/Documentation/Haddock/Doc.hs +89/−0
- haddock-library/src/Documentation/Haddock/Markup.hs +99/−0
- haddock-library/src/Documentation/Haddock/Parser.hs +859/−0
- haddock-library/src/Documentation/Haddock/Parser/Identifier.hs +159/−0
- haddock-library/src/Documentation/Haddock/Parser/Monad.hs +149/−0
- haddock-library/src/Documentation/Haddock/Parser/Util.hs +79/−0
- haddock-library/src/Documentation/Haddock/Types.hs +262/−0
- haddock.cabal +159/−184
- haddock.spec +0/−81
- haskell.vim +0/−68
- hoogle-test/Main.hs +34/−0
- hoogle-test/ref/Bug722/test.txt +16/−0
- hoogle-test/ref/Bug806/test.txt +25/−0
- hoogle-test/ref/Bug825/test.txt +9/−0
- hoogle-test/ref/Bug946/test.txt +19/−0
- hoogle-test/ref/Bug992/test.txt +9/−0
- hoogle-test/ref/assoc-types/test.txt +14/−0
- hoogle-test/ref/classes/test.txt +17/−0
- hoogle-test/ref/fixity/test.txt +13/−0
- hoogle-test/ref/modules/test.txt +13/−0
- hoogle-test/ref/type-sigs/test.txt +16/−0
- hoogle-test/src/Bug722/Bug722.hs +14/−0
- hoogle-test/src/Bug806/Bug806.hs +24/−0
- hoogle-test/src/Bug825/Bug825.hs +7/−0
- hoogle-test/src/Bug946/Bug946.hs +17/−0
- hoogle-test/src/Bug992/Bug992.hs +6/−0
- hoogle-test/src/assoc-types/AssocTypes.hs +25/−0
- hoogle-test/src/classes/Classes.hs +17/−0
- hoogle-test/src/fixity/Fixity.hs +13/−0
- hoogle-test/src/modules/Bar.hs +13/−0
- hoogle-test/src/modules/Foo.hs +10/−0
- hoogle-test/src/type-sigs/ReaderT.hs +4/−0
- hoogle-test/src/type-sigs/ReaderTReexport.hs +4/−0
- html-test/Main.hs +62/−0
- html-test/ref/A.html +192/−0
- html-test/ref/B.html +174/−0
- html-test/ref/Bold.html +104/−0
- html-test/ref/Bug1.html +107/−0
- html-test/ref/Bug1004.html +2216/−0
- html-test/ref/Bug1033.html +226/−0
- html-test/ref/Bug1035.html +150/−0
- html-test/ref/Bug1050.html +116/−0
- html-test/ref/Bug1054.html +96/−0
- html-test/ref/Bug1063.html +104/−0
- html-test/ref/Bug1067A.html +120/−0
- html-test/ref/Bug1067B.html +90/−0
- html-test/ref/Bug1103.html +560/−0
- html-test/ref/Bug195.html +188/−0
- html-test/ref/Bug2.html +68/−0
- html-test/ref/Bug201.html +109/−0
- html-test/ref/Bug253.html +104/−0
- html-test/ref/Bug26.html +216/−0
- html-test/ref/Bug280.html +84/−0
- html-test/ref/Bug294.html +378/−0
- html-test/ref/Bug298.html +146/−0
- html-test/ref/Bug3.html +87/−0
- html-test/ref/Bug308.html +118/−0
- html-test/ref/Bug308CrossModule.html +96/−0
- html-test/ref/Bug310.html +110/−0
- html-test/ref/Bug313.html +139/−0
- html-test/ref/Bug335.html +136/−0
- html-test/ref/Bug4.html +86/−0
- html-test/ref/Bug458.html +88/−0
- html-test/ref/Bug466.html +252/−0
- html-test/ref/Bug546.html +281/−0
- html-test/ref/Bug548.html +636/−0
- html-test/ref/Bug574.html +94/−0
- html-test/ref/Bug6.html +340/−0
- html-test/ref/Bug613.html +284/−0
- html-test/ref/Bug647.html +110/−0
- html-test/ref/Bug679.html +208/−0
- html-test/ref/Bug7.html +215/−0
- html-test/ref/Bug8.html +154/−0
- html-test/ref/Bug85.html +142/−0
- html-test/ref/Bug865.html +92/−0
- html-test/ref/Bug923.html +204/−0
- html-test/ref/Bug952.html +82/−0
- html-test/ref/Bug953.html +154/−0
- html-test/ref/Bug973.html +178/−0
- html-test/ref/BugDeprecated.html +200/−0
- html-test/ref/BugExportHeadings.html +234/−0
- html-test/ref/Bugs.html +84/−0
- html-test/ref/BundledPatterns.html +464/−0
- html-test/ref/BundledPatterns2.html +462/−0
- html-test/ref/ConstructorArgs.html +728/−0
- html-test/ref/ConstructorPatternExport.html +124/−0
- html-test/ref/CrossPackageDocs.html +287/−0
- html-test/ref/DefaultAssociatedTypes.html +160/−0
- html-test/ref/DefaultSignatures.html +186/−0
- html-test/ref/DeprecatedClass.html +166/−0
- html-test/ref/DeprecatedData.html +196/−0
- html-test/ref/DeprecatedFunction.html +114/−0
- html-test/ref/DeprecatedFunction2.html +88/−0
- html-test/ref/DeprecatedFunction3.html +88/−0
- html-test/ref/DeprecatedModule.html +84/−0
- html-test/ref/DeprecatedModule2.html +78/−0
- html-test/ref/DeprecatedNewtype.html +162/−0
- html-test/ref/DeprecatedReExport.html +135/−0
- html-test/ref/DeprecatedRecord.html +154/−0
- html-test/ref/DeprecatedTypeFamily.html +112/−0
- html-test/ref/DeprecatedTypeSynonym.html +120/−0
- html-test/ref/DuplicateRecordFields.html +164/−0
- html-test/ref/Examples.html +179/−0
- html-test/ref/Extensions.html +88/−0
- html-test/ref/FunArgs.html +298/−0
- html-test/ref/GADTRecords.html +232/−0
- html-test/ref/GadtConstructorArgs.html +200/−0
- html-test/ref/Hash.html +443/−0
- html-test/ref/HiddenInstances.html +326/−0
- html-test/ref/HiddenInstancesB.html +186/−0
- html-test/ref/Hyperlinks.html +92/−0
- html-test/ref/Identifiers.html +290/−0
- html-test/ref/IgnoreExports.html +106/−0
- html-test/ref/ImplicitParams.html +120/−0
- html-test/ref/Instances.html +2152/−0
- html-test/ref/LinearTypes.html +114/−0
- html-test/ref/Math.html +114/−0
- html-test/ref/Minimal.html +348/−0
- html-test/ref/ModuleWithWarning.html +84/−0
- html-test/ref/NamedDoc.html +70/−0
- html-test/ref/NamespacedIdentifiers.html +150/−0
- html-test/ref/Nesting.html +364/−0
- html-test/ref/NoLayout.html +90/−0
- html-test/ref/NonGreedy.html +86/−0
- html-test/ref/Operators.html +532/−0
- html-test/ref/OrphanInstances.html +116/−0
- html-test/ref/OrphanInstancesClass.html +136/−0
- html-test/ref/OrphanInstancesType.html +138/−0
- html-test/ref/PR643.html +86/−0
- html-test/ref/PR643_1.html +86/−0
- html-test/ref/PatternSyns.html +379/−0
- html-test/ref/PromotedTypes.html +210/−0
- html-test/ref/Properties.html +96/−0
- html-test/ref/PruneWithWarning.html +71/−0
- html-test/ref/QuantifiedConstraints.html +108/−0
- html-test/ref/QuasiExpr.html +350/−0
- html-test/ref/QuasiQuote.html +68/−0
- html-test/ref/SectionLabels.html +96/−0
- html-test/ref/SpuriousSuperclassConstraints.html +246/−0
- html-test/ref/TH.html +70/−0
- html-test/ref/TH2.html +66/−0
- html-test/ref/Table.html +248/−0
- html-test/ref/Test.html +2418/−0
- html-test/ref/Threaded.html +99/−0
- html-test/ref/Threaded_TH.html +104/−0
- html-test/ref/Ticket112.html +86/−0
- html-test/ref/Ticket61.html +84/−0
- html-test/ref/Ticket75.html +122/−0
- html-test/ref/TitledPicture.html +116/−0
- html-test/ref/TypeFamilies.html +1928/−0
- html-test/ref/TypeFamilies2.html +400/−0
- html-test/ref/TypeFamilies3.html +368/−0
- html-test/ref/TypeOperators.html +200/−0
- html-test/ref/UnboxedStuff.html +206/−0
- html-test/ref/Unicode.html +86/−0
- html-test/ref/Unicode2.html +108/−0
- html-test/ref/Visible.html +70/−0
- html-test/ref/mini_A.html +61/−0
- html-test/ref/mini_AdvanceTypes.html +35/−0
- html-test/ref/mini_B.html +47/−0
- html-test/ref/mini_Bug1.html +35/−0
- html-test/ref/mini_Bug2.html +33/−0
- html-test/ref/mini_Bug3.html +33/−0
- html-test/ref/mini_Bug4.html +33/−0
- html-test/ref/mini_Bug6.html +67/−0
- html-test/ref/mini_Bug7.html +43/−0
- html-test/ref/mini_Bug8.html +65/−0
- html-test/ref/mini_BugDeprecated.html +63/−0
- html-test/ref/mini_BugExportHeadings.html +75/−0
- html-test/ref/mini_Bugs.html +35/−0
- html-test/ref/mini_CrossPackageDocs.html +45/−0
- html-test/ref/mini_DeprecatedClass.html +43/−0
- html-test/ref/mini_DeprecatedData.html +43/−0
- html-test/ref/mini_DeprecatedFunction.html +39/−0
- html-test/ref/mini_DeprecatedFunction2.html +33/−0
- html-test/ref/mini_DeprecatedFunction3.html +33/−0
- html-test/ref/mini_DeprecatedModule.html +33/−0
- html-test/ref/mini_DeprecatedModule2.html +33/−0
- html-test/ref/mini_DeprecatedNewtype.html +43/−0
- html-test/ref/mini_DeprecatedReExport.html +37/−0
- html-test/ref/mini_DeprecatedRecord.html +35/−0
- html-test/ref/mini_DeprecatedTypeFamily.html +43/−0
- html-test/ref/mini_DeprecatedTypeSynonym.html +43/−0
- html-test/ref/mini_Examples.html +33/−0
- html-test/ref/mini_FunArgs.html +57/−0
- html-test/ref/mini_GADTRecords.html +35/−0
- html-test/ref/mini_Hash.html +73/−0
- html-test/ref/mini_HiddenInstances.html +43/−0
- html-test/ref/mini_HiddenInstancesB.html +43/−0
- html-test/ref/mini_Hyperlinks.html +33/−0
- html-test/ref/mini_IgnoreExports.html +39/−0
- html-test/ref/mini_Math.html +33/−0
- html-test/ref/mini_ModuleWithWarning.html +33/−0
- html-test/ref/mini_NamedDoc.html +27/−0
- html-test/ref/mini_NoLayout.html +33/−0
- html-test/ref/mini_NonGreedy.html +33/−0
- html-test/ref/mini_Properties.html +33/−0
- html-test/ref/mini_PruneWithWarning.html +27/−0
- html-test/ref/mini_QuasiExpr.html +61/−0
- html-test/ref/mini_QuasiQuote.html +33/−0
- html-test/ref/mini_SpuriousSuperclassConstraints.html +35/−0
- html-test/ref/mini_TH.html +33/−0
- html-test/ref/mini_TH2.html +33/−0
- html-test/ref/mini_Test.html +259/−0
- html-test/ref/mini_Ticket112.html +33/−0
- html-test/ref/mini_Ticket253_1.html +31/−0
- html-test/ref/mini_Ticket253_2.html +39/−0
- html-test/ref/mini_Ticket61.html +35/−0
- html-test/ref/mini_Ticket75.html +41/−0
- html-test/ref/mini_TitledPicture.html +39/−0
- html-test/ref/mini_TypeFamilies.html +107/−0
- html-test/ref/mini_TypeOperators.html +97/−0
- html-test/ref/mini_Unicode.html +33/−0
- html-test/ref/mini_Visible.html +33/−0
- html-test/src/A.hs +18/−0
- html-test/src/B.hs +9/−0
- html-test/src/Bold.hs +10/−0
- html-test/src/Bug1.hs +7/−0
- html-test/src/Bug1004.hs +4/−0
- html-test/src/Bug1033.hs +12/−0
- html-test/src/Bug1035.hs +10/−0
- html-test/src/Bug1050.hs +12/−0
- html-test/src/Bug1054.hs +6/−0
- html-test/src/Bug1063.hs +10/−0
- html-test/src/Bug1067A.hs +10/−0
- html-test/src/Bug1067B.hs +5/−0
- html-test/src/Bug1103.hs +25/−0
- html-test/src/Bug195.hs +12/−0
- html-test/src/Bug2.hs +5/−0
- html-test/src/Bug201.hs +29/−0
- html-test/src/Bug253.hs +11/−0
- html-test/src/Bug26.hs +30/−0
- html-test/src/Bug280.hs +12/−0
- html-test/src/Bug294.hs +38/−0
- html-test/src/Bug298.hs +23/−0
- html-test/src/Bug3.hs +7/−0
- html-test/src/Bug308.hs +22/−0
- html-test/src/Bug308CrossModule.hs +18/−0
- html-test/src/Bug310.hs +5/−0
- html-test/src/Bug313.hs +38/−0
- html-test/src/Bug335.hs +27/−0
- html-test/src/Bug4.hs +6/−0
- html-test/src/Bug458.hs +7/−0
- html-test/src/Bug466.hs +10/−0
- html-test/src/Bug546.hs +56/−0
- html-test/src/Bug548.hs +4/−0
- html-test/src/Bug6.hs +24/−0
- html-test/src/Bug613.hs +17/−0
- html-test/src/Bug647.hs +7/−0
- html-test/src/Bug679.hs +25/−0
- html-test/src/Bug7.hs +14/−0
- html-test/src/Bug745.hs +9/−0
- html-test/src/Bug8.hs +16/−0
- html-test/src/Bug85.hs +15/−0
- html-test/src/Bug865.hs +10/−0
- html-test/src/Bug923.hs +12/−0
- html-test/src/Bug952.hs +6/−0
- html-test/src/Bug953.hs +18/−0
- html-test/src/Bug975.hs +16/−0
- html-test/src/BugDeprecated.hs +27/−0
- html-test/src/BugExportHeadings.hs +30/−0
- html-test/src/Bugs.hs +4/−0
- html-test/src/BundledPatterns.hs +111/−0
- html-test/src/BundledPatterns2.hs +10/−0
- html-test/src/ConstructorArgs.hs +57/−0
- html-test/src/ConstructorPatternExport.hs +27/−0
- html-test/src/DefaultAssociatedTypes.hs +15/−0
- html-test/src/DefaultSignatures.hs +20/−0
- html-test/src/DeprecatedClass.hs +16/−0
- html-test/src/DeprecatedData.hs +16/−0
- html-test/src/DeprecatedFunction.hs +11/−0
- html-test/src/DeprecatedFunction2.hs +7/−0
- html-test/src/DeprecatedFunction3.hs +7/−0
- html-test/src/DeprecatedModule.hs +6/−0
- html-test/src/DeprecatedModule2.hs +5/−0
- html-test/src/DeprecatedNewtype.hs +11/−0
- html-test/src/DeprecatedReExport.hs +17/−0
- html-test/src/DeprecatedRecord.hs +10/−0
- html-test/src/DeprecatedTypeFamily.hs +10/−0
- html-test/src/DeprecatedTypeSynonym.hs +10/−0
- html-test/src/DuplicateRecordFields.hs +26/−0
- html-test/src/Examples.hs +40/−0
- html-test/src/Extensions.hs +8/−0
- html-test/src/FunArgs.hs +39/−0
- html-test/src/GADTRecords.hs +12/−0
- html-test/src/GadtConstructorArgs.hs +14/−0
- html-test/src/Hash.hs +52/−0
- html-test/src/Hidden.hs +7/−0
- html-test/src/HiddenInstances.hs +36/−0
- html-test/src/HiddenInstancesA.hs +18/−0
- html-test/src/HiddenInstancesB.hs +3/−0
- html-test/src/Hyperlinks.hs +9/−0
- html-test/src/Identifiers.hs +36/−0
- html-test/src/IgnoreExports.hs +14/−0
- html-test/src/ImplicitParams.hs +14/−0
- html-test/src/Instances.hs +100/−0
- html-test/src/LinearTypes.hs +15/−0
- html-test/src/Math.hs +15/−0
- html-test/src/Minimal.hs +54/−0
- html-test/src/ModuleWithWarning.hs +6/−0
- html-test/src/NamedDoc.hs +5/−0
- html-test/src/NamespacedIdentifiers.hs +14/−0
- html-test/src/Nesting.hs +137/−0
- html-test/src/NoLayout.hs +13/−0
- html-test/src/NonGreedy.hs +6/−0
- html-test/src/Operators.hs +69/−0
- html-test/src/OrphanInstances.hs +9/−0
- html-test/src/OrphanInstancesClass.hs +5/−0
- html-test/src/OrphanInstancesType.hs +4/−0
- html-test/src/PR643.hs +4/−0
- html-test/src/PR643_1.hs +8/−0
- html-test/src/PatternSyns.hs +34/−0
- html-test/src/PromotedTypes.hs +26/−0
- html-test/src/Properties.hs +10/−0
- html-test/src/PruneWithWarning.hs too large to diff
- html-test/src/QuantifiedConstraints.hs too large to diff
- html-test/src/QuasiExpr.hs too large to diff
- html-test/src/QuasiQuote.hs too large to diff
- html-test/src/SectionLabels.hs too large to diff
- html-test/src/SpuriousSuperclassConstraints.hs too large to diff
- html-test/src/TH.hs too large to diff
- html-test/src/TH2.hs too large to diff
- html-test/src/Table.hs too large to diff
- html-test/src/Test.hs too large to diff
- html-test/src/Threaded.hs too large to diff
- html-test/src/Threaded_TH.hs too large to diff
- html-test/src/Ticket112.hs too large to diff
- html-test/src/Ticket61.hs too large to diff
- html-test/src/Ticket61_Hidden.hs too large to diff
- html-test/src/Ticket75.hs too large to diff
- html-test/src/TitledPicture.hs too large to diff
- html-test/src/TypeFamilies.hs too large to diff
- html-test/src/TypeFamilies2.hs too large to diff
- html-test/src/TypeFamilies3.hs too large to diff
- html-test/src/TypeOperators.hs too large to diff
- html-test/src/UnboxedStuff.hs too large to diff
- html-test/src/Unicode.hs too large to diff
- html-test/src/Unicode2.hs too large to diff
- html-test/src/Visible.hs too large to diff
- html/Classic.theme/haskell_icon.gif too large to diff
- html/Classic.theme/minus.gif too large to diff
- html/Classic.theme/plus.gif too large to diff
- html/Classic.theme/xhaddock.css too large to diff
- html/Ocean.std-theme/hslogo-16.png too large to diff
- html/Ocean.std-theme/minus.gif too large to diff
- html/Ocean.std-theme/ocean.css too large to diff
- html/Ocean.std-theme/plus.gif too large to diff
- html/Ocean.std-theme/synopsis.png too large to diff
- html/frames.html too large to diff
- html/haddock-util.js too large to diff
- hypsrc-test/Main.hs too large to diff
- hypsrc-test/ref/src/Bug1091.html too large to diff
- hypsrc-test/ref/src/CPP.html too large to diff
- hypsrc-test/ref/src/CallingQuotes.html too large to diff
- hypsrc-test/ref/src/Classes.html too large to diff
- hypsrc-test/ref/src/Constructors.html too large to diff
- hypsrc-test/ref/src/Identifiers.html too large to diff
- hypsrc-test/ref/src/LinkingIdentifiers.html too large to diff
- hypsrc-test/ref/src/Literals.html too large to diff
- hypsrc-test/ref/src/Operators.html too large to diff
- hypsrc-test/ref/src/Polymorphism.html too large to diff
- hypsrc-test/ref/src/PositionPragmas.html too large to diff
- hypsrc-test/ref/src/Quasiquoter.html too large to diff
- hypsrc-test/ref/src/Records.html too large to diff
- hypsrc-test/ref/src/TemplateHaskellQuasiquotes.html too large to diff
- hypsrc-test/ref/src/TemplateHaskellSplices.html too large to diff
- hypsrc-test/ref/src/Types.html too large to diff
- hypsrc-test/ref/src/UsingQuasiquotes.html too large to diff
- hypsrc-test/src/Bug1091.hs too large to diff
- hypsrc-test/src/CPP.hs too large to diff
- hypsrc-test/src/Classes.hs too large to diff
- hypsrc-test/src/Constructors.hs too large to diff
- hypsrc-test/src/Identifiers.hs too large to diff
- hypsrc-test/src/Include1For1091.h too large to diff
- hypsrc-test/src/Include2For1091.h too large to diff
- hypsrc-test/src/LinkingIdentifiers.hs too large to diff
- hypsrc-test/src/Literals.hs too large to diff
- hypsrc-test/src/Operators.hs too large to diff
- hypsrc-test/src/Polymorphism.hs too large to diff
- hypsrc-test/src/PositionPragmas.hs too large to diff
- hypsrc-test/src/Quasiquoter.hs too large to diff
- hypsrc-test/src/Records.hs too large to diff
- hypsrc-test/src/TemplateHaskellQuasiquotes.hs too large to diff
- hypsrc-test/src/TemplateHaskellSplices.hs too large to diff
- hypsrc-test/src/Types.hs too large to diff
- hypsrc-test/src/UsingQuasiquotes.hs too large to diff
- latex-test/Main.hs too large to diff
- latex-test/ref/ConstructorArgs/ConstructorArgs.tex too large to diff
- latex-test/ref/DefaultSignatures/DefaultSignatures.tex too large to diff
- latex-test/ref/Deprecated/Deprecated.tex too large to diff
- latex-test/ref/Example/Example.tex too large to diff
- latex-test/ref/GadtConstructorArgs/GadtConstructorArgs.tex too large to diff
- latex-test/ref/LinearTypes/LinearTypes.tex too large to diff
- latex-test/ref/LinearTypes/main.tex too large to diff
- latex-test/ref/NamespacedIdentifier/NamespacedIdentifiers.tex too large to diff
- latex-test/ref/Simple/Simple.tex too large to diff
- latex-test/ref/TypeFamilies3/TypeFamilies3.tex too large to diff
- latex-test/ref/UnboxedStuff/UnboxedStuff.tex too large to diff
- latex-test/src/ConstructorArgs/ConstructorArgs.hs too large to diff
- latex-test/src/DefaultSignatures/DefaultSignatures.hs too large to diff
- latex-test/src/Deprecated/Deprecated.hs too large to diff
- latex-test/src/Example/Example.hs too large to diff
- latex-test/src/GadtConstructorArgs/GadtConstructorArgs.hs too large to diff
- latex-test/src/LinearTypes/LinearTypes.hs too large to diff
- latex-test/src/NamespacedIdentifier/NamespacedIdentifier.hs too large to diff
- latex-test/src/Simple/Simple.hs too large to diff
- latex-test/src/TypeFamilies3/TypeFamilies3.hs too large to diff
- latex-test/src/UnboxedStuff/UnboxedStuff.hs too large to diff
- latex/haddock.sty too large to diff
- src/Documentation/Haddock.hs too large to diff
- src/Haddock/Backends/HaddockDB.hs too large to diff
- src/Haddock/Backends/Hoogle.hs too large to diff
- src/Haddock/Backends/LaTeX.hs too large to diff
- src/Haddock/Backends/Xhtml.hs too large to diff
- src/Haddock/Backends/Xhtml/Decl.hs too large to diff
- src/Haddock/Backends/Xhtml/DocMarkup.hs too large to diff
- src/Haddock/Backends/Xhtml/Layout.hs too large to diff
- src/Haddock/Backends/Xhtml/Names.hs too large to diff
- src/Haddock/Backends/Xhtml/Themes.hs too large to diff
- src/Haddock/Backends/Xhtml/Types.hs too large to diff
- src/Haddock/Backends/Xhtml/Utils.hs too large to diff
- src/Haddock/Convert.hs too large to diff
- src/Haddock/Doc.hs too large to diff
- src/Haddock/GhcUtils.hs too large to diff
- src/Haddock/Interface.hs too large to diff
- src/Haddock/Interface/AttachInstances.hs too large to diff
- src/Haddock/Interface/Create.hs too large to diff
- src/Haddock/Interface/LexParseRn.hs too large to diff
- src/Haddock/Interface/ParseModuleHeader.hs too large to diff
- src/Haddock/Interface/Rename.hs too large to diff
- src/Haddock/InterfaceFile.hs too large to diff
- src/Haddock/Lex.x too large to diff
- src/Haddock/ModuleTree.hs too large to diff
- src/Haddock/Options.hs too large to diff
- src/Haddock/Parse.y too large to diff
- src/Haddock/Types.hs too large to diff
- src/Haddock/Utils.hs too large to diff
- src/Haddock/Version.hs too large to diff
- src/Main.hs too large to diff
- src/haddock.sh too large to diff
- tests/html-tests/runtests.hs too large to diff
@@ -1,523 +0,0 @@-Changes in version 2.11.0-- * Show deprecation messages for identifiers-- * List identifiers declared on the same line (with a common type) separately-- * Don't crash on unicode strings in doc comments-- * Fix reporting of modules safe haskell mode-- * Fix a case where we were generating invalid xhtml -- * Improved --qual option (no crashes, proper error messages)-- * A new --qual option "aliased" which qualifies identifers by the module alias- used in the source code-- * The Haddock API restores GHC's static flags after invocation-- * Access to unexported identifiers through the Haddock API again--Changes in version 2.10.0-- * Require GHC >= 7.4-- * Safe Haskell indications on module pages-- * Type declarations on identifiers no longer necessary-- * Add flag --interface-version-- * Warn when comment refers to in-scope identifier without documentation-- * Bug fix: links to out-of-scope things (#78)-- * Bug fix: module references to other packages work again--Changes in version 2.9.4-- * Require GHC >= 7.2-- * Support Alex 3.x--Changes in version 2.9.3-- [This is the version that comes with GHC 7.2.1 although it claims it's 2.9.2!]-- * Build with GHC 7.2.1-- * Support blank lines in results of examples-- * A type signature for multiple names generates one signature in the output-- * Minor bug fixes--Changes in version 2.9.2-- * Build with GHC 7.0.2-- * Write Hoogle output in utf8; fixes GHC build on Windows--Changes in version 2.9.1-- * Fix build in GHC tree-- * Improve .cabal file--Changes in version 2.9.0-- * Drop support for ghc < 7-- * New flag --qual for qualification of names-- * Print doc coverage information to stdout when generating docs-- * Include an 'All' option in the A-Z subdivided index-- * Make TOC group header identifiers validate-- * Minor changes to the API--Changes in the version that comes with GHC 7.0.1- - [This version claims it is 2.8.0 but is actually based on 2.8.1]-- * Fix URL creation on Windows: Use / not \ in URLs.-- * Support GHC 7.0--Changes in version 2.8.1-- * Fix build on Windows with MinGW--Changes in version 2.8.0-- * HTML backend completely rewritten to generate semantically rich XHTML- using the xhtml package.-- * New default CSS based on the color scheme chosen for the new Haskell- wiki, with a pull-out tab for the synopsis.-- * Theme engine based on CSS files. Themes can be switched from the- header menu. (New flags --built-in-themes and --theme. The latter- is an alias for --css which now has extended semantics).-- * Markup support for executable examples/unit-tests. To be used with an- upcoming version of the DocTest program.-- * Addition of a LaTeX backend.-- * Frames-mode can be enabled from the header menu.-- * Path to source entities can be specified per package, so that source- links work for cross-package documentation.-- * Support for a second form of enumerated lists (1. 2. etc).-- * Additions and changes to the Haddock API.-- * New flag --no-tmp-comp-dir to tell Haddock to write and pick up- compilation files (.o, .hi, etc) to/from GHC's output directory instead- of a temporary directory.-- * Various bug fixes.---------------------------------------------------------------------------------Changes in version 2.6.1 (bug fix release from the stable branch)-- * Fix #128---------------------------------------------------------------------------------Changes in version 2.7.2-- * Add Paths_haddock to library---------------------------------------------------------------------------------Changes in version 2.7.1:-- * Fix problems with library part of .cabal file---------------------------------------------------------------------------------Changes in version 2.7.0:-- * Instances can be commented-- * The Haddock API now exposes more of the internals of Haddock-- * Bug fixes (most importantly #128)---------------------------------------------------------------------------------Changes in version 2.6.0:-- * Drop support for GHC 6.10.*-- * Add support for GHC 6.12.1-- * Cross-package documentation: full documentation show up when re-exporting- things coming from external packages-- * Lexing and parsing the Haddock comment markup is now done in Haddock- again, instead of in GHC-- * Slightly prettier printing of instance heads-- * Support platforms for which GHC has no native code generator-- * Add a flag --print-ghc-libdir-- * Minor bug fixes---------------------------------------------------------------------------------Changed in version 2.5.0:-- * Drop support for GHC 6.8.*-- * Add support for GHC 6.10.3 and 6.10.4-- * Revert to the old multi-page index for large packages (#106)-- * Show GADT records in the generated documentation-- * Create output directory if it doesn't exist (#104)-- * Use the native codegen instead of compiling via C for TH modules-- * Add --use-unicode flag for displaying prettier versions of common symbols-- * Mutiple verbosity levels: remove --verbose and add --verbosity=n---------------------------------------------------------------------------------Changed in version 2.4.2:-- * Support GHC 6.10.2-- * Haddock no longer crashes on Template Haskell modules (#68)- (only with GHC 6.10.2 or above)-- * Fix problem with Template Haskell-generated declarations disappearing (#59)-- * Generate two anchors for each link for compatibility between IE and Opera- (#45)-- * Improved error messages-- * Show re-exports from external packages again (GHC ticket #2746)-- * Store hidden modules in .haddock files again (needed by the haddock- library)-- * Avoid processing boot modules-- * Pragmas may exist between document comments and declarations-- * Do not indicate that a constructor argument is unboxed-- * Fix problem with with non-working links to ghc-prim-- * Allow referring to a specific section within a module in a module link- (#65)-- * Fixes to the Hoogle backend- - * Improvements to the haddock library-- * Many other fixes (including #67, #69, #58, #57)---------------------------------------------------------------------------------Changed in version 2.4.1:-- * Depend on base 4.* when GHC >= 6.9, otherwise 3.*---------------------------------------------------------------------------------Changed in version 2.4.0:-- * Add framed view of the HTML documentation-- * Build with GHC 6.8.2 and 6.8.3 again-- * Support images in documentation comments again-- * Small improvements to the Hoogle output-- * A few bugs has been fixed---------------------------------------------------------------------------------Changed in version 2.3.0:-- * Support for GHC 6.10.1-- * Slightly improved space usage-- * Fix a bug that made hidden modules show up in the contents & index pages-- * Fix a bug that made Haddock load modules twice-- * Improvements to the Hoogle output---------------------------------------------------------------------------------Changed in version 2.2.2:-- * Relax version dependency on ghc-paths---------------------------------------------------------------------------------Changes in version 2.2.1:-- * Support for GHC 6.8.3-- * The Hoogle backend is back, thanks to Neil Mitchell. The plan is to be- compatible with the upcoming Hoogle 4 pre-release-- * Show associated types in the documentation for class declarations-- * Show type family declarations-- * Show type equality predicates-- * Major bug fixes (#1 and #44)-- * It is no longer required to specify the path to GHC's lib dir-- * Remove unnecessary parenthesis in type signatures---------------------------------------------------------------------------------Changes in version 2.1.0:-- * Fix a bug that made links point to the defining module instead- of the "best" one (e.g Int pointing to GHC.Base instead of Data.Int)-- * Fix a couple of smaller bugs-- * The representation of DocName was changed in the library-- * Add a flag --no-warnings for turning off warnings---------------------------------------------------------------------------------Changes in version 2.0.0.0:-- * The GHC API is used as the front-end-- * Haddock now understands all syntax understood by GHC 6.8.2-- * Haddock can generate documentation for some of the language extensions- in GHC 6.8.2-- * Format of module attributes has changed. The only way of specifiying- module attributes is via a new OPTIONS_HADDOCK pragma. Example: - {-# OPTIONS_HADDOCK hide, prune #-}-- * Haddock understands literate source files-- * Add a small library to read Haddock's interface files-- * Add a flag -B for passing the path to the GHC lib dir-- * Add a flag --optghc for passing options to GHC-- * Add a flag --ghc-version for printing the GHC version-- * Remove --use-package, --allow-missing-html, --ghc-pkg, in favour of only- supporting --read-interface-- * Remove --package flag, the GHC flag -package-name can be used instead-- * Remove --no-implicit-prelude flag, the GHC flag -XNoImplicitPrelude can- be used instead---------------------------------------------------------------------------------Changes in version 0.9:-- * Infix type operators, e.g., first :: a~>a' -> (a,b)~>(a',b)-- * Add a search box to the index page which automatically narrows- the index to the search as you type (thanks to Neil Mitchell).-- * Add a --ghc-pkg flag-- * Add a flag --allow-missing-html-- * URL expansion for %%, %L, %{LINE}-- * added substitution %{FILE///c}-- * Lexing of /.../ is now more like '...', in that a / character must- be matched by another / character on the same line, otherwise it- is treated as a literal '/'. This removes a common source of- accidental parse errors in documentation.-- * Various bugs were fixed.-- * Cabal 1.2 is now required, and Haddock builds with GHC 6.8.x.---------------------------------------------------------------------------------Changes in version 0.8:-- * Haddock has a Cabal build system, and will build on Windows without- Cygwin or MSYS. GHC 6.4 or later is required.-- * New options: --comments-base, --comments-module, --comments-entity- for generating links to pages (eg. wiki) for collecting user comments.-- * New options: --source-base, --source-module, --source-entity- for generating links to source code. Haddock now understands- {-# LINE #-} pragmas, which means it can figure out the correct- name for the source file even if the file is preprocessed.-- * Haddock generates output for populating the Hoogle search engine.-- * New markup <<url>> for including images.---------------------------------------------------------------------------------Changes in version 0.7:-- * Changes in the way Haddock decides where to direct hyperlinks. Each entity- is now assigned a single "home" module, and all hyperlinks are directed- to that module. See the docs ("Hyperlinking and re-exported entities")- for details.-- * New options --ignore-all-exports, --hide-- * New option --use-package for creating documentation that hyperlinks to- the HTML documentation for existing packages on your system. It works- by querying ghc-pkg for the location of the Haddock interface and- HTML for the given package.-- * Parts of the HTML documentation, notably lists of instances, are- now "collapsible" with a +/- button. Also, the contents page is now- in the form of tree in which subtrees can be collapsed.-- * Support for Microsoft DevHelp and HtmlHelp 2.0 formats.-- * Support for a short description for each module for the contents page.-- * Compiles with GHC 6.4+-- * Various bugfixes---------------------------------------------------------------------------------Changes in version 0.6:-- * Implicit parameters, zip comprehensions and 'mdo' are now- supported by the parser.-- * Some lexical bugs were fixed, mainly concerning literal paragraphs- next to non-literal paragraphs.-- * New options: --gen-index, --use-index, --gen-contents and --use-contents,- for generting a combined index and contents for several libraries- from the appropriate .haddock files.-- * There is now one index rather than separate Function/Constructor and- Type/Class indices. Where a name refers to several entities, these- are listed separately in the index.-- * New option: -v, elicits more verbose warnings. Some warnings are- now turned off by default; Haddock should be a little less noisy- in general.-- * Markup for definition lists has been added. See the documentation - for details.-- * New option: --package for setting the package name. The package- is listed alongside each module name in the combined contents.-- * Entities which are re-exported from another package now at least- leave a hyperlink in the generated HTML, rather than nothing at all.-- * Some fixes for bugs which caused incorrect hyperlinks in the- generated HTML. In particular, instances should now be linked- correctly.-- * Some aesthetic improvements to the generated HTML.---------------------------------------------------------------------------------Changes in version 0.5:-- * Compiles with recent versions of GHC.-- * A few bugs have been fixed.-- * New labelling/linking feature (see "Anchors" in the manual).---------------------------------------------------------------------------------Changes in version 0.4:-- * Import declarations which list entities in parentheses, or with- hiding clauses, are now properly supported. Modulo one or two- small infelicities, the full Haskell modules system is now supported.-- * Haddock is now more flexible about the placing of separators- (commas, semicolons) in relation to doc comments.-- * There is support for generating and reading "interface files"- which describe the exports of a set of modules. This is useful- for generating documentation which hyperlinks to- previously-generated documentation.- - * Support for generating the extra files required by the Microsoft- Help compiler.-- * New option: --prologue specifies a file of documentation which is- placed on the contents page.-- * Many bugs fixed--------------------------------------------------------------------------------Changes in version 0.3:- - * Documentation on individual function arguments is now implemented - - * Links can be made to identifiers that aren't in scope, by using- the fully qualified name.-- * Instances are collected and listed with the appropriate classes- and datatypes (not for derived instances yet).-- * Single quotes are only interpreted specially when they surround a- legal Haskell identifier, otherwise they are treated literally.-- * Bird-tracked text is now literal. If you want marked-up text in- a code block, use the @...@ notation instead.-- * Various changes to the layout, it generally looks nicer now.-- * Various bugs fixed.--------------------------------------------------------------------------------Changes in version 0.2:-- * The [...] markup for typewriter font has been changed to @...@.-- * Module attributes introduced (see the documentation for details).-- * {- ... -} style comments may now be used for documentation annotations-- * Recursive modules are detected and reported as an error.-- * Existential constructors and rank-N types are now groked by the parser-- * Some type rendering cleaned up-- * `abc' is accepted as well as 'abc' to markup an identifier-- * Several bugs fixed, and error messages improved.
@@ -0,0 +1,893 @@+## Changes in 2.29.1+ * Fix build on GHC 9.2++## Changes in 2.29.0+ * Fixes for memory leaks and performance improvements++## Changes in 2.28.0+ * Support qualified and unqualified names in `--ignore-link-symbol`++## Changes in 2.24.0++ * Reify oversaturated data family instances correctly (#1103)++ * Removed the majority of Haddock's possible `panic` routes through+ the TTG refactor to make extension variants empty++## Changes in 2.23.0++ * "Linuwial" is the new default theme (#721, #782, #949)++ * Fix style switcher (enabled by `--built-in-themes`) (#949)++ * Support inline markup in markdown-style links (#875)++ * The hyperlinker backend has been re-engineered to use HIE files+ and display type annotations on expressions (#977)++ * The hyperlinker backend lexer is now more incremental, faster, and+ more memory efficient (#977)++ * Add an "Instances" menu item to the HTML backend for controlling+ settings related to expanding/collapsing instances (#1007)++ * Improved identifier links including value/type namespaces, and+ hyperlinking of parenthesized/backticked identifiers++ * Substantial bugfixes for converting `TyThing` back into source+ declarations (#1003, #1005, #1022, #1020)++ * `--show-interface` now outputs to stdout (instead of stderr)++ * Render associated type defaults and also improve rendering of+ default method signatures++ * Many fixes to the LaTeX backend, mostly focused on not crashing+ as well as generating LaTeX source that compiles++ * More flexible parsing of the module header++## Changes in version 2.22.0++ * Make `--package-version` optional for `--hoogle` (#899)++ * Support type and data families in the LaTeX backend (#734)++ * Support pattern synonyms in the Hoogle backend (#947)++## Changes in version 2.21.0++ * Overhaul handling of data declarations in XHTML and LaTeX. Adds support for+ documenting individual arguments of constructors/patterns (#709)++ * Actually list all fixities for `--hoogle` (#871)++ * Fix broken instance source links (#869)++ * Avoiding line breaks due to ling line in the output of `--hoogle` (#868)++ * Capture docs on type family instances (#867)++## Changes in version 2.20.0++ * Show where instances are defined (#748)++ * `@since` includes package name (#452, #550, #749)++## Changes in version 2.19.0.1++ * Support for linking unicode operators (#458)++ * Hyperlinker: Fix file handle leak in (#763)++## Changes in version 2.19.0++ * Haddock now supports tables in documentation inspired by reSTs grid tables++ * `--quickjump` allows for quick navigation in documentation on hackage and+ other documentation hosting sites.++ * A --reexport flag, which can be used to add extra modules to the+ top-level module tree++ * Haddock no longer reports coverage statistics for hidden modules. By default+ cabal-install marks all package internal modules as hidden.++ * Haddock now writes additional information about the documentation to `meta.json`++ * Fix renaming of type variables after specializing instance method signatures (#613)++ * Move markup related data types to haddock-library++ * Fix: Show empty constraint contexts in pattern type signatures (#663)++ * Fix: Generate constraint signatures for constructors exported as pattern+ synonyms (#663)++ * The hyperlinker backend now uses the GHC lexer instead of a custom one.+ This notably fixes rendering of quasiquotes.++ * Overhaul Haddock's rendering of kind signatures so that invisible kind+ parameters are not printed (#681) (Fixes #544)++ * Recognise `SPDX-License-Identifier` as alias for `License` in module header+ parser (#743)++ * Remove the response file related utilities, and use the ones that+ come with `base` (Trac #13896)++ * Remove the response file related utilities, and use the ones that+ come with `base` (Trac #13896)++## Changes in version 2.18.1++ * Synopsis is working again (#599)++ * Per-argument documentation on class methods working again (#647)++ * Support user defined signatures on pattern synonyms++ * Support for bundled pattern synonyms (#494, #551, #626)++## Changes in version 2.17.4++ * Fix 'internal error: links: UnhelpfulSpan' (#554, #565)++ * Hyperlink backend knows about `DataKinds` (#510)++ * Fix rendering of class methods for `Eq` and `Ord` (#549)++ * Export `MDoc` and `toInstalledIface` from `Haddock.Types`++## Changes in version 2.17.3.1++ * Disable `NFData` instances for GHC types when GHC >= 8.0.2 (#537)++## Changes in version 2.17.3++ * Remove framed view of the HTML documentation++## Changes in version 2.17.2++ * Fix portability of documentation building within GHC++## Changes in version 2.17.1++ * Included with GHC 8.0.1++ * Fixed Makefile for GHC installation++ * Fixed clean rule of GHC Makefile++## Changes in version 2.17.0 (not released)++ * Support typesetting of mathematical expressions via Mathjax (#397)++ * Describe orphan instances defined in a module in its documentation (#449)++ * Produce specialized type signatures for typeclass methods (#425)++ * Support GCC-like response files (#470)++## Changes in version 2.16.2++ * Generate hyperlinked source ourselves (#410, part of GSOC 2015)++ * Fix expansion icon for user-collapsible sections (#412)++ * Break up response file arguments on newlines++ * Various HTML fixes (#301, #406, #407, #421)++ * Line anchors in hyperlinked source (#420)++## Changes in version 2.16.1++ * Don't default to type constructors for out-of-scope names (#253 and+ #375)++ * Fix Hoogle display of constructors (#361)++ * Fully qualify names in Hoogle instances output (#263)++ * Output method documentation in Hoogle backend (#259)++ * Don't print instance safety information in Hoogle (#168)++ * Expand response files in arguments (#285)++ * Build the main executable with -threaded (#399)++ * Use SrcSpan of declarations for inferred type sigs (#207)++ * Fix cross-module instance locations (#383)++ * Fix alignment of Source link for instances in Firefox (#384)++## Changes in version 2.16.0++ * Experimental collapsible header support (#335)++ * Add support for markdown links and images++ * Allow an optional colon after the closing bracket of definition lists.+ This is to disambiguate them from markdown links and will be require with a+ future release.++ * Fix re-exports of built-in type families (#310)++ * Fix parsing of infix identifiers such as ``elem``.++ * Print missing docs by default and add --no-print-missing-docs++ * parser: now parses out some meta data too, breaking the API++ * parser: markdown syntax for images and URLs is now accepted:+ <<foo>> style for images and <foo bar> style for links is now+ considered deprecated. <foo> for links is still OK.++ * parser: add support for @since element: this is paragraph-level+ element of the form ‘@since x.y.z’ where x.y.z is the version+ number. The way it is rendered is subject to change.++ * properly render package ID (not package key) in index (#329)++ * links to source location of class instance definitions++ * Fix code blocks in presence of Windows line endings++ * Deal better with long synopsis lines (#151)++## Changes in version 2.15.0++ * Always read in prologue files as UTF8 (#286 and Cabal #1721)++ * parser: don't wrap headers in DocParagraph (#307)++ * parser: don't mangle append order for nested lists (pandoc #1346)++ * parser: preserve list ordering in certain scenarios (#313)++ * parser: update the attoparsec version used internally giving slight+ parsing performance boost.++ * Move development to be against latest GHC release and not GHC HEAD.++ * Further split up the package to separate the executable from the+ library, necessary by things like GHCJS. We now have+ ‘haddock-library’ which are the parts that don't use GHC API,+ ‘haddock-api’ which are (some of) the parts that do use GHC API and+ ‘haddock’ which merely provides the executable.++ * Export few extra functions in the API.++ * Add compatibility with GHC 7.8.2.++ * Omit unnecessary ‘forall’s (#315 and #86)++ * Remove some files which were really old or did not belong in the+ repository in the first place.++## Changes in version 2.14.3++ * Fix parsing of identifiers with ^ or ⋆ in them (#298)++ * Fix anchors (#308)++## Changes in version 2.14.2++ * Always drop --split-objs GHC flag for performance reasons (#292)++ * Print kind signatures GADTs (#85)++ * Drop single leading whitespace when reasonable from @-style blocks (#201)++ * Fix crashes associated with exporting data family record selectors (#294)++## Changes in version 2.14.1++ * Render * and -> with their UnicodeSyntax equivalents if -U is enabled++ * Display minimal complete definitions for type classes++ * Hide right hand side of TF instances with hidden names on the RHS++## Changes in version 2.14.0++ * Print entities with missing documentation (#258)++ * Print a warning message when given `-optghc` instead of `--optghc` (#5)++ * Add `--compatible-interface-versions` (#231)++ * Allow to generate latex documentation for FFI declarations (#247)++ * Add copyright and license information to generated documentation++ * Improved to Unicode support++ * Bold markup support++ * Nested paragraphs++ * Better escaping++ * Header markup++ * Parser should no longer fail to parse any markup++ * {-# OPTIONS_HADDOCK show-extensions #-} pragma will show the GHC extensions+ enabled in the module.++ * Properly render License field (#271)++ * Print type/data family instances (for exported types only)++ * Fix display of poly-kinded type operators (#189)++ * PatternSynonyms support++ * Fix display of implicit parameters (#260)++ * Fix rendering of Contents when links are present (#276)++ * Fix documentation duplication on record fields (#195)++ * Add `--source-entity-line` for exact line links (eg. things defined+ inside TH splices) (#79)++ * Display fixity information for names with nonstandard fixities++ * Bird tracks specified like "> code" no longer suffer from an extra leading+ space in the code output++## Changes in version 2.13.2++ * Handle HsExplicitListTy in renamer (#213)++ * Allow haddock markup in deprecation messages++ * Export more types from Documentation.Haddock++ * Include everything that is required to run the test suite with the cabal+ package (#230)++## Changes in version 2.13.1++ * Hide instances that are "internal" to a module++ * Add support for properties in documentation++ * Fix a bug with spurious superclass constraints++ * Fix and extend the Haddock API++## Changes in version 2.12.0++ * Labeled URLs (e.g <http://example.net/ some label>)++ * Improved memory usage (new dependency: deepseq)++## Changes in version 2.11.0++ * Show deprecation messages for identifiers++ * List identifiers declared on the same line (with a common type) separately++ * Don't crash on unicode strings in doc comments++ * Fix reporting of modules safe haskell mode++ * Fix a case where we were generating invalid xhtml++ * Improved --qual option (no crashes, proper error messages)++ * A new --qual option "aliased" which qualifies identifiers by the module alias+ used in the source code++ * The Haddock API restores GHC's static flags after invocation++ * Access to unexported identifiers through the Haddock API again++## Changes in version 2.10.0++ * Require GHC >= 7.4++ * Safe Haskell indications on module pages++ * Type declarations on identifiers no longer necessary++ * Add flag --interface-version++ * Warn when comment refers to in-scope identifier without documentation++ * Bug fix: links to out-of-scope things (#78)++ * Bug fix: module references to other packages work again++## Changes in version 2.9.4++ * Require GHC >= 7.2++ * Support Alex 3.x++## Changes in version 2.9.3++ [This is the version that comes with GHC 7.2.1 although it claims it's 2.9.2!]++ * Build with GHC 7.2.1++ * Support blank lines in results of examples++ * A type signature for multiple names generates one signature in the output++ * Minor bug fixes++## Changes in version 2.9.2++ * Build with GHC 7.0.2++ * Write Hoogle output in utf8; fixes GHC build on Windows++## Changes in version 2.9.1++ * Fix build in GHC tree++ * Improve .cabal file++## Changes in version 2.9.0++ * Drop support for ghc < 7++ * New flag --qual for qualification of names++ * Print doc coverage information to stdout when generating docs++ * Include an 'All' option in the A-Z subdivided index++ * Make TOC group header identifiers validate++ * Minor changes to the API++## Changes in the version that comes with GHC 7.0.1++ [This version claims it is 2.8.0 but is actually based on 2.8.1]++ * Fix URL creation on Windows: Use / not \ in URLs.++ * Support GHC 7.0++## Changes in version 2.8.1++ * Fix build on Windows with MinGW++## Changes in version 2.8.0++ * HTML backend completely rewritten to generate semantically rich XHTML+ using the xhtml package.++ * New default CSS based on the color scheme chosen for the new Haskell+ wiki, with a pull-out tab for the synopsis.++ * Theme engine based on CSS files. Themes can be switched from the+ header menu. (New flags --built-in-themes and --theme. The latter+ is an alias for --css which now has extended semantics).++ * Markup support for executable examples/unit-tests. To be used with an+ upcoming version of the DocTest program.++ * Addition of a LaTeX backend.++ * Frames-mode can be enabled from the header menu.++ * Path to source entities can be specified per package, so that source+ links work for cross-package documentation.++ * Support for a second form of enumerated lists (1. 2. etc).++ * Additions and changes to the Haddock API.++ * New flag --no-tmp-comp-dir to tell Haddock to write and pick up+ compilation files (.o, .hi, etc) to/from GHC's output directory instead+ of a temporary directory.++ * Various bug fixes.++-----------------------------------------------------------------------------++## Changes in version 2.6.1 (bug fix release from the stable branch)++ * Fix #128++-----------------------------------------------------------------------------++## Changes in version 2.7.2++ * Add Paths_haddock to library++-----------------------------------------------------------------------------++## Changes in version 2.7.1:++ * Fix problems with library part of .cabal file++-----------------------------------------------------------------------------++## Changes in version 2.7.0:++ * Instances can be commented++ * The Haddock API now exposes more of the internals of Haddock++ * Bug fixes (most importantly #128)++-----------------------------------------------------------------------------++## Changes in version 2.6.0:++ * Drop support for GHC 6.10.*++ * Add support for GHC 6.12.1++ * Cross-package documentation: full documentation show up when re-exporting+ things coming from external packages++ * Lexing and parsing the Haddock comment markup is now done in Haddock+ again, instead of in GHC++ * Slightly prettier printing of instance heads++ * Support platforms for which GHC has no native code generator++ * Add a flag --print-ghc-libdir++ * Minor bug fixes++-----------------------------------------------------------------------------++Changed in version 2.5.0:++ * Drop support for GHC 6.8.*++ * Add support for GHC 6.10.3 and 6.10.4++ * Revert to the old multi-page index for large packages (#106)++ * Show GADT records in the generated documentation++ * Create output directory if it doesn't exist (#104)++ * Use the native codegen instead of compiling via C for TH modules++ * Add --use-unicode flag for displaying prettier versions of common symbols++ * Multiple verbosity levels: remove --verbose and add --verbosity=n++-----------------------------------------------------------------------------++Changed in version 2.4.2:++ * Support GHC 6.10.2++ * Haddock no longer crashes on Template Haskell modules (#68)+ (only with GHC 6.10.2 or above)++ * Fix problem with Template Haskell-generated declarations disappearing (#59)++ * Generate two anchors for each link for compatibility between IE and Opera+ (#45)++ * Improved error messages++ * Show re-exports from external packages again (GHC ticket #2746)++ * Store hidden modules in .haddock files again (needed by the haddock+ library)++ * Avoid processing boot modules++ * Pragmas may exist between document comments and declarations++ * Do not indicate that a constructor argument is unboxed++ * Fix problem with non-working links to ghc-prim++ * Allow referring to a specific section within a module in a module link+ (#65)++ * Fixes to the Hoogle backend++ * Improvements to the haddock library++ * Many other fixes (including #67, #69, #58, #57)++-----------------------------------------------------------------------------++Changed in version 2.4.1:++ * Depend on base 4.* when GHC >= 6.9, otherwise 3.*++-----------------------------------------------------------------------------++Changed in version 2.4.0:++ * Add framed view of the HTML documentation++ * Build with GHC 6.8.2 and 6.8.3 again++ * Support images in documentation comments again++ * Small improvements to the Hoogle output++ * A few bugs has been fixed++-----------------------------------------------------------------------------++Changed in version 2.3.0:++ * Support for GHC 6.10.1++ * Slightly improved space usage++ * Fix a bug that made hidden modules show up in the contents & index pages++ * Fix a bug that made Haddock load modules twice++ * Improvements to the Hoogle output++-----------------------------------------------------------------------------++Changed in version 2.2.2:++ * Relax version dependency on ghc-paths++-----------------------------------------------------------------------------++## Changes in version 2.2.1:++ * Support for GHC 6.8.3++ * The Hoogle backend is back, thanks to Neil Mitchell. The plan is to be+ compatible with the upcoming Hoogle 4 pre-release++ * Show associated types in the documentation for class declarations++ * Show type family declarations++ * Show type equality predicates++ * Major bug fixes (#1 and #44)++ * It is no longer required to specify the path to GHC's lib dir++ * Remove unnecessary parenthesis in type signatures++-----------------------------------------------------------------------------++## Changes in version 2.1.0:++ * Fix a bug that made links point to the defining module instead+ of the "best" one (e.g Int pointing to GHC.Base instead of Data.Int)++ * Fix a couple of smaller bugs++ * The representation of DocName was changed in the library++ * Add a flag --no-warnings for turning off warnings++-----------------------------------------------------------------------------++## Changes in version 2.0.0.0:++ * The GHC API is used as the front-end++ * Haddock now understands all syntax understood by GHC 6.8.2++ * Haddock can generate documentation for some of the language extensions+ in GHC 6.8.2++ * Format of module attributes has changed. The only way of specifying+ module attributes is via a new OPTIONS_HADDOCK pragma. Example:+ {-# OPTIONS_HADDOCK hide, prune #-}++ * Haddock understands literate source files++ * Add a small library to read Haddock's interface files++ * Add a flag -B for passing the path to the GHC lib dir++ * Add a flag --optghc for passing options to GHC++ * Add a flag --ghc-version for printing the GHC version++ * Remove --use-package, --allow-missing-html, --ghc-pkg, in favour of only+ supporting --read-interface++ * Remove --package flag, the GHC flag -package-name can be used instead++ * Remove --no-implicit-prelude flag, the GHC flag -XNoImplicitPrelude can+ be used instead++-----------------------------------------------------------------------------++## Changes in version 0.9:++ * Infix type operators, e.g., first :: a~>a' -> (a,b)~>(a',b)++ * Add a search box to the index page which automatically narrows+ the index to the search as you type (thanks to Neil Mitchell).++ * Add a --ghc-pkg flag++ * Add a flag --allow-missing-html++ * URL expansion for %%, %L, %{LINE}++ * added substitution %{FILE///c}++ * Lexing of /.../ is now more like '...', in that a / character must+ be matched by another / character on the same line, otherwise it+ is treated as a literal '/'. This removes a common source of+ accidental parse errors in documentation.++ * Various bugs were fixed.++ * Cabal 1.2 is now required, and Haddock builds with GHC 6.8.x.++-----------------------------------------------------------------------------++## Changes in version 0.8:++ * Haddock has a Cabal build system, and will build on Windows without+ Cygwin or MSYS. GHC 6.4 or later is required.++ * New options: --comments-base, --comments-module, --comments-entity+ for generating links to pages (eg. wiki) for collecting user comments.++ * New options: --source-base, --source-module, --source-entity+ for generating links to source code. Haddock now understands+ {-# LINE #-} pragmas, which means it can figure out the correct+ name for the source file even if the file is preprocessed.++ * Haddock generates output for populating the Hoogle search engine.++ * New markup <<url>> for including images.++-----------------------------------------------------------------------------++## Changes in version 0.7:++ * ## Changes in the way Haddock decides where to direct hyperlinks. Each entity+ is now assigned a single "home" module, and all hyperlinks are directed+ to that module. See the docs ("Hyperlinking and re-exported entities")+ for details.++ * New options --ignore-all-exports, --hide++ * New option --use-package for creating documentation that hyperlinks to+ the HTML documentation for existing packages on your system. It works+ by querying ghc-pkg for the location of the Haddock interface and+ HTML for the given package.++ * Parts of the HTML documentation, notably lists of instances, are+ now "collapsible" with a +/- button. Also, the contents page is now+ in the form of tree in which subtrees can be collapsed.++ * Support for Microsoft DevHelp and HtmlHelp 2.0 formats.++ * Support for a short description for each module for the contents page.++ * Compiles with GHC 6.4+++ * Various bugfixes++-----------------------------------------------------------------------------++## Changes in version 0.6:++ * Implicit parameters, zip comprehensions and 'mdo' are now+ supported by the parser.++ * Some lexical bugs were fixed, mainly concerning literal paragraphs+ next to non-literal paragraphs.++ * New options: --gen-index, --use-index, --gen-contents and --use-contents,+ for generting a combined index and contents for several libraries+ from the appropriate .haddock files.++ * There is now one index rather than separate Function/Constructor and+ Type/Class indices. Where a name refers to several entities, these+ are listed separately in the index.++ * New option: -v, elicits more verbose warnings. Some warnings are+ now turned off by default; Haddock should be a little less noisy+ in general.++ * Markup for definition lists has been added. See the documentation+ for details.++ * New option: --package for setting the package name. The package+ is listed alongside each module name in the combined contents.++ * Entities which are re-exported from another package now at least+ leave a hyperlink in the generated HTML, rather than nothing at all.++ * Some fixes for bugs which caused incorrect hyperlinks in the+ generated HTML. In particular, instances should now be linked+ correctly.++ * Some aesthetic improvements to the generated HTML.++-----------------------------------------------------------------------------++## Changes in version 0.5:++ * Compiles with recent versions of GHC.++ * A few bugs have been fixed.++ * New labelling/linking feature (see "Anchors" in the manual).++-----------------------------------------------------------------------------++## Changes in version 0.4:++ * Import declarations which list entities in parentheses, or with+ hiding clauses, are now properly supported. Modulo one or two+ small infelicities, the full Haskell modules system is now supported.++ * Haddock is now more flexible about the placing of separators+ (commas, semicolons) in relation to doc comments.++ * There is support for generating and reading "interface files"+ which describe the exports of a set of modules. This is useful+ for generating documentation which hyperlinks to+ previously-generated documentation.++ * Support for generating the extra files required by the Microsoft+ Help compiler.++ * New option: --prologue specifies a file of documentation which is+ placed on the contents page.++ * Many bugs fixed++-----------------------------------------------------------------------------+## Changes in version 0.3:++ * Documentation on individual function arguments is now implemented++ * Links can be made to identifiers that aren't in scope, by using+ the fully qualified name.++ * Instances are collected and listed with the appropriate classes+ and datatypes (not for derived instances yet).++ * Single quotes are only interpreted specially when they surround a+ legal Haskell identifier, otherwise they are treated literally.++ * Bird-tracked text is now literal. If you want marked-up text in+ a code block, use the @...@ notation instead.++ * Various changes to the layout, it generally looks nicer now.++ * Various bugs fixed.++-----------------------------------------------------------------------------+## Changes in version 0.2:++ * The [...] markup for typewriter font has been changed to @...@.++ * Module attributes introduced (see the documentation for details).++ * {- ... -} style comments may now be used for documentation annotations++ * Recursive modules are detected and reported as an error.++ * Existential constructors and rank-N types are now groked by the parser++ * Some type rendering cleaned up++ * `abc' is accepted as well as 'abc' to markup an identifier++ * Several bugs fixed, and error messages improved.
@@ -1,23 +1,26 @@-Copyright 2002-2010, Simon Marlow. All rights reserved.+Copyright (c) 2002-2010, Simon Marlow+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: -- 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.- -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "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 HOLDERS 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.+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.++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.
@@ -1,48 +0,0 @@-Haddock, a Haskell Documentation Tool-=====================================--This is Haddock, a tool for automatically generating documentation-from annotated Haskell source code. It is primary intended for-documenting library interfaces, but it should be useful for any kind-of Haskell code.--Like other systems ([1],[2]), Haddock lets you write documentation-annotations next to the definitions of functions and types in the-source code, in a syntax that is easy on the eye when writing the-source code (no heavyweight mark-up). The documentation generated by-Haddock is fully hyperlinked - click on a type name in a type-signature to go straight to the definition, and documentation, for-that type.--Haddock understands Haskell's module system, so you can structure your-code however you like without worrying that internal structure will be-exposed in the generated documentation. For example, it is common to-implement a library in several modules, but define the external API by-having a single module which re-exports parts of these implementation-modules. Using Haddock, you can still write documentation annotations-next to the actual definitions of the functions and types in the-library, but the documentation annotations from the implementation-will be propagated to the external API when the documentation is-generated. Abstract types and classes are handled correctly. In-fact, even without any documentation annotations, Haddock can generate-useful documentation from your source code.--Haddock can generate documentation in multiple formats; currently HTML-is implemented, and there is partial support for generating DocBook.-The generated HTML uses stylesheets, so you need a fairly up-to-date-browser to view it properly (Mozilla, Konqueror, Opera, and IE 6-should all be ok).--Full documentation can be found in the doc/ subdirectory, in DocBook-format.--Please send questions and suggestions to:--David Waern <david.waern@gmail.com> or-Simon Marlow <simonmar@microsoft.com>---[1] IDoc - A No Frills Haskell Interface Documentation System- http://www.cse.unsw.edu.au/~chak/haskell/idoc/--[2] HDoc http://www.fmi.uni-passau.de/~groessli/hdoc/
@@ -0,0 +1,34 @@+# Haddock [![CI][CI badge]][CI page] [![Hackage][Hackage badge]][Hackage page]++Haddock is the standard tool for generating documentation from Haskell code.+Full documentation about Haddock itself can be found in the `doc/` subdirectory,+in [reStructuredText][reST] format.++## Project overview++This project consists of three packages:++ * `haddock`: provides the `haddock` executable. It is implemented as a tiny+ wrapper around `haddock-api`'s `Documentation.Haddock.haddock` function.++ * `haddock-api`: contains the program logic of the `haddock` tool.+ [The haddocks for the `Documentation.Haddock` module][Documentation.Haddock]+ offer a good overview of the functionality.++ * `haddock-library`: is concerned with the parsing and processing of the+ Haddock markup language. Unlike the other packages, it is expected to build+ on a fairly wide range of GHC versions.++## Contributing++See [CONTRIBUTING.md](CONTRIBUTING.md) to see how to make contributions to the+project.+++[CI page]: https://github.com/haskell/haddock/actions/workflows/ci.yml+[CI badge]: https://github.com/haskell/haddock/actions/workflows/ci.yml/badge.svg+[Hackage page]: https://hackage.haskell.org/package/haddock+[Hackage badge]: https://img.shields.io/hackage/v/haddock.svg+[reST]: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html+[Documentation.Haddock]: http://hackage.haskell.org/package/haddock-api/docs/Documentation-Haddock.html+[cabal v2]: https://cabal.readthedocs.io/en/latest/nix-local-build-overview.html
@@ -1,5 +1,3 @@-#! /usr/bin/runhaskell-\begin{code}-import Distribution.Simple-main = defaultMain-\end{code}+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
@@ -1,6 +1,8 @@-include config.mk+SPHINX_BUILD ?= sphinx-build -XML_DOC = haddock-INSTALL_XML_DOC = haddock+all : html -include docbook-xml.mk+.PHONY : html++html :+ $(SPHINX_BUILD) -b html . .build-html
@@ -1,25 +0,0 @@-Haddock documentation------------------------The documentation is in DocBook XML format. You need some tools to-process it: at least xsltproc, and the DocBook XML DTD and XSL-stylesheets. There's a configure script to detect the right way to-process the documentation on your system, and a Makefile to actually-do the processing (so, on Windows, you'll need Cygwin or MSys in-addition to the DocBook XML tools). To build the HTML documentation:-- $ ./configure- $ make html--which leaves the HTML documentation in a haddock/ subdirectory.--Printable documentation can also be produced, eg.:-- $ make pdf--or-- $ make ps--Generating the printed formats requires more tools (fop or xmltex) and-tends to be a bit harder.
@@ -0,0 +1,10 @@+# Haddock documentation++The documentation is in ReStructuredText format. You need+[Sphinx](http://www.sphinx-doc.org/) to process it. To build the HTML+documentation,++ $ make html++which leaves the HTML documentation the `.build-html/` subdirectory.+
@@ -1,174 +0,0 @@-# FP_GEN_DOCBOOK_XML-# -------------------# Generates a DocBook XML V4.2 document in conftest.xml.-AC_DEFUN([FP_GEN_DOCBOOK_XML],-[rm -f conftest.xml-cat > conftest.xml << EOF-<?xml version="1.0" encoding="iso-8859-1"?>-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">-<book id="test">- <title>A DocBook Test Document</title>- <chapter id="id-one">- <title>A Chapter Title</title>- <para>This is a paragraph, referencing <xref linkend="id-two"/>.</para>- </chapter>- <chapter id="id-two">- <title>Another Chapter Title</title>- <para>This is another paragraph, referencing <xref linkend="id-one"/>.</para>- </chapter>-</book>-EOF-]) # FP_GEN_DOCBOOK_XML---# FP_PROG_XSLTPROC-# -----------------# Sets the output variable XsltprocCmd to the full path of the XSLT processor-# xsltproc. XsltprocCmd is empty if xsltproc could not be found.-AC_DEFUN([FP_PROG_XSLTPROC],-[AC_PATH_PROG([XsltprocCmd], [xsltproc])-if test -z "$XsltprocCmd"; then- AC_MSG_WARN([cannot find xsltproc in your PATH, you will not be able to build the documentation])-fi-])# FP_PROG_XSLTPROC---# FP_DIR_DOCBOOK_XSL(XSL-DIRS)-# -----------------------------# Check which of the directories XSL-DIRS contains DocBook XSL stylesheets. The-# output variable DIR_DOCBOOK_XSL will contain the first usable directory or-# will be empty if none could be found.-AC_DEFUN([FP_DIR_DOCBOOK_XSL],-[AC_REQUIRE([FP_PROG_XSLTPROC])dnl-if test -n "$XsltprocCmd"; then- AC_CACHE_CHECK([for DocBook XSL stylesheet directory], fp_cv_dir_docbook_xsl,- [FP_GEN_DOCBOOK_XML- fp_cv_dir_docbook_xsl=no- for fp_var in $1; do- if $XsltprocCmd ${fp_var}/html/docbook.xsl conftest.xml > /dev/null 2>&1; then- fp_cv_dir_docbook_xsl=$fp_var- break- fi- done- rm -rf conftest*])-fi-if test x"$fp_cv_dir_docbook_xsl" = xno; then- AC_MSG_WARN([cannot find DocBook XSL stylesheets, you will not be able to build the documentation])- DIR_DOCBOOK_XSL=-else- DIR_DOCBOOK_XSL=$fp_cv_dir_docbook_xsl-fi-AC_SUBST([DIR_DOCBOOK_XSL])-])# FP_DIR_DOCBOOK_XSL---# FP_PROG_XMLLINT-# -----------------# Sets the output variable XmllintCmd to the full path of the XSLT processor-# xmllint. XmllintCmd is empty if xmllint could not be found.-AC_DEFUN([FP_PROG_XMLLINT],-[AC_PATH_PROG([XmllintCmd], [xmllint])-if test -z "$XmllintCmd"; then- AC_MSG_WARN([cannot find xmllint in your PATH, you will not be able to validate your documentation])-fi-])# FP_PROG_XMLLINT---# FP_CHECK_DOCBOOK_DTD-# ---------------------AC_DEFUN([FP_CHECK_DOCBOOK_DTD],-[AC_REQUIRE([FP_PROG_XMLLINT])dnl-if test -n "$XmllintCmd"; then- AC_MSG_CHECKING([for DocBook DTD])- FP_GEN_DOCBOOK_XML- if $XmllintCmd --valid --noout conftest.xml > /dev/null 2>&1; then- AC_MSG_RESULT([ok])- else- AC_MSG_RESULT([failed])- AC_MSG_WARN([cannot find a DTD for DocBook XML V4.2, you will not be able to validate your documentation])- AC_MSG_WARN([check your XML_CATALOG_FILES environment variable and/or /etc/xml/catalog])- fi- rm -rf conftest*-fi-])# FP_CHECK_DOCBOOK_DTD---# FP_GEN_FO-# -------------------# Generates a formatting objects document in conftest.fo.-AC_DEFUN([FP_GEN_FO],-[rm -f conftest.fo-cat > conftest.fo << EOF-<?xml version="1.0"?>-<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">- <fo:layout-master-set>- <fo:simple-page-master master-name="blank">- <fo:region-body/>- </fo:simple-page-master>- </fo:layout-master-set>- <fo:page-sequence master-reference="blank">- <fo:flow flow-name="xsl-region-body">- <fo:block>- Test!- </fo:block>- </fo:flow>- </fo:page-sequence>-</fo:root>-EOF-]) # FP_GEN_FO---# FP_PROG_FOP-# ------------# Set the output variable 'FopCmd' to the first working 'fop' in the current-# 'PATH'. Note that /usr/bin/fop is broken in SuSE 9.1 (unpatched), so try-# /usr/share/fop/fop.sh in that case (or no 'fop'), too.-AC_DEFUN([FP_PROG_FOP],-[AC_PATH_PROGS([FopCmd1], [fop])-if test -n "$FopCmd1"; then- AC_CACHE_CHECK([for $FopCmd1 usability], [fp_cv_fop_usability],- [FP_GEN_FO- if "$FopCmd1" -fo conftest.fo -ps conftest.ps > /dev/null 2>&1; then- fp_cv_fop_usability=yes- else- fp_cv_fop_usability=no- fi- rm -rf conftest*])- if test x"$fp_cv_fop_usability" = xyes; then- FopCmd=$FopCmd1- fi-fi-if test -z "$FopCmd"; then- AC_PATH_PROGS([FopCmd2], [fop.sh], , [/usr/share/fop])- FopCmd=$FopCmd2-fi-AC_SUBST([FopCmd])-])# FP_PROG_FOP---# FP_PROG_FO_PROCESSOR-# ---------------------# Try to find an FO processor. PassiveTeX output is sometimes a bit strange, so-# try FOP first. Sets the output variables FopCmd, XmltexCmd, DvipsCmd, and-# PdfxmltexCmd.-AC_DEFUN([FP_PROG_FO_PROCESSOR],-[AC_REQUIRE([FP_PROG_FOP])-AC_PATH_PROG([XmltexCmd], [xmltex])-AC_PATH_PROG([DvipsCmd], [dvips])-if test -z "$FopCmd"; then- if test -z "$XmltexCmd"; then- AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI or PostScript documentation])- else- if test -z "$DvipsCmd"; then- AC_MSG_WARN([cannot find a DVI => PS converter, you will not be able to build PostScript documentation])- fi- fi- AC_PATH_PROG([PdfxmltexCmd], [pdfxmltex])- if test -z "$PdfxmltexCmd"; then- AC_MSG_WARN([cannot find an FO => PDF converter, you will not be able to build PDF documentation])- fi-elif test -z "$XmltexCmd"; then- AC_MSG_WARN([cannot find an FO => DVI converter, you will not be able to build DVI documentation])-fi-])# FP_PROG_FO_PROCESSOR
@@ -0,0 +1,19 @@+Common Errors+=============++``parse error on input ‘-- | xxx’``+-----------------------------------++This is probably caused by the ``-- | xxx`` comment not following a declaration. I.e. use ``-- xxx`` instead. See :ref:`top-level-declaration`.++``parse error on input ‘-- $ xxx’``+-----------------------------------++You've probably commented out code like::++ f x+ $ xxx+ +``-- $`` is a special syntax for named chunks, see :ref:`named-chunks`. You can fix this by escaping the ``$``::++ -- \$ xxx
@@ -0,0 +1,68 @@+# -*- coding: utf-8 -*-++import sys+import os+import shlex++extensions = []++source_suffix = '.rst'+master_doc = 'index'++# General information about the project.+project = u'Haddock'+copyright = u'2016, Simon Marlow'+author = u'Simon Marlow'+version = '1.0'+release = '1.0'++language = 'en'++# List of patterns, relative to source directory, that match files and+# directories to ignore when looking for source files.+exclude_patterns = ['.build']+todo_include_todos = False++# Syntax highlighting+highlight_language = 'haskell'+pygments_style = 'tango'++# -- Options for HTML output ----------------------------------------------++htmlhelp_basename = 'Haddockdoc'+++# -- Options for LaTeX output ---------------------------------------------++latex_elements = { }++# Grouping the document tree into LaTeX files. List of tuples+# (source start file, target name, title,+# author, documentclass [howto, manual, or own class]).+latex_documents = [+ (master_doc, 'Haddock.tex', u'Haddock Documentation',+ u'Simon Marlow', 'manual'),+]+++# -- Options for manual page output ---------------------------------------++# One entry per manual page. List of tuples+# (source start file, name, description, authors, manual section).+man_pages = [+ (master_doc, 'haddock', u'Haddock Documentation',+ [author], 1)+]+++# -- Options for Texinfo output -------------------------------------------++# Grouping the document tree into Texinfo files. List of tuples+# (source start file, target name, title, author,+# dir menu entry, description, category)+texinfo_documents = [+ (master_doc, 'Haddock', u'Haddock Documentation',+ author, 'Haddock', 'One line description of project.',+ 'Miscellaneous'),+]+
@@ -1,15 +0,0 @@-#------------------------------------------------------------------------------# DocBook XML stuff--XSLTPROC = @XsltprocCmd@-XMLLINT = @XmllintCmd@-FOP = @FopCmd@-XMLTEX = @XmltexCmd@-PDFXMLTEX = @PdfxmltexCmd@-DVIPS = @DvipsCmd@--DIR_DOCBOOK_XSL = @DIR_DOCBOOK_XSL@--XSLTPROC_LABEL_OPTS = --stringparam toc.section.depth 3 \- --stringparam section.autolabel 1 \- --stringparam section.label.includes.component.label 1
@@ -1,12 +0,0 @@--AC_INIT([Haddock docs], [1.0], [simonmar@microsoft.com], [])--AC_CONFIG_SRCDIR([Makefile])--dnl ** check for DocBook toolchain-FP_CHECK_DOCBOOK_DTD-FP_DIR_DOCBOOK_XSL([/usr/share/xml/docbook/stylesheet/nwalsh/current /usr/share/xml/docbook/stylesheet/nwalsh /usr/share/sgml/docbook/docbook-xsl-stylesheets* /usr/share/sgml/docbook/xsl-stylesheets* /opt/kde?/share/apps/ksgmltools2/docbook/xsl /usr/share/docbook-xsl /usr/share/sgml/docbkxsl /usr/local/share/xsl/docbook /sw/share/xml/xsl/docbook-xsl /usr/share/xml/docbook/xsl-stylesheets-*])-FP_PROG_FO_PROCESSOR--AC_CONFIG_FILES([config.mk])-AC_OUTPUT
@@ -1,130 +0,0 @@-#------------------------------------------------------------------------------# DocBook XML--.PHONY: html html-no-chunks chm HxS fo dvi ps pdf--ifneq "$(XML_DOC)" ""--all :: html--# multi-file XML document: main document name is specified in $(XML_DOC),-# sub-documents (.xml files) listed in $(XML_SRCS).--ifeq "$(XML_SRCS)" ""-XML_SRCS = $(wildcard *.xml)-endif--XML_HTML = $(addsuffix /index.html,$(basename $(XML_DOC)))-XML_HTML_NO_CHUNKS = $(addsuffix .html,$(XML_DOC))-XML_CHM = $(addsuffix .chm,$(XML_DOC))-XML_HxS = $(addsuffix .HxS,$(XML_DOC))-XML_FO = $(addsuffix .fo,$(XML_DOC))-XML_DVI = $(addsuffix .dvi,$(XML_DOC))-XML_PS = $(addsuffix .ps,$(XML_DOC))-XML_PDF = $(addsuffix .pdf,$(XML_DOC))--$(XML_HTML) $(XML_NO_CHUNKS_HTML) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF) :: $(XML_SRCS)--html :: $(XML_HTML)-html-no-chunks :: $(XML_HTML_NO_CHUNKS)-chm :: $(XML_CHM)-HxS :: $(XML_HxS)-fo :: $(XML_FO)-dvi :: $(XML_DVI)-ps :: $(XML_PS)-pdf :: $(XML_PDF)--CLEAN_FILES += $(XML_HTML_NO_CHUNKS) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF)--FPTOOLS_CSS = fptools.css--clean ::- $(RM) -rf $(XML_DOC).out $(basename $(XML_DOC)) $(basename $(XML_DOC))-htmlhelp--validate ::- $(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml-endif--#------------------------------------------------------------------------------# DocBook XML suffix rules-#--%.html : %.xml- $(XSLTPROC) --output $@ \- --stringparam html.stylesheet $(FPTOOLS_CSS) \- $(XSLTPROC_LABEL_OPTS) $(XSLTPROC_OPTS) \- $(DIR_DOCBOOK_XSL)/html/docbook.xsl $<--%/index.html : %.xml- $(RM) -rf $(dir $@)- $(XSLTPROC) --stringparam base.dir $(dir $@) \- --stringparam use.id.as.filename 1 \- --stringparam html.stylesheet $(FPTOOLS_CSS) \- $(XSLTPROC_LABEL_OPTS) $(XSLTPROC_OPTS) \- $(DIR_DOCBOOK_XSL)/html/chunk.xsl $<- cp $(FPTOOLS_CSS) $(dir $@)--# Note: Numeric labeling seems to be uncommon for HTML Help-%-htmlhelp/index.html : %.xml- $(RM) -rf $(dir $@)- $(XSLTPROC) --stringparam base.dir $(dir $@) \- --stringparam manifest.in.base.dir 1 \- --stringparam htmlhelp.chm "..\\"$(basename $<).chm \- $(XSLTPROC_OPTS) \- $(DIR_DOCBOOK_XSL)/htmlhelp/htmlhelp.xsl $<--%-htmlhelp2/collection.HxC : %.xml- $(RM) -rf $(dir $@)- $(XSLTPROC) --stringparam base.dir $(dir $@) \- --stringparam use.id.as.filename 1 \- --stringparam manifest.in.base.dir 1 \- $(XSLTPROC_OPTS) \- $(DIR_DOCBOOK_XSL)/htmlhelp2/htmlhelp2.xsl $<--# TODO: Detect hhc & Hxcomp via autoconf-#-# Two obstacles here:-#-# * The reason for the strange "if" below is that hhc returns 0 on error and 1-# on success, the opposite of what shells and make expect.-#-# * There seems to be some trouble with DocBook indices, but the *.chm looks OK,-# anyway, therefore we pacify make by "|| true". Ugly...-#-%.chm : %-htmlhelp/index.html- ( cd $(dir $<) && if hhc htmlhelp.hhp ; then false ; else true ; fi ) || true--%.HxS : %-htmlhelp2/collection.HxC- ( cd $(dir $<) && if Hxcomp -p collection.HxC -o ../$@ ; then false ; else true ; fi )--%.fo : %.xml- $(XSLTPROC) --output $@ \- --stringparam draft.mode no \- $(XSLTPROC_LABEL_OPTS) $(XSLTPROC_OPTS) \- $(DIR_DOCBOOK_XSL)/fo/docbook.xsl $<--ifeq "$(FOP)" ""-ifneq "$(PDFXMLTEX)" ""-%.pdf : %.fo- $(PDFXMLTEX) $<- if grep "LaTeX Warning: Label(s) may have changed.Rerun to get cross-references right." $(basename $@).log > /dev/null ; then \- $(PDFXMLTEX) $< ; \- $(PDFXMLTEX) $< ; \- fi-endif-else-%.ps : %.fo- $(FOP) $(FOP_OPTS) -fo $< -ps $@--%.pdf : %.fo- $(FOP) $(FOP_OPTS) -fo $< -pdf $@-endif--ifneq "$(XMLTEX)" ""-%.dvi : %.fo- $(XMLTEX) $<- if grep "LaTeX Warning: Label(s) may have changed.Rerun to get cross-references right." $(basename $@).log > /dev/null ; then \- $(XMLTEX) $< ; \- $(XMLTEX) $< ; \- fi-endif
@@ -1,36 +0,0 @@-div {- font-family: sans-serif;- color: black;- background: white-}--h1, h2, h3, h4, h5, h6, p.title { color: #005A9C }--h1 { font: 170% sans-serif }-h2 { font: 140% sans-serif }-h3 { font: 120% sans-serif }-h4 { font: bold 100% sans-serif }-h5 { font: italic 100% sans-serif }-h6 { font: small-caps 100% sans-serif }--pre {- font-family: monospace;- border-width: 1px;- border-style: solid;- padding: 0.3em-}--pre.screen { color: #006400 }-pre.programlisting { color: maroon }--div.example {- background-color: #fffcf5;- margin: 1ex 0em;- border: solid #412e25 1px;- padding: 0ex 0.4em-}--a:link { color: #0000C8 }-a:hover { background: #FFFFA8 }-a:active { color: #D00000 }-a:visited { color: #680098 }
@@ -1,1856 +0,0 @@-<?xml version="1.0" encoding="iso-8859-1"?>-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">--<book id="haddock">- <bookinfo>- <date>2004-08-02</date>- <title>Haddock User Guide</title>- <author>- <firstname>Simon</firstname>- <surname>Marlow</surname>- </author>- <address><email>marlowsd@gmail.com</email></address>- <author>- <firstname>David</firstname>- <surname>Waern</surname>- </author>- <address><email>david.waern@gmail.com</email></address>- <copyright>- <year>2010</year>- <holder>Simon Marlow, David Waern</holder>- </copyright>- <abstract>- <para>This document describes Haddock version 2.11.0, a Haskell- documentation tool.</para>- </abstract>- </bookinfo>-- <!-- Table of contents -->- <toc></toc>-- <chapter id="introduction">- <title>Introduction</title>-- <para>This is Haddock, a tool for automatically generating- documentation from annotated Haskell source code. Haddock was- designed with several goals in mind:</para>-- <itemizedlist>- <listitem>- <para>When documenting APIs, it is desirable to keep the- documentation close to the actual interface or implementation- of the API, preferably in the same file, to reduce the risk- that the two become out of sync. Haddock therefore lets you- write the documentation for an entity (function, type, or- class) next to the definition of the entity in the source- code.</para>- </listitem>- <listitem>- <para>There is a tremendous amount of useful API documentation- that can be extracted from just the bare source code,- including types of exported functions, definitions of data- types and classes, and so on. Haddock can therefore generate- documentation from a set of straight Haskell 98 modules, and- the documentation will contain precisely the interface that is- available to a programmer using those modules.</para>- </listitem>- <listitem>- <para>Documentation annotations in the source code should be- easy on the eye when editing the source code itself, so as not- to obsure the code and to make reading and writing- documentation annotations easy. The easier it is to write- documentation, the more likely the programmer is to do it.- Haddock therefore uses lightweight markup in its annotations,- taking several ideas from <ulink- url="http://www.cse.unsw.edu.au/~chak/haskell/idoc/">IDoc</ulink>.- In fact, Haddock can understand IDoc-annotated source- code.</para>- </listitem>- <listitem>- <para>The documentation should not expose any of the structure- of the implementation, or to put it another way, the- implementer of the API should be free to structure the- implementation however he or she wishes, without exposing any- of that structure to the consumer. In practical terms, this- means that while an API may internally consist of several- Haskell modules, we often only want to expose a single module- to the user of the interface, where this single module just- re-exports the relevant parts of the implementation- modules.</para>-- <para>Haddock therefore understands the Haskell module system- and can generate documentation which hides not only- non-exported entities from the interface, but also the- internal module structure of the interface. A documentation- annotation can still be placed next to the implementation, and- it will be propagated to the external module in the generated- documentation.</para>- </listitem>- <listitem>- <para>Being able to move around the documentation by following- hyperlinks is essential. Documentation generated by Haddock- is therefore littered with hyperlinks: every type and class- name is a link to the corresponding definition, and- user-written documentation annotations can contain identifiers- which are linked automatically when the documentation is- generated.</para>- </listitem>- <listitem>- <para>We might want documentation in multiple formats - online- and printed, for example. Haddock comes with HTML, LaTeX,- and Hoogle backends, and it is structured in such a way that adding new- back-ends is straightforward.</para>- </listitem>- </itemizedlist>-- <section id="obtaining">- <title>Obtaining Haddock</title>-- <para>Distributions (source & binary) of Haddock can be obtained- from its <ulink url="http://www.haskell.org/haddock/">web- site</ulink>.</para>-- <para>Up-to-date sources can also be obtained from our public- darcs repository. The Haddock sources are at- <literal>http://code.haskell.org/haddock</literal>. See- <ulink url="http://www.darcs.net/">darcs.net</ulink> for more- information on the darcs version control utility.</para>- </section>-- <section id="license">- <title>License</title>-- <para>The following license covers this documentation, and the- Haddock source code, except where otherwise indicated.</para>-- <blockquote>- <para>Copyright 2002-2010, Simon Marlow. All rights reserved.</para>-- <para>Redistribution and use in source and binary forms, with- or without modification, are permitted provided that the- following conditions are met:</para>-- <itemizedlist>- <listitem>- <para>Redistributions of source code must retain the above- copyright notice, this list of conditions and the- following disclaimer.</para>- </listitem>- <listitem>- <para>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.</para>- </listitem>- </itemizedlist>-- <para>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "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 HOLDERS 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.</para>- </blockquote>- </section>-- <section>- <title>Contributors</title>- <para>Haddock was originally written by Simon Marlow. Since it is an open source- project, many people have contributed to its development over the years.- Below is a list of contributors in alphabetical order that we hope is- somewhat complete. If you think you are missing from this list, please contact- us.- </para>- <itemizedlist>- <listitem>Ashley Yakeley</listitem>- <listitem>Benjamin Franksen</listitem>- <listitem>Brett Letner</listitem>- <listitem>Clemens Fruhwirth</listitem>- <listitem>Conal Elliott</listitem>- <listitem>David Waern</listitem> - <listitem>Duncan Coutts</listitem>- <listitem>George Pollard</listitem>- <listitem>George Russel</listitem>- <listitem>Hal Daume</listitem>- <listitem>Ian Lynagh</listitem>- <listitem>Isaac Dupree</listitem>- <listitem>Joachim Breitner</listitem>- <listitem>Krasimir Angelov</listitem>- <listitem>Lennart Augustsson</listitem>- <listitem>Luke Plant</listitem>- <listitem>Malcolm Wallace</listitem>- <listitem>Mark Lentczner</listitem>- <listitem>Mark Shields</listitem>- <listitem>Neil Mitchell</listitem>- <listitem>Mike Thomas</listitem>- <listitem>Manuel Chakravarty</listitem>- <listitem>Oliver Brown</listitem>- <listitem>Roman Cheplyaka</listitem>- <listitem>Ross Paterson</listitem>- <listitem>Simon Hengel</listitem>- <listitem>Simon Marlow</listitem>- <listitem>Simon Peyton-Jones</listitem>- <listitem>Sigbjorn Finne</listitem>- <listitem>Stefan O'Rear</listitem>- <listitem>Sven Panne</listitem>- <listitem>Thomas Schilling</listitem>- <listitem>Wolfgang Jeltsch</listitem>- <listitem>Yitzchak Gale</listitem>- </itemizedlist>- </section>- <section>- <title>Acknowledgements</title>-- <para>Several documentation systems provided the inspiration for- Haddock, most notably:</para>-- <itemizedlist>- <listitem>- <para><ulink- url="http://www.cse.unsw.edu.au/~chak/haskell/idoc/">- IDoc</ulink></para>- </listitem>- <listitem>- <para><ulink- url="http://www.fmi.uni-passau.de/~groessli/hdoc/">HDoc</ulink></para>- </listitem>- <listitem>- <para><ulink url="http://www.stack.nl/~dimitri/doxygen/">- Doxygen</ulink></para>- </listitem>- </itemizedlist>-- <para>and probably several others I've forgotten.</para>-- <para>Thanks to the the members- of <email>haskelldoc@haskell.org</email>,- <email>haddock@projects.haskell.org</email> and everyone who- contributed to the many libraries that Haddock makes use- of.</para>- </section>-- </chapter>-- <chapter id="invoking">- <title>Invoking Haddock</title>- <para>Haddock is invoked from the command line, like so:</para>-- <cmdsynopsis>- <command>haddock</command>- <arg rep="repeat"><replaceable>option</replaceable></arg>- <arg rep="repeat" choice="plain"><replaceable>file</replaceable></arg>- </cmdsynopsis>-- <para>Where each <replaceable>file</replaceable> is a filename- containing a Haskell source module (.hs) or a Literate Haskell source- module (.lhs) or just a module name.</para>-- <para>All the modules specified on the command line will be- processed together. When one module refers to an entity in- another module being processed, the documentation will link- directly to that entity.</para>-- <para>Entities that cannot be found, for example because they are- in a module that isn't being processed as part of the current- batch, simply won't be hyperlinked in the generated- documentation. Haddock will emit warnings listing all the- indentifiers it couldn't resolve.</para>-- <para>The modules should <emphasis>not</emphasis> be mutually- recursive, as Haddock don't like swimming in circles.</para>-- <para>You must also specify an option for the output format.- Currently only the <option>-h</option> option for HTML and the- <option>--hoogle</option> option for outputting Hoogle data are- functional.</para>-- <para>The packaging- tool <ulink url="http://www.haskell.org/ghc/docs/latest/html/Cabal/index.html">Cabal</ulink>- has Haddock support, and is often used instead of invoking Haddock- directly.</para>-- <para>The following options are available:</para>-- <variablelist>-- <varlistentry>- <term>- <indexterm><primary><option>-B</option></primary></indexterm>- <option>-B</option> <replaceable>dir</replaceable>- </term>- <listitem>- <para>Tell GHC that that its lib directory is- <replaceable>dir</replaceable>. Can be used to override the default path.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-o</option></primary></indexterm>- <option>-o</option> <replaceable>dir</replaceable>- </term>- <term>- <indexterm><primary><option>--odir</option></primary></indexterm>- <option>--odir</option>=<replaceable>dir</replaceable>- </term>- <listitem>- <para>Generate files into <replaceable>dir</replaceable>- instead of the current directory.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-l</option></primary></indexterm>- <option>-l</option> <replaceable>dir</replaceable>- </term>- <term>- <indexterm><primary><option>--lib</option></primary></indexterm>- <option>--lib</option>=<replaceable>dir</replaceable>- </term>- <listitem>- <para>Use Haddock auxiliary files (themes, javascript, etc...) in <replaceable>dir</replaceable>.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-i</option></primary></indexterm>- <option>-i</option> <replaceable>path</replaceable>,<replaceable>file</replaceable>- </term>- <term>- <indexterm><primary><option>--read-interface</option></primary></indexterm>- <option>--read-interface</option>=<replaceable>path</replaceable>,<replaceable>file</replaceable>- </term>- <listitem>- <para>Read the interface file in- <replaceable>file</replaceable>, which must have been- produced by running Haddock with the- <option>--dump-interface</option> option. The interface- describes a set of modules whose HTML documentation is- located in <replaceable>path</replaceable> (which may be a- relative pathname). The <replaceable>path</replaceable> is- optional, and defaults to <quote>.</quote>.</para>-- <para>This option allows Haddock to produce separate sets of- documentation with hyperlinks between them. The- <replaceable>path</replaceable> is used to direct hyperlinks- to point to the right files; so make sure you don't move the- HTML files later or these links will break. Using a- relative <replaceable>path</replaceable> means that a- documentation subtree can still be moved around without- breaking links.</para>-- <para>Multiple <option>--read-interface</option> options may- be given.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-D</option></primary></indexterm>- <option>-D</option> <replaceable>file</replaceable>- </term>- <term>- <indexterm><primary><option>--dump-interface</option></primary></indexterm>- <option>--dump-interface</option>=<replaceable>file</replaceable>- </term>- <listitem>- <para>Produce an <firstterm>interface- file</firstterm><footnote><para>Haddock interface files are- not the same as Haskell interface files, I just couldn't- think of a better name.</para> </footnote>- in the file <replaceable>file</replaceable>. An interface- file contains information Haddock needs to produce more- documentation that refers to the modules currently being- processed - see the <option>--read-interface</option> option- for more details. The interface file is in a binary format;- don't try to read it.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-h</option></primary></indexterm>- <option>-h</option>- </term>- <term>- <indexterm><primary><option>--html</option></primary></indexterm>- <option>--html</option>- </term>- <listitem>- <para>Generate documentation in HTML format. Several files- will be generated into the current directory (or the- specified directory if the <option>-o</option> option is- given), including the following:</para>- <variablelist>- <varlistentry>- <term><filename><replaceable>module</replaceable>.html</filename></term>- <term><filename>mini_<replaceable>module</replaceable>.html</filename></term>- <listitem>- <para>An HTML page for each- <replaceable>module</replaceable>, and a "mini" page for- each used when viewing in frames.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename>index.html</filename></term>- <listitem>- <para>The top level page of the documentation: lists- the modules available, using indentation to represent- the hierarchy if the modules are hierarchical.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename>doc-index.html</filename></term>- <term><filename>doc-index-<replaceable>X</replaceable>.html</filename></term>- <listitem>- <para>The alphabetic index, possibly split into multiple- pages if big enough.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename>frames.html</filename></term>- <listitem>- <para>The top level document when viewing in frames.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename><replaceable>some</replaceable>.css</filename></term>- <term><filename><replaceable>etc...</replaceable></filename></term>- <listitem>- <para>Files needed for the themes used. Specify your themes- using the <option>--theme</option> option.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename>haddock-util.js</filename></term>- <listitem>- <para>Some JavaScript utilities used to implement some of the- dynamic features like collapsable sections, and switching to- frames view.</para>- </listitem>- </varlistentry>- </variablelist>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--latex</option></primary></indexterm>- <option>--latex</option>- </term>- <listitem>- <para>Generate documentation in LaTeX format. Several files- will be generated into the current directory (or the- specified directory if the <option>-o</option> option is- given), including the following:</para>- - <variablelist>- <varlistentry>- <term><filename><replaceable>package</replaceable>.tex</filename></term>- <listitem>- <para>The top-level LaTeX source file; to format the- documentation into PDF you might run something like- this:</para>-<screen>-$ pdflatex <replaceable>package</replaceable>.tex</screen>- </listitem>- </varlistentry>- <varlistentry>- <term><filename>haddock.sty</filename></term>- <listitem>- <para>The default style. The file contains- definitions for various macros used in the LaTeX- sources generated by Haddock; to change the way the- formatted output looks, you might want to override- these by specifying your own style with- the <option>--latex-style</option> option.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><filename><replaceable>module</replaceable>.tex</filename></term>- <listitem>- <para>The LaTeX documentation for- each <replaceable>module</replaceable>.</para>- </listitem>- </varlistentry>- </variablelist>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--latex-style</option></primary></indexterm>- <option>--latex-style=<replaceable>style</replaceable></option>- </term>- <listitem>- <para>This option lets you override the default style used- by the LaTeX generated by the <option>--latex</option> option.- Normally Haddock puts a- standard <filename>haddock.sty</filename> in the output- directory, and includes the- command <literal>\usepackage{haddock}</literal> in the- LaTeX source. If this option is given,- then <filename>haddock.sty</filename> is not generated,- and the command is- instead <literal>\usepackage{<replaceable>style</replaceable>}</literal>.- </para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-S</option></primary></indexterm>- <option>-S</option>- </term>- <term>- <indexterm><primary><option>--docbook</option></primary></indexterm>- <option>--docbook</option>- </term>- <listitem>- <para>Reserved for future use (output documentation in DocBook XML- format).</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--source-base</option></primary></indexterm>- <option>--source-base</option>=<replaceable>URL</replaceable>- </term>- <term>- <indexterm><primary><option>--source-module</option></primary></indexterm>- <option>--source-module</option>=<replaceable>URL</replaceable>- </term>- <term>- <indexterm><primary><option>--source-entity</option></primary></indexterm>- <option>--source-entity</option>=<replaceable>URL</replaceable>- </term>- <listitem>- <para>Include links to the source files in the generated- documentation. Use the <option>--source-base</option> option to add a- source code link in the header bar of the contents and index pages.- Use the <option>--source-module</option> to add a source code link in- the header bar of each module page. Use the- <option>--source-entity</option> option to add a source code link- next to the documentation for every value and type in each module.- </para>- - <para>In each case <replaceable>URL</replaceable> is the base URL- where the source files can be found. For the per-module and- per-entity URLs, the following substitutions are made within the- string <replaceable>URL</replaceable>:</para>-- <itemizedlist>- <listitem>- <para>The string <literal>%M</literal> or <literal>%{MODULE}</literal>- is replaced by the module name. Note that for the per-entity URLs- this is the name of the <emphasis>exporting</emphasis> module.</para>- </listitem>- <listitem>- <para>The string <literal>%F</literal> or <literal>%{FILE}</literal>- is replaced by the original source file name. Note that for the- per-entity URLs this is the name of the <emphasis>defining</emphasis>- module.</para>- </listitem>- <listitem>- <para>The string <literal>%N</literal> or <literal>%{NAME}</literal>- is replaced by the name of the exported value or type. This is- only valid for the <option>--source-entity</option> option.</para>- </listitem>- <listitem>- <para>The string <literal>%K</literal> or <literal>%{KIND}</literal>- is replaced by a flag indicating whether the exported name is a value- '<literal>v</literal>' or a type '<literal>t</literal>'. This is- only valid for the <option>--source-entity</option> option.</para>- </listitem>- <listitem>- <para>The string <literal>%L</literal> or <literal>%{LINE}</literal>- is replaced by the number of the line where the exported value or- type is defined. This is only valid for the- <option>--source-entity</option> option.</para>- </listitem>- <listitem>- <para>The string <literal>%%</literal> is replaced by- <literal>%</literal>.</para>- </listitem>-- </itemizedlist>-- <para>For example, if your sources are online under some directory,- you would say- <literal>haddock --source-base=<replaceable>url</replaceable>/- --source-module=<replaceable>url</replaceable>/%F</literal></para>- - <para>If you have html versions of your sources online with anchors- for each type and function name, you would say- <literal>haddock --source-base=<replaceable>url</replaceable>/- --source-module=<replaceable>url</replaceable>/%M.html- --source-entity=<replaceable>url</replaceable>/%M.html#%N</literal></para>-- <para>For the <literal>%{MODULE}</literal> substitution you may want to- replace the '<literal>.</literal>' character in the module names with- some other character (some web servers are known to get confused by- multiple '<literal>.</literal>' characters in a file name). To- replace it with a character <replaceable>c</replaceable> use- <literal>%{MODULE/./<replaceable>c</replaceable>}</literal>.</para>-- <para>Similarly, for the <literal>%{FILE}</literal> substitution- you may want to replace the '<literal>/</literal>' character in- the file names with some other character (especially for links- to colourised entity source code with a shared css file). To replace- it with a character <replaceable>c</replaceable> use- <literal>%{FILE///<replaceable>c</replaceable>}</literal>/</para>-- <para>One example of a tool that can generate syntax-highlighted- HTML from your source code, complete with anchors suitable for use- from haddock, is- <ulink url="http://www.cs.york.ac.uk/fp/darcs/hscolour">hscolour</ulink>.</para>-- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-s</option></primary></indexterm>- <option>-s</option> <replaceable>URL</replaceable>- </term>- <term>- <indexterm><primary><option>--source</option></primary></indexterm>- <option>--source</option>=<replaceable>URL</replaceable>- </term>- <listitem>- <para>Deprecated aliases for <option>--source-module</option></para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--comments-base</option></primary></indexterm>- <option>--comments-base</option>=<replaceable>URL</replaceable>- </term>- <term>- <indexterm><primary><option>--comments-module</option></primary></indexterm>- <option>--comments-module</option>=<replaceable>URL</replaceable>- </term>- <term>- <indexterm><primary><option>--comments-entity</option></primary></indexterm>- <option>--comments-entity</option>=<replaceable>URL</replaceable>- </term>- <listitem>- <para>Include links to pages where readers may comment on the- documentation. This feature would typically be used in conjunction- with a Wiki system.</para>- - <para>Use the <option>--comments-base</option> option to add a- user comments link in the header bar of the contents and index pages.- Use the <option>--comments-module</option> to add a user comments- link in the header bar of each module page. Use the- <option>--comments-entity</option> option to add a comments link- next to the documentation for every value and type in each module.- </para>- - <para>In each case <replaceable>URL</replaceable> is the base URL- where the corresponding comments page can be found. For the- per-module and per-entity URLs the same substitutions are made as- with the <option>--source-module</option> and- <option>--source-entity</option> options above.</para>-- <para>For example, if you want to link the contents page to a wiki- page, and every module to subpages, you would say- <literal>haddock --comments-base=<replaceable>url</replaceable>- --comments-module=<replaceable>url</replaceable>/%M</literal></para>- - <para>If your Wiki system doesn't like the '<literal>.</literal>' character- in Haskell module names, you can replace it with a different character. For- example to replace the '<literal>.</literal>' characters with- '<literal>_</literal>' use <literal>haddock- --comments-base=<replaceable>url</replaceable>- --comments-module=<replaceable>url</replaceable>/%{MODULE/./_}</literal>- Similarly, you can replace the '<literal>/</literal>' in a file name (may- be useful for entity comments, but probably not.) </para>-- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--theme</option></primary></indexterm>- <option>--theme</option>=<replaceable>path</replaceable>- </term>- <listitem>- <para>Specify a theme to be used for HTML (<option>--html</option>)- documentation. If given multiple times then the pages will use the- first theme given by default, and have alternate style sheets for- the others. The reader can switch between themes with browsers that- support alternate style sheets, or with the "Style" menu that gets - added when the page is loaded. If- no themes are specified, then just the default built-in theme- ("Ocean") is used.- </para>- - <para>The <replaceable>path</replaceable> parameter can be one of:- </para>-- <itemizedlist>- <listitem>- <para>A <emphasis>directory</emphasis>: The base name of- the directory becomes the name of the theme. The directory- must contain exactly one- <filename><replaceable>some</replaceable>.css</filename> file.- Other files, usually image files, will be copied, along with- the <filename><replaceable>some</replaceable>.css</filename>- file, into the generated output directory.</para>- </listitem>- <listitem>- <para>A <emphasis>CSS file</emphasis>: The base name of- the file becomes the name of the theme.</para>- </listitem>- <listitem>- <para>The <emphasis>name</emphasis> of a built-in theme- ("Ocean" or "Classic").</para>- </listitem>- </itemizedlist>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--built-in-themes</option></primary></indexterm>- <option>--built-in-themes</option>- </term>- <listitem>- <para>Includes the built-in themes ("Ocean" and "Classic").- Can be combined with <option>--theme</option>. Note that order- matters: The first specified theme will be the default.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-c</option></primary></indexterm>- <option>-c</option> <replaceable>file</replaceable>- </term>- <term>- <indexterm><primary><option>--css</option></primary></indexterm>- <option>--css</option>=<replaceable>file</replaceable>- </term>- <listitem>- <para>Deprecated aliases for <option>--theme</option></para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-p</option></primary></indexterm>- <option>-p</option> <replaceable>file</replaceable>- </term>- <term>- <indexterm><primary><option>--prologue</option></primary></indexterm>- <option>--prologue</option>=<replaceable>file</replaceable>- </term>- <listitem>- <para>Specify a file containing documentation which is- placed on the main contents page under the heading- “Description”. The file is parsed as a normal- Haddock doc comment (but the comment markers are not- required).</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-t</option></primary></indexterm>- <option>-t</option> <replaceable>title</replaceable>- </term>- <term>- <indexterm><primary><option>--title</option></primary></indexterm>- <option>--title</option>=<replaceable>title</replaceable>- </term>- <listitem>- <para>Use <replaceable>title</replaceable> as the page- heading for each page in the documentation.This will- normally be the name of the library being documented.</para>-- <para>The title should be a plain string (no markup- please!).</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-q</option></primary></indexterm>- <option>-q</option> <replaceable>mode</replaceable>- </term>- <term>- <indexterm><primary><option>--qual</option></primary></indexterm>- <option>--qual</option>=<replaceable>mode</replaceable>- </term>- <listitem>- <para>- Specify how identifiers are qualified.- </para>- <para>- <replaceable>mode</replaceable> should be one of- <itemizedlist>- <listitem>- <para>none (default): don't qualify any identifiers</para>- </listitem>- <listitem>- <para>full: always qualify identifiers completely</para>- </listitem>- <listitem>- <para>local: only qualify identifiers that are not part- of the module</para>- </listitem>- <listitem>- <para>relative: like local, but strip name of the module- from qualifications of identifiers in submodules</para>- </listitem>- </itemizedlist>- </para>- <para>- Example: If you generate documentation for module A, then the- identifiers A.x, A.B.y and C.z are qualified as follows.- </para>- <para>- <itemizedlist>- <listitem>- none: x, y, z- </listitem>- <listitem>- full: A.x, A.B.y, C.z- </listitem>- <listitem>- local: x, A.B.y, C.z- </listitem>- <listitem>- relative: x, B.y, C.z- </listitem>- </itemizedlist>- </para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-?</option></primary></indexterm>- <option>-?</option>- </term>- <term>- <indexterm><primary><option>--help</option></primary></indexterm>- <option>--help</option>- </term>- <listitem>- <para>Display help and exit.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-V</option></primary></indexterm>- <option>-V</option>- </term>- <term>- <indexterm><primary><option>--version</option></primary></indexterm>- <option>--version</option>- </term>- <listitem>- <para>Output version information and exit.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-v</option></primary></indexterm>- <option>-v</option>- </term>- <term>- <indexterm><primary><option>--verbose</option></primary></indexterm>- <option>--verbose</option>- </term>- <listitem>- <para>Increase verbosity. Currently this will cause Haddock- to emit some extra warnings, in particular about modules- which were imported but it had no information about (this is- often quite normal; for example when there is no information- about the <literal>Prelude</literal>).</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--use-contents</option></primary></indexterm>- <option>--use-contents=<replaceable>URL</replaceable></option>- </term>- <term>- <indexterm><primary><option>--use-index</option></primary></indexterm>- <option>--use-index=<replaceable>URL</replaceable></option>- </term>- <listitem>- <para>When generating HTML, do not generate an index.- Instead, redirect the Contents and/or Index link on each page to- <replaceable>URL</replaceable>. This option is intended for- use in conjuction with <option>--gen-contents</option> and/or - <option>--gen-index</option> for- generating a separate contents and/or index covering multiple- libraries.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--gen-contents</option></primary></indexterm>- <option>--gen-contents</option>- </term>- <term>- <indexterm><primary><option>--gen-index</option></primary></indexterm>- <option>--gen-index</option>- </term>- <listitem>- <para>Generate an HTML contents and/or index containing entries pulled - from all the specified interfaces (interfaces are specified using- <option>-i</option> or <option>--read-interface</option>).- This is used to generate a single contents and/or index for multiple - sets of Haddock documentation.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--ignore-all-exports</option></primary>- </indexterm>- <option>--ignore-all-exports</option>- </term>- <listitem>- <para>Causes Haddock to behaves as if every module has the- <literal>ignore-exports</literal> attribute (<xref- linkend="module-attributes" />). This might be useful for- generating implementation documentation rather than interface- documentation, for example.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--hide</option></primary>- </indexterm>- <option>--hide</option> <replaceable>module</replaceable>- </term>- <listitem>- <para>Causes Haddock to behaves as if module- <replaceable>module</replaceable> has the <literal>hide</literal>- atribute. (<xref linkend="module-attributes" />).</para>- </listitem>- </varlistentry>- - <varlistentry>- <term>- <indexterm><primary><option>--optghc</option></primary></indexterm>- <option>--optghc</option>=<replaceable>option</replaceable>- </term>- <listitem>- <para>Pass <replaceable>option</replaceable> to GHC.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>-w</option></primary></indexterm>- <option>-w</option>- </term>- <term>- <indexterm><primary><option>--no-warnings</option></primary></indexterm>- <option>--no-warnings</option>- </term>- <listitem>- <para>Turn off all warnings.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><option>--no-tmp-comp-dir</option></primary></indexterm>- <option>--no-tmp-comp-dir</option>- </term>- <listitem>- <para>- Do not use a temporary directory for reading and writing compilation output files- (<literal>.o</literal>, <literal>.hi</literal>, and stub files). Instead, use the- present directory or another directory that you have explicitly told GHC to use- via the <literal>--optghc</literal> flag.- </para>- <para>- This flag can be used to avoid recompilation if compilation files already exist.- Compilation files are produced when Haddock has to process modules that make use of- Template Haskell, in which case Haddock compiles the modules using the GHC API. - </para>- </listitem>- </varlistentry>- </variablelist>-- <section id="cpp">- <title>Using literate or pre-processed source</title>-- <para>Since Haddock uses GHC internally, both plain and - literate Haskell sources are accepted without the need for the user- to do anything. To use the C pre-processor, however,- the user must pass the the <option>-cpp</option> option to GHC - using <option>--optghc</option>.- </para>- </section>-- </chapter>-- <chapter id="markup">- <title>Documentation and Markup</title>-- <para>Haddock understands special documentation annotations in the- Haskell source file and propagates these into the generated- documentation. The annotations are purely optional: if there are- no annotations, Haddock will just generate documentation that- contains the type signatures, data type declarations, and class- declarations exported by each of the modules being- processed.</para>-- <section>- <title>Documenting a top-level declaration</title>-- <para>The simplest example of a documentation annotation is for- documenting any top-level declaration (function type signature,- type declaration, or class declaration). For example, if the- source file contains the following type signature:</para>--<programlisting>-square :: Int -> Int-square x = x * x-</programlisting>-- <para>Then we can document it like this:</para>--<programlisting>--- |The 'square' function squares an integer.-square :: Int -> Int-square x = x * x-</programlisting>--- <para>The <quote><literal>-- |</literal></quote> syntax begins a- documentation annotation, which applies to the- <emphasis>following</emphasis> declaration in the source file.- Note that the annotation is just a comment in Haskell — it- will be ignored by the Haskell compiler.</para>-- <para>The declaration following a documentation annotation- should be one of the following:</para>- <itemizedlist>- <listitem>- <para>A type signature for a top-level function,</para>- </listitem>- <listitem>- <para>A <literal>data</literal> declaration,</para>- </listitem>- <listitem>- <para>A <literal>newtype</literal> declaration,</para>- </listitem>- <listitem>- <para>A <literal>type</literal> declaration, or</para>- </listitem>- <listitem>- <para>A <literal>class</literal> declaration.</para>- </listitem>- </itemizedlist>-- <para>If the annotation is followed by a different kind of- declaration, it will probably be ignored by Haddock.</para>-- <para>Some people like to write their documentation- <emphasis>after</emphasis> the declaration; this is possible in- Haddock too:</para>--<programlisting>-square :: Int -> Int--- ^The 'square' function squares an integer.-square x = x * x-</programlisting>-- <para>Note that Haddock doesn't contain a Haskell type system- — if you don't write the type signature for a function,- then Haddock can't tell what its type is and it won't be- included in the documentation.</para>-- <para>Documentation annotations may span several lines; the- annotation continues until the first non-comment line in the- source file. For example:</para>--<programlisting>--- |The 'square' function squares an integer.--- It takes one argument, of type 'Int'.-square :: Int -> Int-square x = x * x-</programlisting>-- <para>You can also use Haskell's nested-comment style for- documentation annotations, which is sometimes more convenient- when using multi-line comments:</para>--<programlisting>-{-|- The 'square' function squares an integer.- It takes one argument, of type 'Int'.--}-square :: Int -> Int-square x = x * x-</programlisting>-- </section>- <section>- <title>Documenting parts of a declaration</title>-- <para>In addition to documenting the whole declaration, in some- cases we can also document individual parts of the- declaration.</para>-- <section>- <title>Class methods</title>-- <para>Class methods are documented in the same way as top- level type signatures, by using either the- <quote><literal>-- |</literal></quote> or- <quote><literal>-- ^</literal></quote>- annotations:</para>--<programlisting>-class C a where- -- | This is the documentation for the 'f' method- f :: a -> Int- -- | This is the documentation for the 'g' method- g :: Int -> a-</programlisting>- </section>-- <section>- <title>Constructors and record fields</title>-- <para>Constructors are documented like so:</para>--<programlisting>-data T a b- -- | This is the documentation for the 'C1' constructor- = C1 a b- -- | This is the documentation for the 'C2' constructor- | C2 a b-</programlisting>-- <para>or like this:</para>--<programlisting>-data T a b- = C1 a b -- ^ This is the documentation for the 'C1' constructor- | C2 a b -- ^ This is the documentation for the 'C2' constructor-</programlisting>-- <para>Record fields are documented using one of these- styles:</para>--<programlisting>-data R a b =- C { -- | This is the documentation for the 'a' field- a :: a,- -- | This is the documentation for the 'b' field- b :: b- }--data R a b =- C { a :: a -- ^ This is the documentation for the 'a' field- , b :: b -- ^ This is the documentation for the 'b' field- }-</programlisting>-- <para>Alternative layout styles are generally accepted by- Haddock - for example doc comments can appear before or after- the comma in separated lists such as the list of record fields- above.</para>- </section>-- <section>- <title>Function arguments</title>-- <para>Individual arguments to a function may be documented- like this:</para>--<programlisting>-f :: Int -- ^ The 'Int' argument- -> Float -- ^ The 'Float' argument- -> IO () -- ^ The return value-</programlisting>- </section>- </section>-- <section>- <title>The module description</title>-- <para>A module may contain a documentation comment before the- module header, in which case this comment is interpreted by- Haddock as an overall description of the module itself, and- placed in a section entitled <quote>Description</quote> in the- documentation for the module. For example:</para>--<programlisting>--- | This is the description for module "Foo"-module Foo where-...-</programlisting>- </section>-- <section>- <title>Controlling the documentation structure</title>-- <para>Haddock produces interface documentation that lists only- the entities actually exported by the module. The documentation- for a module will include <emphasis>all</emphasis> entities- exported by that module, even if they were re-exported by- another module. The only exception is when Haddock can't see- the declaration for the re-exported entity, perhaps because it- isn't part of the batch of modules currently being- processed.</para>-- <para>However, to Haddock the export list has even more- significance than just specifying the entities to be included in- the documentation. It also specifies the- <emphasis>order</emphasis> that entities will be listed in the- generated documentation. This leaves the programmer free to- implement functions in any order he/she pleases, and indeed in- any <emphasis>module</emphasis> he/she pleases, but still- specify the order that the functions should be documented in the- export list. Indeed, many programmers already do this: the- export list is often used as a kind of ad-hoc interface- documentation, with headings, groups of functions, type- signatures and declarations in comments.</para>-- <para>You can insert headings and sub-headings in the- documentation by including annotations at the appropriate point- in the export list. For example:</para>--<programlisting>-module Foo (- -- * Classes- C(..),- -- * Types- -- ** A data type- T,- -- ** A record- R,- -- * Some functions- f, g- ) where-</programlisting>-- <para>Headings are introduced with the syntax- <quote><literal>-- *</literal></quote>,- <quote><literal>-- **</literal></quote> and so on, where- the number of <literal>*</literal>s indicates the level of the- heading (section, sub-section, sub-sub-section, etc.).</para>-- <para>If you use section headings, then Haddock will generate a- table of contents at the top of the module documentation for- you.</para>-- <para>The alternative style of placing the commas at the- beginning of each line is also supported. eg.:</para>--<programlisting>-module Foo (- -- * Classes- , C(..)- -- * Types- -- ** A data type- , T- -- ** A record- , R- -- * Some functions- , f- , g- ) where-</programlisting>-- <section>- <title>Re-exporting an entire module</title>-- <para>Haskell allows you to re-export the entire contents of a- module (or at least, everything currently in scope that was- imported from a given module) by listing it in the export- list:</para>--<programlisting>-module A (- module B,- module C- ) where-</programlisting>-- <para>What will the Haddock-generated documentation for this- module look like? Well, it depends on how the modules- <literal>B</literal> and <literal>C</literal> are imported.- If they are imported wholly and without any- <literal>hiding</literal> qualifiers, then the documentation- will just contain a cross-reference to the documentation for- <literal>B</literal> and <literal>C</literal>. However, if- the modules are not <emphasis>completely</emphasis>- re-exported, for example:</para>--<programlisting>-module A (- module B,- module C- ) where--import B hiding (f)-import C (a, b)-</programlisting>-- <para>then Haddock behaves as if the set of entities- re-exported from <literal>B</literal> and <literal>C</literal>- had been listed explicitly in the export- list<footnote><para>NOTE: this is not fully implemented at the- time of writing (version 0.2). At the moment, Haddock always- inserts a cross-reference.</para>- </footnote>.</para>-- <para>The exception to this rule is when the re-exported- module is declared with the <literal>hide</literal> attribute- (<xref linkend="module-attributes"/>), in which case the module- is never cross-referenced; the contents are always expanded in- place in the re-exporting module.</para>- </section>-- <section>- <title>Omitting the export list</title>-- <para>If there is no export list in the module, how does- Haddock generate documentation? Well, when the export list is- omitted, e.g.:</para>--<programlisting>module Foo where</programlisting>-- <para>this is equivalent to an export list which mentions- every entity defined at the top level in this module, and- Haddock treats it in the same way. Furthermore, the generated- documentation will retain the order in which entities are- defined in the module. In this special case the module body- may also include section headings (normally they would be- ignored by Haddock).</para>- </section>- </section>-- <section>- <title>Named chunks of documentation</title>-- <para>Occasionally it is desirable to include a chunk of- documentation which is not attached to any particular Haskell- declaration. There are two ways to do this:</para>-- <itemizedlist>- <listitem>- <para>The documentation can be included in the export list- directly, e.g.:</para>--<programlisting>-module Foo (- -- * A section heading-- -- | Some documentation not attached to a particular Haskell entity- ...- ) where-</programlisting>- </listitem>-- <listitem>- <para>If the documentation is large and placing it inline in- the export list might bloat the export list and obscure the- structure, then it can be given a name and placed out of- line in the body of the module. This is achieved with a- special form of documentation annotation- <quote><literal>-- $</literal></quote>:</para>--<programlisting>-module Foo (- -- * A section heading-- -- $doc- ...- ) where---- $doc--- Here is a large chunk of documentation which may be referred to by--- the name $doc.-</programlisting>-- <para>The documentation chunk is given a name, which is the- sequence of alphanumeric characters directly after the- <quote><literal>-- $</literal></quote>, and it may be- referred to by the same name in the export list.</para>- </listitem>- </itemizedlist>- </section>-- <section id="hyperlinking">- <title>Hyperlinking and re-exported entities</title>-- <para>When Haddock renders a type in the generated- documentation, it hyperlinks all the type constructors and class- names in that type to their respective definitions. But for a- given type constructor or class there may be several modules- re-exporting it, and therefore several modules whose- documentation contains the definition of that type or class- (possibly including the current module!) so which one do we link- to?</para>-- <para>Let's look at an example. Suppose we have three modules- <literal>A</literal>, <literal>B</literal> and- <literal>C</literal> defined as follows:</para>--<programlisting>-module A (T) where-data T a = C a--module B (f) where-import A-f :: T Int -> Int-f (C i) = i--module C (T, f) where-import A-import B-</programlisting>-- <para>Module <literal>A</literal> exports a datatype- <literal>T</literal>. Module <literal>B</literal> imports- <literal>A</literal> and exports a function <literal>f</literal>- whose type refers to <literal>T</literal>. Also, both- <literal>T</literal> and <literal>f</literal> are re-exported from- module C.</para>-- <para>Haddock takes the view that each entity has a- <emphasis>home</emphasis> module; that is, the module that the library- designer would most like to direct the user to, to find the- documentation for that entity. So, Haddock makes all links to an entity- point to the home module. The one exception is when the entity is also- exported by the current module: Haddock makes a local link if it- can.</para>-- <para>How is the home module for an entity determined?- Haddock uses the following rules:</para>-- <itemizedlist>- <listitem>- <para>If modules A and B both export the entity, and module A imports- (directly or indirectly) module B, then B is preferred.</para>- </listitem>- <listitem>- <para>A module with the <literal>hide</literal> attribute is never- chosen as the home.</para>- </listitem>- <listitem>- <para>A module with the <literal>not-home</literal> atribute is only- chosen if there are no other modules to choose.</para>- </listitem>- </itemizedlist>-- <para>If multiple modules fit the criteria, then one is chosen at- random. If no modules fit the criteria (because the candidates are all- hidden), then Haddock will issue a warning for each reference to an- entity without a home.</para>-- <para>In the example above, module <literal>A</literal> is chosen as the- home for <literal>T</literal> because it does not import any other- module that exports <literal>T</literal>. The link from- <literal>f</literal>'s- type in module <literal>B</literal> will therefore point to- <literal>A.T</literal>. However, <literal>C</literal> also exports- <literal>T</literal> and <literal>f</literal>, and the link from- <literal>f</literal>'s type in <literal>C</literal> will therefore- point locally to <literal>C.T</literal>.</para>- </section>-- <section id="module-attributes">- <title>Module Attributes</title>-- <para>Certain attributes may be specified for each module which- affects the way that Haddock generates documentation for that- module. Attributes are specified in a comma-separated list in an- <literal>{-# OPTIONS_HADDOCK ... #-}</literal> pragma at the- top of the module, either before or after the module- description. For example:</para>--<programlisting>-{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}---- |Module description-module A where-...-</programlisting>-- <para>The options and module description can be in either order.</para>-- <para>The following attributes are currently understood by- Haddock:</para>-- <variablelist>- <varlistentry>- <term>- <indexterm><primary><literal>hide</literal></primary></indexterm>- <literal>hide</literal>- </term>- <listitem>- <para>Omit this module from the generated documentation,- but nevertheless propagate definitions and documentation- from within this module to modules that re-export those- definitions.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><literal>hide</literal></primary></indexterm>- <literal>prune</literal>- </term>- <listitem>- <para>Omit definitions that have no documentation- annotations from the generated documentation.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><literal>ignore-exports</literal></primary></indexterm>- <literal>ignore-exports</literal>- </term>- <listitem>- <para>Ignore the export list. Generate documentation as- if the module had no export list - i.e. all the top-level- declarations are exported, and section headings may be- given in the body of the module.</para>- </listitem>- </varlistentry>-- <varlistentry>- <term>- <indexterm><primary><literal>not-home</literal></primary></indexterm>- <literal>not-home</literal>- </term>- <listitem>- <para>Indicates that the current module should not be considered to- be the home module for each entity it exports,- unless that entity is not exported from any other module. See- <xref linkend="hyperlinking" /> for more details.</para>- </listitem>- </varlistentry>- </variablelist>-- </section>-- <section>- <title>Markup</title>-- <para>Haddock understands certain textual cues inside- documentation annotations that tell it how to render the- documentation. The cues (or <quote>markup</quote>) have been- designed to be simple and mnemonic in ASCII so that the- programmer doesn't have to deal with heavyweight annotations- when editing documentation comments.</para>-- <section>- <title>Paragraphs</title>-- <para>One or more blank lines separates two paragraphs in a- documentation comment.</para>- </section>-- <section>- <title>Special characters</title>-- <para>The following characters have special meanings in- documentation comments: <literal>\</literal>, <literal>/</literal>,- <literal>'</literal>, <literal>`</literal>,- <literal>"</literal>, <literal>@</literal>,- <literal><</literal>. To insert a literal occurrence of- one of these special characters, precede it with a backslash- (<literal>\</literal>).</para>-- <para>Additionally, the character <literal>></literal> has- a special meaning at the beginning of a line, and the- following characters have special meanings at the beginning of- a paragraph:- <literal>*</literal>, <literal>-</literal>. These characters- can also be escaped using <literal>\</literal>.</para>-- <para>Furthermore, the character sequence <literal>>>></literal>- has a special meaning at the beginning of a line. To- escape it, just prefix the characters in the sequence with a- backslash.</para>- </section>-- <section>- <title>Character references</title>-- <para>Although Haskell source files may contain any character- from the Unicode character set, the encoding of these characters- as bytes varies between systems, so that only source files- restricted to the ASCII character set are portable. Other- characters may be specified in character and string literals- using Haskell character escapes. To represent such characters- in documentation comments, Haddock supports SGML-style numeric- character references of the forms- <literal>&#</literal><replaceable>D</replaceable><literal>;</literal>- and- <literal>&#x</literal><replaceable>H</replaceable><literal>;</literal>- where <replaceable>D</replaceable> and <replaceable>H</replaceable>- are decimal and hexadecimal numbers denoting a code position- in Unicode (or ISO 10646). For example, the references- <literal>&#x3BB;</literal>, <literal>&#x3bb;</literal>- and <literal>&#955;</literal> all represent the lower-case- letter lambda.</para>- </section>-- <section>- <title>Code Blocks</title>-- <para>Displayed blocks of code are indicated by surrounding a- paragraph with <literal>@...@</literal> or by preceding each- line of a paragraph with <literal>></literal> (we often- call these “bird tracks”). For- example:</para>--<programlisting>--- | This documentation includes two blocks of code:------ @--- f x = x + x--- @------ > g x = x * 42-</programlisting>-- <para>There is an important difference between the two forms- of code block: in the bird-track form, the text to the right- of the ‘<literal>></literal>’ is interpreted- literally, whereas the <literal>@...@</literal> form- interprets markup as normal inside the code block.</para>- </section>-- <section>- <title>Examples</title>-- <para> Haddock has markup support for examples of interaction with a- <emphasis>read-eval-print loop (REPL)</emphasis>. An- example is introduced with- <literal>>>></literal> followed by an expression followed- by zero or more result lines:</para>--<programlisting>--- | Two examples are given bellow:------ >>> fib 10--- 55------ >>> putStrLn "foo\nbar"--- foo--- bar-</programlisting>- <para>Result lines that only contain the string- <literal><BLANKLINE></literal> are rendered as blank lines in the- generated documenation.</para>- </section>--- <section>- <title>Hyperlinked Identifiers</title>-- <para>Referring to a Haskell identifier, whether it be a type,- class, constructor, or function, is done by surrounding it- with single quotes:</para>--<programlisting>--- | This module defines the type 'T'.-</programlisting>-- <para>If there is an entity <literal>T</literal> in scope in- the current module, then the documentation will hyperlink the- reference in the text to the definition of- <literal>T</literal> (if the output format supports- hyperlinking, of course; in a printed format it might instead- insert a page reference to the definition).</para>-- <para>It is also possible to refer to entities that are not in- scope in the current module, by giving the full qualified name- of the entity:</para>--<programlisting>--- | The identifier 'M.T' is not in scope-</programlisting>-- <para>If <literal>M.T</literal> is not otherwise in scope,- then Haddock will simply emit a link pointing to the entity- <literal>T</literal> exported from module <literal>M</literal>- (without checking to see whether either <literal>M</literal>- or <literal>M.T</literal> exist).</para>-- <para>To make life easier for documentation writers, a quoted- identifier is only interpreted as such if the quotes surround- a lexically valid Haskell identifier. This means, for- example, that it normally isn't necessary to escape the single- quote when used as an apostrophe:</para>--<programlisting>--- | I don't have to escape my apostrophes; great, isn't it?-</programlisting>-- <para>For compatibility with other systems, the following- alternative form of markup is accepted<footnote><para>- We chose not to use this as the primary markup for- identifiers because strictly speaking the <literal>`</literal>- character should not be used as a left quote, it is a grave accent.</para>- </footnote>: <literal>`T'</literal>.</para>- </section>-- <section>- <title>Emphasis and Monospaced text</title>-- <para>Emphasis may be added by surrounding text with- <literal>/.../</literal>.</para>-- <para>Monospaced (or typewriter) text is indicated by- surrounding it with <literal>@...@</literal>. Other markup is- valid inside a monospaced span: for example- <literal>@'f' a b@</literal> will hyperlink the- identifier <literal>f</literal> inside the code fragment.</para>- </section>-- <section>- <title>Linking to modules</title>-- <para>Linking to a module is done by surrounding the module- name with double quotes:</para>--<programlisting>--- | This is a reference to the "Foo" module.-</programlisting>-- </section>-- <section>- <title>Itemized and Enumerated lists</title>-- <para>A bulleted item is represented by preceding a paragraph- with either <quote><literal>*</literal></quote> or- <quote><literal>-</literal></quote>. A sequence of bulleted- paragraphs is rendered as an itemized list in the generated- documentation, eg.:</para>--<programlisting>--- | This is a bulleted list:------ * first item------ * second item-</programlisting>-- <para>An enumerated list is similar, except each paragraph- must be preceded by either- <quote><literal>(<replaceable>n</replaceable>)</literal></quote>- or- <quote><literal><replaceable>n</replaceable>.</literal></quote>- where <replaceable>n</replaceable> is any integer. e.g.</para>--<programlisting>--- | This is an enumerated list:------ (1) first item------ 2. second item-</programlisting>- </section>-- <section>- <title>Definition lists</title>-- <para>Definition lists are written as follows:</para>--<programlisting>--- | This is a definition list:------ [@foo@] The description of @foo@.------ [@bar@] The description of @bar@.-</programlisting>-- <para>To produce output something like this:</para>-- <variablelist>- <varlistentry>- <term><literal>foo</literal></term>- <listitem>- <para>The description of <literal>foo</literal>.</para>- </listitem>- </varlistentry>- <varlistentry>- <term><literal>bar</literal></term>- <listitem>- <para>The description of <literal>bar</literal>.</para>- </listitem>- </varlistentry>- </variablelist>-- <para>Each paragraph should be preceded by the- “definition term” enclosed in square brackets.- The square bracket characters have no special meaning outside- the beginning of a definition paragraph. That is, if a- paragraph begins with a <literal>[</literal> character, then- it is assumed to be a definition paragraph, and the next- <literal>]</literal> character found will close the definition- term. Other markup operators may be used freely within the- definition term.</para>- </section>-- <section>- <title>URLs</title>-- <para>A URL can be included in a documentation comment by- surrounding it in angle brackets:- <literal><...></literal>. If the output format supports- it, the URL will be turned into a hyperlink when- rendered.</para>- </section>-- <section>- <title>Anchors</title>-- <para>Sometimes it is useful to be able to link to a point in- the documentation which doesn't correspond to a particular- entity. For that purpose, we allow <emphasis>anchors</emphasis> to be- included in a documentation comment. The syntax is- <literal>#<replaceable>label</replaceable>#</literal>, where- <replaceable>label</replaceable> is the name of the anchor.- An anchor is invisible in the generated documentation.</para>-- <para>To link to an anchor from elsewhere, use the syntax- <literal>"<replaceable>module</replaceable>#<replaceable>label</replaceable>"</literal>- where <replaceable>module</replaceable> is the module name- containing the anchor, and <replaceable>label</replaceable> is- the anchor label. The module does not have to be local, it- can be imported via an interface.</para>- </section>- </section>- </chapter>- <index/>-</book>
@@ -0,0 +1,23 @@+Welcome to Haddock's documentation!+===================================++This is Haddock, a tool for automatically generating documentation from+annotated Haskell source code.++Contents:++.. toctree::+ :maxdepth: 2++ intro+ invoking+ markup+ common-errors+ multi-components+++Indices and tables+==================++* :ref:`genindex`+* :ref:`search`
@@ -0,0 +1,124 @@+Introduction+============++This is Haddock, a tool for automatically generating documentation from+annotated Haskell source code. Haddock was designed with several goals+in mind:++- When documenting APIs, it is desirable to keep the documentation+ close to the actual interface or implementation of the API,+ preferably in the same file, to reduce the risk that the two become+ out of sync. Haddock therefore lets you write the documentation for+ an entity (function, type, or class) next to the definition of the+ entity in the source code.++- There is a tremendous amount of useful API documentation that can be+ extracted from just the bare source code, including types of exported+ functions, definitions of data types and classes, and so on. Haddock+ can therefore generate documentation from a set of straight Haskell+ 98 modules, and the documentation will contain precisely the+ interface that is available to a programmer using those modules.++- Documentation annotations in the source code should be easy on the+ eye when editing the source code itself, so as not to obscure the+ code and to make reading and writing documentation annotations easy.+ The easier it is to write documentation, the more likely the+ programmer is to do it. Haddock therefore uses lightweight markup in+ its annotations, taking several ideas from+ `IDoc <https://web.archive.org/web/20180621053227/http://www.cse.unsw.edu.au/~chak/haskell/idoc/>`__. In fact,+ Haddock can understand IDoc-annotated source code.++- The documentation should not expose any of the structure of the+ implementation, or to put it another way, the implementer of the API+ should be free to structure the implementation however he or she+ wishes, without exposing any of that structure to the consumer. In+ practical terms, this means that while an API may internally consist+ of several Haskell modules, we often only want to expose a single+ module to the user of the interface, where this single module just+ re-exports the relevant parts of the implementation modules.++ Haddock therefore understands the Haskell module system and can+ generate documentation which hides not only non-exported entities+ from the interface, but also the internal module structure of the+ interface. A documentation annotation can still be placed next to the+ implementation, and it will be propagated to the external module in+ the generated documentation.++- Being able to move around the documentation by following hyperlinks+ is essential. Documentation generated by Haddock is therefore+ littered with hyperlinks: every type and class name is a link to the+ corresponding definition, and user-written documentation annotations+ can contain identifiers which are linked automatically when the+ documentation is generated.++- We might want documentation in multiple formats - online and printed,+ for example. Haddock comes with HTML, LaTeX, and Hoogle backends, and+ it is structured in such a way that adding new backends is+ straightforward.++Obtaining Haddock+-----------------++Haddock is distributed with GHC distributions, and will automatically be provided if you use +`ghcup <https://www.haskell.org/ghcup>`__, for instance.++Up-to-date sources can also be obtained from our public GitHub+repository. The Haddock sources are at+``https://github.com/haskell/haddock``.++License+-------++The following license covers this documentation, and the Haddock source+code, except where otherwise indicated.++ Copyright (c) 2002-2010, Simon Marlow+ 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.++ 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.++Contributors+------------++A list of contributors to the project can be seen at+``https://github.com/haskell/haddock/graphs/contributors``.++Acknowledgements+----------------++Several documentation systems provided the inspiration for Haddock, most+notably:++- `IDoc <https://web.archive.org/web/20180621053227/http://www.cse.unsw.edu.au/~chak/haskell/idoc/>`__++- `HDoc <https://mail.haskell.org/pipermail/haskelldoc/2001-April/000067.html>`__++- `Doxygen <https://www.doxygen.nl/index.html>`__++and probably several others I've forgotten.++Thanks to the the members of haskelldoc@haskell.org,+haddock@projects.haskell.org and everyone who contributed to the many+libraries that Haddock makes use of.
@@ -0,0 +1,563 @@+Invoking Haddock+================++Haddock is invoked from the command line, like so:++.. code-block:: none++ haddock [option ...] file ...++Where each ``file`` is a filename containing a Haskell source module (.hs)+or a Literate Haskell source module (.lhs) or just a module name.++All the modules specified on the command line will be processed+together. When one module refers to an entity in another module being+processed, the documentation will link directly to that entity.++Entities that cannot be found, for example because they are in a module+that isn't being processed as part of the current batch, simply won't be+hyperlinked in the generated documentation. Haddock will emit warnings+listing all the identifiers it couldn't resolve.++The modules should *not* be mutually recursive, as Haddock don't like+swimming in circles.++Note that while older version would fail on invalid markup, this is+considered a bug in the new versions. If you ever get failed parsing+message, please report it.++You must also specify an option for the output format. Currently only+the :option:`--html` option for HTML, the :option:`--hoogle` option for+outputting Hoogle data, and the :option:`--latex` option are functional.++The packaging tool+`Cabal <http://www.haskell.org/ghc/docs/latest/html/Cabal/index.html>`__+has Haddock support, and is often used instead of invoking Haddock+directly.++The following options are available:++.. option:: -B <dir>++ Tell GHC that its lib directory is dir. Can be used to override+ the default path.++.. option:: -o <dir>+ --odir=<dir>++ Generate files into dir instead of the current directory.++.. option:: -l <dir>+ --lib=<dir>++ Use Haddock auxiliary files (themes, javascript, etc...) in dir.++.. option:: -i <file>+ --read-interface=<file>+ -i <docpath>,<file>+ --read-interface=<docpath>,<file>+ -i <docpath>,<srcpath>,<file>+ --read-interface=<docpath>,<srcpath>,<file>+ -i <docpath>,<srcpath>,<visibility>,<file>++ Read the interface file in file, which must have been produced by+ running Haddock with the :option:`--dump-interface` option. The interface+ describes a set of modules whose HTML documentation is located in+ docpath (which may be a relative pathname). The docpath is optional,+ and defaults to “.”. The srcpath is optional but has no default+ value.++ This option allows Haddock to produce separate sets of documentation+ with hyperlinks between them. The docpath is used to direct+ hyperlinks to point to the right files; so make sure you don't move+ the HTML files later or these links will break. Using a relative+ docpath means that a documentation subtree can still be moved around+ without breaking links.++ Similarly to docpath, srcpath is used generate cross-package+ hyperlinks but within sources rendered with :option:`--hyperlinked-source`+ option.++ If visibility is set to `hidden`, modules from that interface file will+ not be listed in haddock generated content file.++ Multiple :option:`--read-interface` options may be given.++.. option:: -D <file>+ --dump-interface=<file>++ Produce an interface file [1]_ in the file file. An interface file+ contains information Haddock needs to produce more documentation+ that refers to the modules currently being processed - see the+ :option:`--read-interface` option for more details. The interface file is+ in a binary format; don't try to read it.++.. option:: --show-interface=<file>++ Dumps a binary interface file to stdout in a human readable fashion.+ Uses json as output format.++.. [1]+ Haddock interface files are not the same as Haskell interface files,+ I just couldn't think of a better name.++.. option:: --html, -h++ Generate documentation in HTML format. Several files will be+ generated into the current directory (or the specified directory if+ the :option:`-o` option is given), including the following:++ ``module.html``; ``mini_module.html``+ An HTML page for each module, and a "mini" page for each used+ when viewing their synopsis.++ ``index.html``+ The top level page of the documentation: lists the modules+ available, using indentation to represent the hierarchy if the+ modules are hierarchical.++ ``doc-index.html``; ``doc-index-X.html``+ The alphabetic index, possibly split into multiple pages if big+ enough.++ ``some.css``; ``etc...``+ Files needed for the themes used. Specify your themes using the+ :option:`--theme` option.++ ``haddock-util.js``+ Some JavaScript utilities used to implement some of the dynamic+ features like collapsible sections.++.. option:: --mathjax++ Specify a custom URL for a mathjax-compatible JS script. By default,+ this is set to `MathJax+ <https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML>`_.++.. option:: --latex++ Generate documentation in LaTeX format. Several files will be+ generated into the current directory (or the specified directory if+ the :option:`-o` option is given), including the following:++ ``package.tex``+ The top-level LaTeX source file; to format the documentation+ into PDF you might run something like this: ::++ $ pdflatex package.tex++ ``haddock.sty``+ The default style. The file contains definitions for various+ macros used in the LaTeX sources generated by Haddock; to change+ the way the formatted output looks, you might want to override+ these by specifying your own style with the :option:`--latex-style`+ option.++ ``module.tex``+ The LaTeX documentation for each module.++.. option:: --latex-style=<style>++ This option lets you override the default style used by the LaTeX+ generated by the :option:`--latex` option. Normally Haddock puts a+ standard ``haddock.sty`` in the output directory, and includes the+ command ``\usepackage{haddock}`` in the LaTeX source. If this option+ is given, then ``haddock.sty`` is not generated, and the command is+ instead ``\usepackage{style}``.++.. option:: --hoogle++ Generate an index file for the+ `Hoogle <http://hackage.haskell.org/package/hoogle>`_ search engine.+ One text file will be generated into the current directory (or the+ specified directory if the :option:`-o` is given). Note that+ the :option:`--package-name` is required.++ Since the output is intended to be parsed by Hoogle, some conventions+ need to be upheld:++ * Every entity should span exactly one line. ::++ newtype ReaderT r (m :: * -> *) a :: * -> (* -> *) -> * -> *+ + The one exception to this rule is classes. The body of a class+ is split up with one class member per line, an opening brace on+ the line of the header, and a closing brace on a new line after+ the class. ::++ class Foo a where {+ foo :: a -> a -> Baz a;+ type family Baz a;+ type Baz a = [(a, a)];+ }+ + * Entites that are exported only indirectly (for instance data+ constructors visible via a ``ReaderT(..)`` export) have their names+ wrapped in square brackets. ::++ [ReaderT] :: (r -> m a) -> ReaderT r m a+ [runReaderT] :: ReaderT r m a -> r -> m a+++.. option:: --hyperlinked-source++ Generate hyperlinked source code (as HTML web page). All rendered+ files will be put into ``src/`` subfolder of output directory.++ Usually, this should be used in combination with :option:`--html` option -+ generated documentation will then contain references to appropriate+ code fragments. Previously, this behaviour could be achieved by+ generating sources using external tool and specifying+ :option:`--source-base`, :option:`--source-module`, :option:`--source-entity` and+ related options. Note that these flags are ignored once+ :option:`--hyperlinked-source` is set.++ In order to make cross-package source hyperlinking possible,+ appropriate source paths have to be set up when providing interface+ files using :option:`--read-interface` option.++.. option:: --source-css=<style>++ Use custom CSS file for sources rendered by the+ :option:`--hyperlinked-source` option. If no custom style file is+ provided, Haddock will use default one.++.. option:: -S, --docbook++ Reserved for future use (output documentation in DocBook XML+ format).++.. option:: --base-url=<url>++ Base url for static assets (eg. css, javascript, json files etc.).+ When present, static assets are not copied. This option is useful+ when creating documentation for multiple packages, it allows to have+ a single copy of static assets served from the given url.++.. option:: --source-base=<url>+ --source-module=<url>+ --source-entity=<url>+ --source-entity-line=<url>++ Include links to the source files in the generated documentation.+ Use the :option:`--source-base` option to add a source code link in the+ header bar of the contents and index pages. Use the+ :option:`--source-module` to add a source code link in the header bar of+ each module page. Use the :option:`--source-entity` option to add a source+ code link next to the documentation for every value and type in each+ module. :option:`--source-entity-line` is a flag that gets used for+ entities that need to link to an exact source location rather than a+ name, eg. since they were defined inside a Template Haskell splice.++ In each case URL is the base URL where the source files can be+ found. For the per-module and per-entity URLs, the following+ substitutions are made within the string URL:++ - The string ``%M`` or ``%{MODULE}`` is replaced by the module+ name. Note that for the per-entity URLs this is the name of the+ *exporting* module.++ - The string ``%F`` or ``%{FILE}`` is replaced by the original+ source file name. Note that for the per-entity URLs this is the+ name of the *defining* module.++ - The string ``%N`` or ``%{NAME}`` is replaced by the name of the+ exported value or type. This is only valid for the+ :option:`--source-entity` option.++ - The string ``%K`` or ``%{KIND}`` is replaced by a flag indicating+ whether the exported name is a value ``v`` or a type+ ``t``. This is only valid for the :option:`--source-entity` option.++ - The string ``%L`` or ``%{LINE}`` is replaced by the number of the+ line where the exported value or type is defined. This is only+ valid for the :option:`--source-entity` option.++ - The string ``%%`` is replaced by ``%``.++ For example, if your sources are online under some directory, you+ would say ``haddock --source-base=url/ --source-module=url/%F``++ If you have html versions of your sources online with anchors for+ each type and function name, you would say+ ``haddock --source-base=url/ --source-module=url/%M.html --source-entity=url/%M.html#%N``++ For the ``%{MODULE}`` substitution you may want to replace the+ ``.`` character in the module names with some other character+ (some web servers are known to get confused by multiple ``.``+ characters in a file name). To replace it with a character c use+ ``%{MODULE/./c}``.++ Similarly, for the ``%{FILE}`` substitution you may want to replace+ the ``/`` character in the file names with some other character+ (especially for links to colourised entity source code with a shared+ css file). To replace it with a character c use ``%{FILE///c}``/++ One example of a tool that can generate syntax-highlighted HTML from+ your source code, complete with anchors suitable for use from+ haddock, is+ `hscolour <http://www.cs.york.ac.uk/fp/darcs/hscolour>`__.++.. option:: -s <url>+ --source=<url>++ Deprecated aliases for :option:`--source-module`++.. option:: --comments-base=<url>+ --comments-module=<url>+ --comments-entity=<url>++ documentation. This feature would typically be used in conjunction+ with a Wiki system.++ Use the :option:`--comments-base` option to add a user comments link in+ the header bar of the contents and index pages. Use the+ :option:`--comments-module` to add a user comments link in the header bar+ of each module page. Use the :option:`--comments-entity` option to add a+ comments link next to the documentation for every value and type in+ each module.++ In each case URL is the base URL where the corresponding comments+ page can be found. For the per-module and per-entity URLs the same+ substitutions are made as with the :option:`--source-module` and+ :option:`--source-entity` options above.++ For example, if you want to link the contents page to a wiki page,+ and every module to subpages, you would say+ ``haddock --comments-base=url --comments-module=url/%M``++ If your Wiki system doesn't like the ``.`` character in Haskell+ module names, you can replace it with a different character. For+ example to replace the ``.`` characters with ``_`` use+ ``haddock --comments-base=url --comments-module=url/%{MODULE/./_}``.+ Similarly, you can replace the ``/`` in a file name (may be useful for+ entity comments, but probably not).++.. option:: --theme=<path>++ Specify a theme to be used for HTML (:option:`--html`) documentation. If+ given multiple times then the pages will use the first theme given+ by default, and have alternate style sheets for the others. The+ reader can switch between themes with browsers that support+ alternate style sheets, or with the "Style" menu that gets added+ when the page is loaded. If no themes are specified, then just the+ default built-in theme ("Linuwial") is used.++ The path parameter can be one of:++ - A *directory*: The base name of the directory becomes the name of+ the theme. The directory must contain exactly one ``some.css``+ file. Other files, usually image files, will be copied, along+ with the ``some.css`` file, into the generated output directory.++ - A *CSS file*: The base name of the file becomes the name of the+ theme.++ - The *name* of a built-in theme ("Linuwial", "Ocean", or "Classic").++.. option:: --built-in-themes++ Includes the built-in themes ("Linuwial", "Ocean", and "Classic"). Can be+ combined with :option:`--theme`. Note that order matters: The first+ specified theme will be the default.++.. option:: --use-unicode++ Enable use of Unicode characters in HTML output.++.. option:: -c <file>+ --css=<file>++ Deprecated aliases for :option:`--theme`++.. option:: -p <file>+ --prologue=<file>++ Specify a file containing documentation which is placed on the main+ contents page under the heading “Description”. The file is parsed as+ a normal Haddock doc comment (but the comment markers are not+ required).++.. option:: -t <title>+ --title=<title>++ Use title as the page heading for each page in the+ documentation.This will normally be the name of the library being+ documented.++ The title should be a plain string (no markup please!).++.. option:: --package-name=<name>++ Specify the name of the package being documented.++.. option:: --package-version=<version>++ Specify the version of the package being documented.++.. option:: -q <mode>+ --qual=<mode>++ Specify how identifiers are qualified.++ mode should be one of++ - ``none`` (default): don't qualify any identifiers++ - ``full``: always qualify identifiers completely++ - ``local``: only qualify identifiers that are not part of the module++ - ``relative``: like local, but strip name of the module from+ qualifications of identifiers in submodules++ Example: If you generate documentation for module A, then the+ identifiers A.x, A.B.y and C.z are qualified as follows.++ - none: x, y, z++ - full: A.x, A.B.y, C.z++ - local: x, A.B.y, C.z++ - relative: x, B.y, C.z++.. option:: --since-qual=<mode>++ Specify how ``@since`` annotations are qualified.++ mode should be one of++ - ``always`` (default): always qualify ``@since`` annotations with+ a package name and version++ - ``only-external``: only qualify ``@since`` annotations with a+ package name and version when they do not come from the current+ package++.. option:: -?+ --help++ Display help and exit.++.. option:: -V+ --version++ Output version information and exit.++.. option:: --ghc-version++ Output the version of GHC which Haddock expects to find at :option:-B+ and exit.++.. option:: --print-ghc-path++ Output the path to the GHC (which Haddock computes based on :option:-B)+ and exit.++.. option:: --print-ghc-libdir++ Output the path to the GHC ``lib`` directory (which Haddock computes+ based on :option:-B) and exit.++.. option:: -v+ --verbose++ Increase verbosity. Currently this will cause Haddock to emit some+ extra warnings, in particular about modules which were imported but+ it had no information about (this is often quite normal; for example+ when there is no information about the ``Prelude``).++.. option:: --use-contents=<url>+ --use-index=<url>++ When generating HTML, do not generate an index. Instead, redirect+ the Contents and/or Index link on each page to URL. This option is+ intended for use in conjunction with :option:`--gen-contents` and/or+ :option:`--gen-index` for generating a separate contents and/or index+ covering multiple libraries.++.. option:: --gen-contents+ --gen-index++ Generate an HTML contents and/or index containing entries pulled+ from all the specified interfaces (interfaces are specified using+ :option:`-i` or :option:`--read-interface`). This is used to generate a single+ contents and/or index for multiple sets of Haddock documentation.++.. option:: --ignore-all-exports++ Causes Haddock to behave as if every module has the+ ``ignore-exports`` attribute (:ref:`module-attrs`). This might be useful for+ generating implementation documentation rather than interface+ documentation, for example.++.. option:: --hide <module>++ Causes Haddock to behave as if module module has the ``hide``+ attribute. (:ref:`module-attrs`).++.. option:: --show <module>++ Causes Haddock to behave as if module module does not have the ``hide``+ attribute. (:ref:`module-attrs`).++.. option:: --show-all++ Causes Haddock to behave as if no modules have the ``hide`` attribute.+ (:ref:`module-attrs`).++.. option:: --show-extensions <module>++ Causes Haddock to behave as if module module has the+ ``show-extensions`` attribute. (:ref:`module-attrs`).++.. option:: --optghc=<option>++ Pass option to GHC. Note that there is a double dash there, unlike+ for GHC.++.. option:: -w+ --no-warnings++ Turn off all warnings.++.. option:: --interface-version++ Prints out the version of the binary Haddock interface files that+ this version of Haddock generates.++.. option:: --compatible-interface-versions++ Prints out space-separated versions of binary Haddock interface+ files that this version of Haddock is compatible with.++.. option:: --bypass-interface-version-check++ **DANGEROUS** Causes Haddock to ignore the interface versions of+ binary Haddock interface files. This can make Haddock crash during+ deserialization of interface files.++.. option:: --no-tmp-comp-dir++ Do not use a temporary directory for reading and writing compilation+ output files (``.o``, ``.hi``, and stub files). Instead, use the+ present directory or another directory that you have explicitly told+ GHC to use via the :option:`--optghc` flag.++ This flag can be used to avoid recompilation if compilation files+ already exist. Compilation files are produced when Haddock has to+ process modules that make use of Template Haskell, in which case+ Haddock compiles the modules using the GHC API.++.. option:: --print-missing-docs++ Print extra information about any undocumented entities.++Using literate or pre-processed source+--------------------------------------++Since Haddock uses GHC internally, both plain and literate Haskell+sources are accepted without the need for the user to do anything. To+use the C pre-processor, however, the user must pass the ``-cpp``+option to GHC using :option:`--optghc`.
@@ -0,0 +1,1264 @@+Documentation and Markup+========================++Haddock understands special documentation annotations in the Haskell+source file and propagates these into the generated documentation. The+annotations are purely optional: if there are no annotations, Haddock+will just generate documentation that contains the type signatures, data+type declarations, and class declarations exported by each of the+modules being processed.++.. _top-level-declaration:++Documenting a Top-Level Declaration+-----------------------------------++The simplest example of a documentation annotation is for documenting+any top-level declaration (function type signature, type declaration, or+class declaration). For example, if the source file contains the+following type signature: ::++ square :: Int -> Int+ square x = x * x++Then we can document it like this: ::++ -- |The 'square' function squares an integer.+ square :: Int -> Int+ square x = x * x++The ``-- |`` syntax begins a documentation annotation, which applies+to the *following* declaration in the source file. Note that the+annotation is just a comment in Haskell — it will be ignored by the+Haskell compiler.++The declaration following a documentation annotation should be one of+the following:++- A type signature for a top-level function,++- A definition for a top-level function with no type signature,++- A ``data`` declaration,++- A ``pattern`` declaration,++- A ``newtype`` declaration,++- A ``type`` declaration++- A ``class`` declaration,++- An ``instance`` declaration,++- A ``data family`` or ``type family`` declaration, or++- A ``data instance`` or ``type instance`` declaration.++If the annotation is followed by a different kind of declaration, it+will probably be ignored by Haddock.++Some people like to write their documentation *after* the declaration;+this is possible in Haddock too: ::++ square :: Int -> Int+ -- ^The 'square' function squares an integer.+ square x = x * x++Since Haddock uses the GHC API internally, it can infer types for+top-level functions without type signatures. However, you're+encouraged to add explicit type signatures for all top-level+functions, to make your source code more readable for your users, and+at times to avoid GHC inferring overly general type signatures that+are less helpful to your users.++Documentation annotations may span several lines; the annotation+continues until the first non-comment line in the source file. For+example: ::++ -- |The 'square' function squares an integer.+ -- It takes one argument, of type 'Int'.+ square :: Int -> Int+ square x = x * x++You can also use Haskell's nested-comment style for documentation+annotations, which is sometimes more convenient when using multi-line+comments: ::++ {-|+ The 'square' function squares an integer.+ It takes one argument, of type 'Int'.+ -}+ square :: Int -> Int+ square x = x * x++Documenting Parts of a Declaration+----------------------------------++In addition to documenting the whole declaration, in some cases we can+also document individual parts of the declaration.++Class Methods+~~~~~~~~~~~~~++Class methods are documented in the same way as top level type+signatures, by using either the ``-- |`` or ``-- ^`` annotations: ::++ class C a where+ -- | This is the documentation for the 'f' method+ f :: a -> Int+ -- | This is the documentation for the 'g' method+ g :: Int -> a++Associated type and data families can also be annotated in this way.++Constructors and Record Fields+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++Constructors are documented like so: ::++ data T a b+ -- | This is the documentation for the 'C1' constructor+ = C1 a b+ -- | This is the documentation for the 'C2' constructor+ | C2 a b++or like this: ::++ data T a b+ = C1 -- ^ This is the documentation for the 'C1' constructor+ a -- ^ This is the documentation for the argument of type 'a'+ b -- ^ This is the documentation for the argument of type 'b'++There is one edge case that is handled differently: only one ``-- ^``+annotation occurring after the constructor and all its arguments is+applied to the constructor, not its last argument: ::++ data T a b+ = C1 a b -- ^ This is the documentation for the 'C1' constructor+ | C2 a b -- ^ This is the documentation for the 'C2' constructor++Record fields are documented using one of these styles: ::++ data R a b =+ C { -- | This is the documentation for the 'a' field+ a :: a,+ -- | This is the documentation for the 'b' field+ b :: b+ }++ data R a b =+ C { a :: a -- ^ This is the documentation for the 'a' field+ , b :: b -- ^ This is the documentation for the 'b' field+ }++Alternative layout styles are generally accepted by Haddock - for+example doc comments can appear before or after the comma in separated+lists such as the list of record fields above.++In cases where more than one constructor exports a field with the same+name, the documentation attached to the first occurrence of the field+will be used, even if a comment is not present. ::++ data T a = A { someField :: a -- ^ Doc for someField of A+ }+ | B { someField :: a -- ^ Doc for someField of B+ }++In the above example, all occurrences of ``someField`` in the+documentation are going to be documented with+``Doc for someField of A``. Note that Haddock versions 2.14.0 and before+would join up documentation of each field and render the result. The+reason for this seemingly weird behaviour is the fact that ``someField``+is actually the same (partial) function.++Deriving clauses+~~~~~~~~~~~~~~~~++Most instances are top-level, so can be documented as in+:ref:`top-level-declaration`. The exception to this is instance that are+come from a ``deriving`` clause on a datatype declaration. These can+be documented like this: ::++ data D a = L a | M+ deriving ( Eq -- ^ @since 4.5+ , Ord -- ^ default 'Ord' instance+ )++This also scales to the various GHC extensions for deriving: ::++ newtype T a = T a+ deriving Show -- ^ derivation of 'Show'+ deriving stock ( Eq -- ^ stock derivation of 'Eq'+ , Foldable -- ^ stock derivation of 'Foldable'+ )+ deriving newtype Ord -- ^ newtype derivation of 'Ord'+ deriving anyclass Read -- ^ unsafe derivation of 'Read'+ deriving ( Eq1 -- ^ deriving 'Eq1' via 'Identity'+ , Ord1 -- ^ deriving 'Ord1' via 'Identity'+ ) via Identity++Function Arguments+~~~~~~~~~~~~~~~~~~++Individual arguments to a function may be documented like this: ::++ f :: Int -- ^ The 'Int' argument+ -> Float -- ^ The 'Float' argument+ -> IO () -- ^ The return value++Pattern synonyms, GADT-style data constructors, and class methods also+support this style of documentation.++.. _module-description:++The Module Description+----------------------++A module itself may be documented with multiple fields that can then be+displayed by the backend. In particular, the HTML backend displays all+the fields it currently knows about. We first show the most complete+module documentation example and then talk about the fields. ::++ {-|+ Module : W+ Description : Short description+ Copyright : (c) Some Person, 2013+ Someone Else, 2014+ License : GPL-3+ Maintainer : sample@email.com+ Stability : experimental+ Portability : POSIX++ Here is a longer description of this module, containing some+ commentary with @some markup@.+ -}+ module W where+ ...++All fields are optional but they must be in order if they do appear.+Multi-line fields are accepted but the consecutive lines have to start+indented more than their label. If your label is indented one space, as+is often the case with the ``--`` syntax, the consecutive lines have+to start at two spaces at the very least. For example, above we saw a+multiline ``Copyright`` field: ::++ {-|+ ...+ Copyright : (c) Some Person, 2013+ Someone Else, 2014+ ...+ -}++That could equivalently be written as: ::++ -- | ...+ -- Copyright:+ -- (c) Some Person, 2013+ -- Someone Else, 2014+ -- ...++or as: ::++ -- | ...+ -- Copyright: (c) Some Person, 2013+ -- Someone Else, 2014+ -- ...++but not as: ::++ -- | ...+ -- Copyright: (c) Some Person, 2013+ -- Someone Else, 2014+ -- ...++since the ``Someone`` needs to be indented more than the+``Copyright``.++Whether new lines and other formatting in multiline fields is+preserved depends on the field type. For example, new lines in the+``Copyright`` field are preserved, but new lines in the+``Description`` field are not; leading whitespace is not preserved in+either [#backend]_. Please note that we do not enforce the format for+any of the fields and the established formats are just a convention.++.. [#backend] Technically, whitespace and newlines in the+ ``Description`` field are preserved verbatim by the HTML backend,+ but because most browsers collapse whitespace in HTML, they don't+ render as such. But other backends may render this whitespace.++Fields of the Module Description+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++The ``Module`` field specifies the current module name. Since the module+name can be inferred automatically from the source file, it doesn't+affect the output of any of the backends. But you might want to+include it for any other tools that might be parsing these comments+without the help of GHC.++The ``Description`` field accepts some short text which outlines the+general purpose of the module. If you're generating HTML, it will show+up next to the module link in the module index.++The ``Copyright``, ``License``, ``Maintainer`` and ``Stability`` fields should+be obvious. An alternative spelling for the ``License`` field is accepted+as ``Licence`` but the output will always prefer ``License``.++The ``Portability`` field has seen varied use by different library+authors. Some people put down things like operating system constraints+there while others put down which GHC extensions are used in the module.+Note that you might want to consider using the ``show-extensions`` module+flag for the latter (see :ref:`module-attrs`).++Finally, a module may contain a documentation comment before the+module header, in which case this comment is interpreted by Haddock as+an overall description of the module itself, and placed in a section+entitled ``Description`` in the documentation for the module. All the+usual Haddock :ref:`markup` is valid in this comment.++Controlling the Documentation Structure+---------------------------------------++Haddock produces interface documentation that lists only the entities+actually exported by the module. If there is no export list then all+entities defined by the module are exported.++The documentation for a module will+include *all* entities exported by that module, even if they were+re-exported from another module. The only exception is when Haddock can't+see the declaration for the re-exported entity, perhaps because it isn't+part of the batch of modules currently being processed.++To Haddock the export list has even more significance than just+specifying the entities to be included in the documentation. It also+specifies the *order* that entities will be listed in the generated+documentation. This leaves the programmer free to implement functions in+any order he/she pleases, and indeed in any *module* he/she pleases, but+still specify the order that the functions should be documented in the+export list. Indeed, many programmers already do this: the export list+is often used as a kind of ad-hoc interface documentation, with+headings, groups of functions, type signatures and declarations in+comments.++In the next section we give examples illustrating most of the+structural markup features. After the examples we go into more detail+explaining the related markup, namely :ref:`section-headings`,+:ref:`named-chunks`, and :ref:`re-exporting-entire-module`.++.. _structure-examples:++Documentation Structure Examples+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++We now give several examples that produce similar results and+illustrate most of the structural markup features. The first two+examples use an export list, but the third example does not.++The first example, using an export list with :ref:`section-headings`+and inline section descriptions: ::++ module Image+ ( -- * Image importers+ --+ -- | There is a "smart" importer, 'readImage', that determines+ -- the image format from the file extension, and several+ -- "dumb" format-specific importers that decode the file as+ -- the specified type.+ readImage+ , readPngImage+ , readGifImage+ , ...+ -- * Image exporters+ -- ...+ ) where++ import Image.Types ( Image )++ -- | Read an image, guessing the format from the file name.+ readImage :: FilePath -> IO Image+ readImage = ...++ -- | Read a GIF.+ readGifImage :: FilePath -> IO Image+ readGifImage = ...++ -- | Read a PNG.+ readPngImage :: FilePath -> IO Image+ readPngImage = ...++ ...++Note that the order of the entities ``readPngImage`` and+``readGifImage`` in the export list is different from the order of the+actual declarations farther down; the order in the export list is the+order used in the generated docs. Also, the imported ``Image`` type+itself is not re-exported, so it will not be included in the rendered+docs (see :ref:`hyperlinking-re-exported`).++The second example, using an export list with a section description+defined elsewhere (the ``$imageImporters``; see :ref:`named-chunks`):+::++ module Image+ ( -- * Image importers+ --+ -- $imageImporters+ readImage+ , readPngImage+ , readGifImage+ , ...+ -- * Image exporters+ -- ...+ ) where++ import Image.Types ( Image )++ -- $imageImporters+ --+ -- There is a "smart" importer, 'readImage', that determines the+ -- image format from the file extension, and several "dumb"+ -- format-specific importers that decode the file as the specified+ -- type.++ -- | Read an image, guessing the format from the file name.+ readImage :: FilePath -> IO Image+ readImage = ...++ -- | Read a GIF.+ readGifImage :: FilePath -> IO Image+ readGifImage = ...++ -- | Read a PNG.+ readPngImage :: FilePath -> IO Image+ readPngImage = ...++ ...++This produces the same rendered docs as the first example, but the+source code itself is arguably more readable, since the documentation+for the group of importer functions is closer to their definitions.++The third example, without an export list: ::++ module Image where++ import Image.Types ( Image )++ -- * Image importers+ --+ -- $imageImporters+ --+ -- There is a "smart" importer, 'readImage', that determines the+ -- image format from the file extension, and several "dumb"+ -- format-specific importers that decode the file as the specified+ -- type.++ -- | Read an image, guessing the format from the file name.+ readImage :: FilePath -> IO Image+ readImage = ...++ -- | Read a GIF.+ readGifImage :: FilePath -> IO Image+ readGifImage = ...++ -- | Read a PNG.+ readPngImage :: FilePath -> IO Image+ readPngImage = ...++ ...++ -- * Image exporters+ -- ...++Note that the section headers (e.g. ``-- * Image importers``) now+appear in the module body itself, and that the section documentation+is still given using :ref:`named-chunks`. Unlike in the first example+when using an export list, the named chunk syntax ``$imageImporters``+*must* be used for the section documentation; attempting to use the+``-- | ...`` syntax to document the image importers here will wrongly+associate the documentation chunk with the next definition!++.. _section-headings:++Section Headings+~~~~~~~~~~~~~~~~++You can insert headings and sub-headings in the documentation by+including annotations at the appropriate point in the export list, or+in the module body directly when not using an export list.++For example: ::++ module Foo (+ -- * Classes+ C(..),+ -- * Types+ -- ** A data type+ T,+ -- ** A record+ R,+ -- * Some functions+ f, g+ ) where++Headings are introduced with the syntax ``-- *``, ``-- **`` and so+on, where the number of ``*``\ s indicates the level of the heading+(section, sub-section, sub-sub-section, etc.).++If you use section headings, then Haddock will generate a table of+contents at the top of the module documentation for you.++By default, when generating HTML documentation Haddock will create an+anchor to each section of the form ``#g:n``, where ``n`` is an integer+that might change as you add new section headings. If you want to+create stable links, you can add an explicit anchor (see+:ref:`anchors`) after the section heading: ::++ module Foo (+ -- * Classes #classes#+ C(..)+ ) where++This will create an HTML anchor ``#g:classes`` to the section.++The alternative style of placing the commas at the beginning of each+line is also supported, e.g.: ::++ module Foo (+ -- * Classes+ C(..)+ -- * Types+ -- ** A data type+ , T+ -- ** A record+ , R+ -- * Some functions+ , f+ , g+ ) where++When not using an export list, you may insert section headers in the+module body. Such section headers associate with all entities+declared up until the next section header. For example: ::++ module Foo where++ -- * Classes+ class C a where ...++ -- * Types+ -- ** A data type+ data T = ...++ -- ** A record+ data R = ...++ -- * Some functions+ f :: ...+ f = ...+ g :: ...+ g = ...++.. _re-exporting-entire-module:++Re-Exporting an Entire Module+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++Haskell allows you to re-export the entire contents of a module (or at+least, everything currently in scope that was imported from a given+module) by listing it in the export list: ::++ module A (+ module B,+ module C+ ) where++What will the Haddock-generated documentation for this module look like?+Well, it depends on how the modules ``B`` and ``C`` are imported. If+they are imported wholly and without any ``hiding`` qualifiers, then the+documentation will just contain a cross-reference to the documentation+for ``B`` and ``C``.++However, if the modules are not *completely* re-exported, for example:+::++ module A (+ module B,+ module C+ ) where++ import B hiding (f)+ import C (a, b)++then Haddock behaves as if the set of entities re-exported from ``B``+and ``C`` had been listed explicitly in the export list.++The exception to this rule is when the re-exported module is declared+with the ``hide`` attribute (see :ref:`module-attrs`), in which+case the module is+never cross-referenced; the contents are always expanded in place in the+re-exporting module.++.. _named-chunks:++(Named) Chunks of Documentation+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++It is often desirable to include a chunk of documentation which is not+attached to any particular Haskell declaration, for example, when+giving summary documentation for a group of related definitions (see+:ref:`structure-examples`). In addition to including such documentation+chunks at the top of the file, as part of the+:ref:`module-description`, you can also associate them with+:ref:`section-headings`.++There are several ways to associate documentation chunks with section+headings, depending on whether you are using an export list or not:++- The documentation can be included in the export list directly, by+ preceding it with a ``-- |``. For example: ::++ module Foo (+ -- * A section heading++ -- | Some documentation not attached to a particular Haskell entity+ ...+ ) where++ In this case the chunk is not "named".++- If the documentation is large and placing it inline in the export+ list might bloat the export list and obscure the structure, then it+ can be given a name and placed out of line in the body of the module.+ This is achieved with a special form of documentation annotation+ ``-- $``, which we call a *named chunk*: ::++ module Foo (+ -- * A section heading++ -- $doc+ ...+ ) where++ -- $doc+ -- Here is a large chunk of documentation which may be referred to by+ -- the name $doc.++ The documentation chunk is given a name of your choice (here+ ``doc``), which is the sequence of alphanumeric characters directly+ after the ``-- $``, and it may be referred to by the same name in+ the export list. Note that named chunks must come *after* any+ imports in the module body.++- If you aren't using an export list, then your only choice is to use+ a named chunk with the ``-- $`` syntax. For example: ::++ module Foo where++ -- * A section heading+ --+ -- $doc+ -- Here is a large chunk of documentation which may be referred to by+ -- the name $doc.++ Just like with entity declarations when not using an export list,+ named chunks of documentation are associated with the preceding+ section header here, or with the implicit top-level documentation+ section if there is no preceding section header.++ **Warning**: the form used in the first bullet above, where the+ chunk is not named, *does not work* when you aren't using an+ export list. For example: ::++ module Foo where++ -- * A section heading+ --+ -- | Some documentation not attached to a particular Haskell entity++ -- | The fooifier.+ foo :: ...++ will result in ``Some documentation not ...`` being attached to the+ *next* entity declaration, here ``foo``, in addition to any other+ documentation that next entity already has!++.. _hyperlinking-re-exported:++Hyperlinking and Re-Exported Entities+-------------------------------------++When Haddock renders a type in the generated documentation, it+hyperlinks all the type constructors and class names in that type to+their respective definitions. But for a given type constructor or class+there may be several modules re-exporting it, and therefore several+modules whose documentation contains the definition of that type or+class (possibly including the current module!) so which one do we link+to?++Let's look at an example. Suppose we have three modules ``A``, ``B`` and+``C`` defined as follows: ::++ module A (T) where+ data T a = C a++ module B (f) where+ import A+ f :: T Int -> Int+ f (C i) = i++ module C (T, f) where+ import A+ import B++Module ``A`` exports a datatype ``T``. Module ``B`` imports ``A`` and+exports a function ``f`` whose type refers to ``T``. Also, both ``T``+and ``f`` are re-exported from module C.++Haddock takes the view that each entity has a *home* module; that is,+the module that the library designer would most like to direct the user+to, to find the documentation for that entity. So, Haddock makes all+links to an entity point to the home module. The one exception is when+the entity is also exported by the current module: Haddock makes a local+link if it can.++How is the home module for an entity determined? Haddock uses the+following rules:++- If modules A and B both export the entity, and module A imports+ (directly or indirectly) module B, then B is preferred.++- A module with the ``hide`` attribute is never chosen as the home.++- A module with the ``not-home`` attribute is only chosen if there are+ no other modules to choose.++If multiple modules fit the criteria, then one is chosen at random. If+no modules fit the criteria (because the candidates are all hidden),+then Haddock will issue a warning for each reference to an entity+without a home.++In the example above, module ``A`` is chosen as the home for ``T``+because it does not import any other module that exports ``T``. The link+from ``f``'s type in module ``B`` will therefore point to ``A.T``.+However, ``C`` also exports ``T`` and ``f``, and the link from ``f``'s+type in ``C`` will therefore point locally to ``C.T``.++.. _module-attrs:++Module Attributes+-----------------++Certain attributes may be specified for each module which affect the+way that Haddock generates documentation for that module. Attributes are+specified in a comma-separated list in an+``{-# OPTIONS_HADDOCK ... #-}`` pragma at the top of the module, either+before or after the module description. For example: ::++ {-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}++ -- |Module description+ module A where+ ...++The options and module description can be in either order.++The following attributes are currently understood by Haddock:++``hide``+ Omit this module from the generated documentation, but nevertheless+ propagate definitions and documentation from within this module to+ modules that re-export those definitions.++``prune``+ Omit definitions that have no documentation annotations from the+ generated documentation.++``ignore-exports``+ Ignore the export list. Generate documentation as if the module had+ no export list - i.e. all the top-level declarations are exported,+ and section headings may be given in the body of the module.++``not-home``+ Indicates that the current module should not be considered to be the+ home module for each entity it exports, unless that entity is not+ exported from any other module. See :ref:`hyperlinking-re-exported`+ for more details.++``show-extensions``+ Indicates that we should render the extensions used in this module+ in the resulting documentation. This will only render if the output+ format supports it. If Language is set, it will be shown as well and+ all the extensions implied by it won't. All enabled extensions will+ be rendered, including those implied by their more powerful+ versions.++.. _markup:++Markup+------++Haddock understands certain textual cues inside documentation+annotations that tell it how to render the documentation. The cues (or+“markup”) have been designed to be simple and mnemonic in ASCII so+the programmer doesn't have to deal with heavyweight annotations when+editing documentation comments.++Paragraphs+~~~~~~~~~~++One or more blank lines separates two paragraphs in a documentation+comment.++Special Characters+~~~~~~~~~~~~~~~~~~++The following characters have special meanings in documentation comments:+``\``, ``/``, ``'``, `````, ``"``, ``@``, ``<``, ``$``, ``#``. To insert a+literal occurrence of one of these special characters, precede it with a+backslash (``\``).++Additionally, the character ``>`` has a special meaning at the beginning+of a line, and the following characters have special meanings at the+beginning of a paragraph: ``*``, ``-``. These characters can also be+escaped using ``\``.++Furthermore, the character sequence ``>>>`` has a special meaning at the+beginning of a line. To escape it, just prefix the characters in the+sequence with a backslash.++Character References+~~~~~~~~~~~~~~~~~~~~++Although Haskell source files may contain any character from the Unicode+character set, the encoding of these characters as bytes varies between+systems. Consequently, only source files restricted to the ASCII character set+are portable. Other characters may be specified in character and string+literals using Haskell character escapes. To represent such characters+in documentation comments, Haddock supports SGML-style numeric character+references of the forms ``&#``\ D\ ``;`` and ``&#x``\ H\ ``;`` where D+and H are decimal and hexadecimal numbers denoting a code position in+Unicode (or ISO 10646). For example, the references ``λ``,+``λ`` and ``λ`` all represent the lower-case letter lambda.++Code Blocks+~~~~~~~~~~~++Displayed blocks of code are indicated by surrounding a paragraph with+``@...@`` or by preceding each line of a paragraph with ``>`` (we often+call these “bird tracks”). For example: ::++ -- | This documentation includes two blocks of code:+ --+ -- @+ -- f x = x + x+ -- @+ --+ -- > g x = x * 42++There is an important difference between the two forms of code block: in+the bird-track form, the text to the right of the ‘\ ``>``\ ’ is+interpreted literally, whereas the ``@...@`` form interprets markup as+normal inside the code block. In particular, ``/`` is markup for italics,+and so e.g. ``@x / y / z@`` renders as ``x`` followed by italic+``y`` with no slashes, followed by ``z``.++Examples+~~~~~~~~++Haddock has markup support for examples of interaction with a+*read-eval-print loop (REPL)*. An example is introduced with ``>>>``+followed by an expression followed by zero or more result lines: ::++ -- | Two examples are given below:+ --+ -- >>> fib 10+ -- 55+ --+ -- >>> putStrLn "foo\nbar"+ -- foo+ -- bar++Result lines that only contain the string ``<BLANKLINE>`` are rendered+as blank lines in the generated documentation.++Properties+~~~~~~~~~~++Haddock provides markup for properties: ::++ -- | Addition is commutative:+ --+ -- prop> a + b = b + a++This allows third-party applications to extract and verify them.++Hyperlinked Identifiers+~~~~~~~~~~~~~~~~~~~~~~~++Referring to a Haskell identifier, whether it be a type, class,+constructor, or function, is done by surrounding it with a combination+of single quotes and backticks. For example: ::++ -- | This module defines the type 'T'.++```T``` is also ok. ``'T``` and ```T'`` are accepted but less common.++If there is an entity ``T`` in scope in the current module, then the+documentation will hyperlink the reference in the text to the definition+of ``T`` (if the output format supports hyperlinking, of course; in a+printed format it might instead insert a page reference to the+definition).++It is also possible to refer to entities that are not in scope in the+current module, by giving the full qualified name of the entity: ::++ -- | The identifier 'M.T' is not in scope++If ``M.T`` is not otherwise in scope, then Haddock will simply emit a+link pointing to the entity ``T`` exported from module ``M`` (without+checking to see whether either ``M`` or ``M.T`` exist).++Since values and types live in different namespaces in Haskell, it is possible+for a reference such as ``'X'`` to be ambiguous. In such a case, Haddock+defaults to pointing to the type. The ambiguity can be overcome by explicitly+specifying a namespace, by way of a ``v`` (for value) or ``t`` (for type)+immediately before the link: ::++ -- | An implicit reference to 'X', the type constructor+ -- An explicit reference to v'X', the data constructor+ -- An explicit reference to t'X', the type constructor+ data X = X++To make life easier for documentation writers, a quoted identifier is+only interpreted as such if the quotes surround a lexically valid+Haskell identifier. This means, for example, that it normally isn't+necessary to escape the single quote when used as an apostrophe: ::++ -- | I don't have to escape my apostrophes; great, isn't it?++Nothing special is needed to hyperlink identifiers which contain+apostrophes themselves: to hyperlink ``foo'`` one would simply type+``'foo''``. Hyperlinking operators works in exactly the same way. ::++ -- | A prefix operator @'(++)'@ and an infix identifier @'`elem`'@.++Emphasis, Bold and Monospaced Styled Text+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++Text can be emphasized, made bold (strong) or monospaced (typewriter font) +by surrounding it with slashes, double-underscores or at-symbols: ::++ -- | This is /emphasized text/, __bold text__ and @monospaced text@.++Note that those styled texts must be kept on the same line: ::++ -- | Styles /do not work+ -- | when continuing on the next line/++Other markup is valid inside emphasized, bold and monospaced text.++Frequent special cases: ++* To have a forward slash inside of emphasis, just escape it: ``/fo\/o/``.+* There's no need to escape a single underscore if you need it+ bold: ``__This_text_with_underscores_is_bold__``.+* ``@'f' a b@`` will hyperlink the identifier ``f`` inside the code+ fragment.+* ``@__FILE__@`` will render ``FILE`` in bold with no underscores, + which may not be what you had in mind.++Linking to Modules+~~~~~~~~~~~~~~~~~~++Linking to a module is done by surrounding the module name with double+quotes: ::++ -- | This is a reference to the "Foo" module.++A basic check is done on the syntax of the header name to ensure that it+is valid before turning it into a link but unlike with identifiers,+whether the module is in scope isn't checked and will always be turned+into a link.++It is also possible to specify alternate text for the generated link+using syntax analogous to that used for URLs: ::++ -- | This is a reference to [the main module]("Module.Main").++Itemized and Enumerated Lists+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++A bulleted item is represented by preceding a paragraph with either+“``*``” or “``-``”. A sequence of bulleted paragraphs is rendered as an+itemized list in the generated documentation, e.g.: ::++ -- | This is a bulleted list:+ --+ -- * first item+ --+ -- * second item++An enumerated list is similar, except each paragraph must be preceded by+either “``(n)``” or “``n.``” where n is any integer. e.g. ::++ -- | This is an enumerated list:+ --+ -- (1) first item+ --+ -- 2. second item++Lists of the same type don't have to be separated by a newline: ::++ -- | This is an enumerated list:+ --+ -- (1) first item+ -- 2. second item+ --+ -- This is a bulleted list:+ --+ -- * first item+ -- * second item++You can have more than one line of content in a list element: ::++ -- |+ -- * first item+ -- and more content for the first item+ -- * second item+ -- and more content for the second item++You can even nest whole paragraphs inside of list elements. The rules+are 4 spaces for each indentation level. You're required to use a+newline before such nested paragraphs: ::++ {-|+ * Beginning of list+ This belongs to the list above!++ > nested+ > bird+ > tracks++ * Next list+ More of the indented list.++ * Deeper++ @+ even code blocks work+ @++ * Deeper++ 1. Even deeper!+ 2. No newline separation even in indented lists.+ -}++The indentation of the first list item is honoured. That is, in the+following example the items are on the same level. Before Haddock+2.16.1, the second item would have been nested under the first item+which was unexpected. ::++ {-|+ * foo++ * bar+ -}++Definition Lists+~~~~~~~~~~~~~~~~++Definition lists are written as follows: ::++ -- | This is a definition list:+ --+ -- [@foo@]: The description of @foo@.+ --+ -- [@bar@]: The description of @bar@.++To produce output something like this:++``foo``+ The description of ``foo``.++``bar``+ The description of ``bar``.++Each paragraph should be preceded by the “definition term” enclosed in+square brackets and followed by a colon. Other markup operators may be+used freely within the definition term. You can escape ``]`` with a+backslash as usual.++Same rules about nesting and no newline separation as for bulleted and+numbered lists apply.++URLs+~~~~++A URL can be included in a documentation comment by surrounding it in+angle brackets, for example: ::++ <http://example.com>++If the output format supports it, the URL will be turned into a+hyperlink when rendered.++If Haddock sees something that looks like a URL (such as something+starting with ``http://`` or ``ssh://``) where the URL markup is valid,+it will automatically make it a hyperlink.++Links+~~~~~++Haddock supports Markdown syntax for inline links. A link consists of a+link text and a URL. The link text is enclosed in square brackets and+followed by the URL enclosed in regular parentheses, for example: ::++ [some link](http://example.com)++The link text is used as a description for the URL if the output+format supports it.+ +Images+~~~~~~++Haddock supports Markdown syntax for inline images. This resembles the+syntax for links, but starts with an exclamation mark. An example looks+like this: ::++ ++If the output format supports it, the image will be rendered inside the+documentation. The image description is used as replacement text and/or+an image title.++Mathematics / LaTeX+~~~~~~~~~~~~~~~~~~~++Haddock supports LaTeX syntax for rendering mathematical notation. The+delimiters are ``\[...\]`` for displayed mathematics and ``\(...\)``+for in-line mathematics. An example looks like this: ::++ \[+ f(a) = \frac{1}{2\pi i}\oint_\gamma \frac{f(z)}{z-a}\,\mathrm{d}z+ \]++If the output format supports it, the mathematics will be rendered+inside the documentation. For example, the HTML backend will display+the mathematics via `MathJax <https://www.mathjax.org>`__.++Grid Tables+~~~~~~~~~~~++Inspired by reSTs grid tables, Haddock supports a complete table representation+via grid-like "ASCII art". Grid tables are described with a visual grid made+up of the characters "-", "=", "|", and "+". The hyphen ("-") is used for+horizontal lines (row separators). The equals sign ("=") may be used to+separate optional header rows from the table body. The vertical bar ("|") is+used for vertical lines (column separators). The plus sign ("+") is used for+intersections of horizontal and vertical lines. ::++ -- | This is a grid table:+ --+ -- +------------------------+------------+----------+----------++ -- | Header row, column 1 | Header 2 | Header 3 | Header 4 |+ -- | (header rows optional) | | | |+ -- +========================+============+==========+==========++ -- | body row 1, column 1 | column 2 | column 3 | column 4 |+ -- +------------------------+------------+----------+----------++ -- | body row 2 | Cells may span columns. |+ -- +------------------------+------------+---------------------++ -- | body row 3 | Cells may | \[ |+ -- +------------------------+ span rows. | f(n) = \sum_{i=1} |+ -- | body row 4 | | \] |+ -- +------------------------+------------+---------------------+++.. _anchors:++Anchors+~~~~~~~++Sometimes it is useful to be able to link to a point in the+documentation which doesn't correspond to a particular entity. For that+purpose, we allow *anchors* to be included in a documentation comment.+The syntax is ``#label#``, where label is the name of the anchor. An+anchor is invisible in the generated documentation.++To link to an anchor from elsewhere, use the syntax ``"module#label"``+where module is the module name containing the anchor, and label is the+anchor label. The module does not have to be local, it can be imported+via an interface. Please note that in Haddock versions 2.13.x and+earlier, the syntax was ``"module\#label"``. It is considered deprecated+and will be removed in the future.++Headings+~~~~~~~~++Headings inside of comment documentation are possible by preceding them+with a number of ``=``\ s. From 1 to 6 are accepted. Extra ``=``\ s will+be treated as belonging to the text of the heading. Note that it's up to+the output format to decide how to render the different levels. ::++ -- |+ -- = Heading level 1 with some /emphasis/+ -- Something underneath the heading.+ --+ -- == /Subheading/+ -- More content.+ --+ -- === Subsubheading+ -- Even more content.++Note that while headings have to start on a new paragraph, we allow+paragraph-level content to follow these immediately. ::++ -- |+ -- = Heading level 1 with some __bold__+ -- Something underneath the heading.+ --+ -- == /Subheading/+ -- More content.+ --+ -- === Subsubheading+ -- >>> examples are only allowed at the start of paragraphs++As of 2.15.1, there's experimental (read: subject to change or get+removed) support for collapsible headers: simply wrap your existing+header title in underscores, as per bold syntax. The collapsible section+will stretch until the end of the comment or until a header of equal or+smaller number of ``=``\ s. ::++ -- |+ -- === __Examples:__+ -- >>> Some very long list of examples+ --+ -- ==== This still falls under the collapse+ -- Some specialised examples+ --+ -- === This is does not go into the collapsable section.+ -- More content.++Metadata+~~~~~~~~++Since Haddock 2.16.0, some support for embedding metadata in the+comments has started to appear. The use of such data aims to standardise+various community conventions in how such information is conveyed and to+provide uniform rendering.++Since+^^^^^++``@since`` annotation can be used to convey information about when the+function was introduced or when it has changed in a way significant to+the user. ``@since`` is a paragraph-level element. While multiple such+annotations are not an error, only the one to appear in the comment last+will be used. ``@since`` has to be followed with a version number, no+further description is currently allowed. The meaning of this feature is+subject to change in the future per user feedback. ::++ -- |+ -- Some comment+ --+ -- @since 1.2.3
@@ -0,0 +1,48 @@+Haddocks of multiple components+===============================++Haddock supports building documentation of multiple components. First, one+needs to build haddocks of all components which can be done with:++.. code-block:: none++ cabal haddock --haddock-html \+ --haddock-quickjump \+ --haddock-option="--use-index=../doc-index.html" \+ --haddock-option="--use-contents=../index.html" \+ --haddock-option="--base-url=.." \+ all++The new ``--base-url`` option will allow to access the static files from the+main directory (in this example its the relative ``./..`` directory). It will+also prevent ``haddock`` from copying its static files to each of the+documentation folders, we're only need a single copy of them where the+``--base-url`` option points to.++The second step requires to copy all the haddocks to a common directory, let's+say ``./docs``, this will depend on your project and it might look like:++.. code-block:: none++ cp -r dist-newstyle/build/x86_64-linux/ghc-9.0.1/package-a-0.1.0.0/doc/html/package-a/ docs+ cp -r dist-newstyle/build/x86_64-linux/ghc-9.0.1/package-b-0.1.0.0/doc/html/package-b/ docs++Note that you can also include documentation of other packages in this way,+e.g. ``base``, but you need to know where it is hidden on your hard-drive.++To build html and js (``quickjump``) indexes one can now invoke ``haddock`` with:++.. code-block:: none++ haddock \+ -o docs \+ --quickjump --gen-index --gen-contents \+ --read-interface=package-a,docs/package-a/package-a.haddock \+ --read-interface=package-b,docs/package-b/package-b.haddock++Note: the ``PATH`` in ``--read-interface=PATH,...`` must be a relative url of+a package it points to (relative to the ``docs`` directory).++There's an example project which shows how to do that posted `here+<https://github.com/coot/haddock-example>`_, which haddocks are served on+`github-pages <https://coot.github.io/haddock-example>`_.
@@ -0,0 +1,7 @@+module Main where++import Documentation.Haddock (haddock)+import GHC.ResponseFile (getArgsWithResponseFiles)++main :: IO ()+main = getArgsWithResponseFiles >>= haddock
@@ -1,2 +0,0 @@-module A where-data A = A
@@ -1,2 +0,0 @@-module B ( module A ) where-import A
@@ -1,6 +0,0 @@-module Bug1 where---- | We should have different anchors for constructors and types\/classes. This--- hyperlink should point to the type constructor by default: 'T'.-data T = T-
@@ -1,4 +0,0 @@-module Bug2 ( x ) where-import B-x :: A-x = A
@@ -1,6 +0,0 @@-module Bug3 where---- | /multi-line--- emphasis/-foo :: Int-
@@ -1,4 +0,0 @@-module Bug4 where--- | don't use apostrophe's in the wrong place's-foo :: Int-
@@ -1,23 +0,0 @@--- | Exporting records.-module Bug6( A(A), B(B), b, C(C,c1,c2), D(D,d1), E(E) ) where---- |--- This record is exported without its field-data A = A { a :: Int }---- |--- .. with its field, but the field is named separately in the export list--- (should still be visible as a field name)-data B = B { b :: Int }---- |--- .. with fields names as subordinate names in the export-data C = C { c1 :: Int, c2 :: Int }---- |--- .. with only some of the fields exported (we can't handle this one ---- how do we render the declaration?)-data D = D { d1 :: Int, d2 :: Int }---- | a newtype with a field-newtype E = E { e :: Int }
@@ -1,12 +0,0 @@--- | This module caused a duplicate instance in the documentation for the Foo--- type.-module Bug7 where---- | The Foo datatype-data Foo = Foo---- | The Bar class-class Bar x y---- | Just one instance-instance Bar Foo Foo
@@ -1,8 +0,0 @@-infix -->-infix --->--data Typ = Type (String,[Typ])- | TFree (String, [String])--x --> y = Type("fun",[s,t])-(--->) = flip $ foldr (-->)
@@ -1,6 +0,0 @@--- Haddock 0.6 didn't parse this module, because the qualified--- identifier C.safe was incorrectly lexed as 3 tokens.--module Check where-import qualified Foo as C-check = undefined { C.safe = 3 }
@@ -1,45 +0,0 @@-{- |- Implementation of fixed-size hash tables, with a type - class for constructing hash values for structured types.--}-module Hash (- -- * The @HashTable@ type- HashTable,-- -- ** Operations on @HashTable@s- new, insert, lookup,-- -- * The @Hash@ class- Hash(..),- ) where--import Array---- | A hash table with keys of type @key@ and values of type @val@.--- The type @key@ should be an instance of 'Eq'.-data HashTable key val = HashTable Int (Array Int [(key,val)])---- | Builds a new hash table with a given size-new :: (Eq key, Hash key) => Int -> IO (HashTable key val)---- | Inserts a new element into the hash table-insert :: (Eq key, Hash key) => key -> val -> IO ()---- | Looks up a key in the hash table, returns @'Just' val@ if the key--- was found, or 'Nothing' otherwise.-lookup :: Hash key => key -> IO (Maybe val)---- | A class of types which can be hashed.-class Hash a where- -- | hashes the value of type @a@ into an 'Int'- hash :: a -> Int--instance Hash Int where- hash = id--instance Hash Float where- hash = trunc--instance (Hash a, Hash b) => Hash (a,b) where- hash (a,b) = hash a `xor` hash b-
@@ -1,4 +0,0 @@--- #hide-module Hidden where-hidden :: Int -> Int-hidden a = a
@@ -1,11 +0,0 @@-TOP = ..-include $(TOP)/mk/boilerplate.mk--all :: index.html--index.html : $(HS_SRCS) $(HADDOCK_INPLACE)- $(HADDOCK_INPLACE) -h $(HS_SRCS)--CLEAN_FILES += index.html--include $(TOP)/mk/target.mk
@@ -1,4 +0,0 @@-module NoLayout where {- -- | the class 'C'- g :: Int;- }
@@ -1,410 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Test--- Copyright : (c) Simon Marlow 2002--- License : BSD-style--- --- Maintainer : libraries@haskell.org--- Stability : provisional--- Portability : portable------ This module illustrates & tests most of the features of Haddock.--- Testing references from the description: 'T', 'f', 'g', 'Visible.visible'.------------------------------------------------------------------------------------- This is plain comment, ignored by Haddock.--module Test ( -- -- Section headings are introduced with '-- *':- -- * Type declarations-- -- Subsection headings are introduced with '-- **' and so on.- -- ** Data types- T(..), T2, T3(..), T4(..), T5(..), T6(..),- N1(..), N2(..), N3(..), N4, N5(..), N6(..), N7(..),-- -- ** Records- R(..), R1(..),-- -- | test that we can export record selectors on their own:- p, q, u,-- -- * Class declarations- C(a,b), D(..), E, F(..),- - -- | Test that we can export a class method on its own:- a,-- -- * Function types- f, g,-- -- * Auxiliary stuff-- -- $aux1-- -- $aux2-- -- $aux3-- -- $aux4-- -- $aux5-- -- $aux6-- -- $aux7-- -- $aux8-- -- $aux9-- -- $aux10-- -- $aux11-- -- $aux12-- -- | This is some inline documentation in the export list- --- -- > a code block using bird-tracks- -- > each line must begin with > (which isn't significant unless it- -- > is at the beginning of the line).-- -- * A hidden module- module Hidden,-- -- * A visible module- module Visible,-- {-| nested-style doc comments -}-- -- * Existential \/ Universal types- Ex(..),-- -- * Type signatures with argument docs- k, l, m, o,-- -- * A section- -- and without an intervening comma:- -- ** A subsection --{-|- > a literal line-- $ a non /literal/ line $--}-- f'- ) where--import Hidden-import Visible-import Data.Maybe--bla = Nothing---- | This comment applies to the /following/ declaration--- and it continues until the next non-comment line-data T a b- = A Int (Maybe Float) -- ^ This comment describes the 'A' constructor- | -- | This comment describes the 'B' constructor- B (T a b, T Int Float) -- ^ ---- | An abstract data declaration-data T2 a b = T2 a b---- | A data declaration with no documentation annotations on the constructors-data T3 a b = A1 a | B1 b---- A data declaration with no documentation annotations at all-data T4 a b = A2 a | B2 b---- A data declaration documentation on the constructors only-data T5 a b- = A3 a -- ^ documents 'A3'- | B3 b -- ^ documents 'B3'---- | Testing alternative comment styles-data T6- -- | This is the doc for 'A4'- = A4- | B4- | -- ^ This is the doc for 'B4'-- -- | This is the doc for 'C4'- C4---- | A newtype-newtype N1 a = N1 a---- | A newtype with a fieldname-newtype N2 a b = N2 {n :: a b}---- | A newtype with a fieldname, documentation on the field-newtype N3 a b = N3 {n3 :: a b -- ^ this is the 'n3' field - }---- | An abstract newtype - we show this one as data rather than newtype because--- the difference isn\'t visible to the programmer for an abstract type.-newtype N4 a b = N4 a--newtype N5 a b = N5 {n5 :: a b -- ^ no docs on the datatype or the constructor- }--newtype N6 a b = N6 {n6 :: a b- }- -- ^ docs on the constructor only---- | docs on the newtype and the constructor-newtype N7 a b = N7 {n7 :: a b- }- -- ^ The 'N7' constructor- --class (D a) => C a where- -- |this is a description of the 'a' method- a :: IO a- b :: [a]- -- ^ this is a description of the 'b' method- c :: a -- c is hidden in the export list---- ^ This comment applies to the /previous/ declaration (the 'C' class)--class D a where- d :: T a b- e :: (a,a)--- ^ This is a class declaration with no separate docs for the methods--instance D Int where- d = undefined- e = undefined---- instance with a qualified class name-instance Test.D Float where- d = undefined- e = undefined--class E a where- ee :: a--- ^ This is a class declaration with no methods (or no methods exported)---- This is a class declaration with no documentation at all-class F a where- ff :: a---- | This is the documentation for the 'R' record, which has four fields,--- 'p', 'q', 'r', and 's'.-data R = - -- | This is the 'C1' record constructor, with the following fields:- C1 { p :: Int -- ^ This comment applies to the 'p' field- , q :: forall a . a->a -- ^ This comment applies to the 'q' field- , -- | This comment applies to both 'r' and 's'- r,s :: Int- }- | C2 { t :: T1 -> (T2 Int Int)-> (T3 Bool Bool) -> (T4 Float Float) -> T5 () (),- u,v :: Int- }- -- ^ This is the 'C2' record constructor, also with some fields:---- | Testing different record commenting styles-data R1 - -- | This is the 'C3' record constructor- = C3 { - -- | The 's1' record selector- s1 :: Int- -- | The 's2' record selector- , s2 :: Int- , s3 :: Int -- NOTE: In the original examples/Test.hs in Haddock, there is an extra "," here.- -- Since GHC doesn't allow that, I have removed it in this file. - -- ^ The 's3' record selector- }---- These section headers are only used when there is no export list to--- give the structure of the documentation:---- * This is a section header (level 1)--- ** This is a section header (level 2)--- *** This is a section header (level 3)--{-|-In a comment string we can refer to identifiers in scope with-single quotes like this: 'T', and we can refer to modules by-using double quotes: "Foo". We can add emphasis /like this/.-- * This is a bulleted list-- - This is the next item (different kind of bullet)-- (1) This is an ordered list- - 2. This is the next item (different kind of bullet)--@- This is a block of code, which can include other markup: 'R'- formatting- is- significant-@--> this is another block of code--We can also include URLs in documentation: <http://www.haskell.org/>.--}--f :: C a => a -> Int---- | we can export foreign declarations too-foreign import ccall g :: Int -> IO CInt---- | this doc string has a parse error in it: \'-h :: Int-h = 42----- $aux1 This is some documentation that is attached to a name ($aux1)--- rather than a source declaration. The documentation may be--- referred to in the export list using its name.------ @ code block in named doc @---- $aux2 This is some documentation that is attached to a name ($aux2)---- $aux3--- @ code block on its own in named doc @---- $aux4------ @ code block on its own in named doc (after newline) @--{- $aux5 a nested, named doc comment-- with a paragraph,-- @ and a code block @--}---- some tests for various arrangements of code blocks:--{- $aux6->test->test1--@ test2- test3-@--}--{- $aux7-@-test1-test2-@--}--{- $aux8->test3->test4--}--{- $aux9-@-test1-test2-@-->test3->test4--}--{- $aux10->test3->test4--@-test1-test2-@--}---- This one is currently wrong (Haddock 0.4). The @...@ part is--- interpreted as part of the bird-tracked code block.-{- $aux11-aux11:-->test3->test4--@-test1-test2-@--}---- $aux12--- > foo--- --- > bar--- ---- | A data-type using existential\/universal types-data Ex a - = forall b . C b => Ex1 b- | forall b . Ex2 b- | forall b . C a => Ex3 b -- NOTE: I have added "forall b" here make GHC accept this file - | Ex4 (forall a . a -> a)---- | This is a function with documentation for each argument-k :: T () () -- ^ This argument has type 'T'- -> (T2 Int Int) -- ^ This argument has type 'T2 Int Int'- -> (T3 Bool Bool -> T4 Float Float) -- ^ This argument has type @T3 Bool Bool -> T4 Float Float@- -> T5 () () -- ^ This argument has a very long description that should- -- hopefully cause some wrapping to happen when it is finally- -- rendered by Haddock in the generated HTML page.- -> IO () -- ^ This is the result type---- This function has arg docs but no docs for the function itself-l :: (Int, Int, Float) -- ^ takes a triple- -> Int -- ^ returns an 'Int'---- | This function has some arg docs -m :: R- -> N1 () -- ^ one of the arguments- -> IO Int -- ^ and the return value---- | This function has some arg docs but not a return value doc---- can't use the original name ('n') with GHC-newn :: R -- ^ one of the arguments, an 'R'- -> N1 () -- ^ one of the arguments- -> IO Int-newn = undefined ----- | A foreign import with argument docs-foreign import ccall unsafe - o :: Float -- ^ The input float- -> IO Float -- ^ The output float---- | We should be able to escape this: \#\#\#---- p :: Int --- can't use the above original definition with GHC-newp :: Int -newp = undefined---- | a function with a prime can be referred to as 'f'' --- but f' doesn't get link'd 'f\''-f' :: Int----- Add some definitions here so that this file can be compiled with GHC--data T1-f = undefined-f' = undefined-type CInt = Int -k = undefined-l = undefined-m = undefined
@@ -1,3 +0,0 @@-module Visible where-visible :: Int -> Int-visible a = a
@@ -1,2 +0,0 @@--- #hide-module A where { data T = MkT; f :: T; f = MkT }
@@ -1,5 +0,0 @@-module B(Test, vis) where --vis = id--data Test = Test
@@ -1,6 +0,0 @@-module C(C.bla) where --import D--bla :: Test-bla = undefined
@@ -1,7 +0,0 @@--- The link to the type T in the doc for this module should point to --- B.T, not A.T. Bug fixed in rev 1.59 of Main.hs.-module D(Test, hej) where --import B--hej = vis
@@ -0,0 +1,89 @@+-----------------------------------------------------------------------------+-- |+-- Module : Documentation.Haddock+-- Copyright : (c) David Waern 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskellorg+-- Stability : experimental+-- Portability : portable+--+-- The Haddock API: A rudimentary, highly experimental API exposing some of+-- the internals of Haddock. Don't expect it to be stable.+-----------------------------------------------------------------------------+module Documentation.Haddock (++ -- * Interface+ Interface(..),+ InstalledInterface(..),+ toInstalledIface,+ createInterfaces,+ processModules,++ -- * Export items & declarations+ ExportItem(..),+ DocForDecl,+ FnArgsDoc,++ -- * Cross-referencing+ LinkEnv,+ DocName(..),++ -- * Instances+ DocInstance,+ InstHead,++ -- * Documentation comments+ Doc,+ MDoc,+ DocH(..),+ Example(..),+ Hyperlink(..),+ DocMarkup,+ DocMarkupH(..),+ Documentation(..),+ ArgMap,+ AliasMap,+ WarningMap,+ DocMap,+ HaddockModInfo(..),+ markup,++ -- * Interface files+ InterfaceFile(..),+ readInterfaceFile,+ freshNameCache,++ -- * Flags and options+ Flag(..),+ DocOption(..),++ -- * Error handling+ HaddockException(..),++ -- * Program entry point+ haddock,+ haddockWithGhc,+ getGhcDirs,+ withGhc+) where++import Documentation.Haddock.Markup (markup)+import Haddock.InterfaceFile+import Haddock.Interface+import Haddock.Types+import Haddock.Options+import Haddock+++-- | Create 'Interface' structures from a given list of Haddock command-line+-- flags and file or module names (as accepted by 'haddock' executable). Flags+-- that control documentation generation or show help or version information+-- are ignored.+createInterfaces+ :: [Flag] -- ^ A list of command-line flags+ -> [String] -- ^ File or module names+ -> IO [Interface] -- ^ Resulting list of interfaces+createInterfaces flags modules = do+ (_, ifaces, _) <- withGhc flags (readPackagesAndProcessModules flags modules)+ return ifaces
@@ -0,0 +1,799 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TupleSections #-}+{-# OPTIONS_GHC -Wwarn #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2010,+-- Mateusz Kowalczyk 2014+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Haddock - A Haskell Documentation Tool+--+-- Program entry point and top-level code.+-----------------------------------------------------------------------------+module Haddock (+ haddock,+ haddockWithGhc,+ getGhcDirs,+ readPackagesAndProcessModules,+ withGhc+) where++import Haddock.Backends.Xhtml+import Haddock.Backends.Xhtml.Meta+import Haddock.Backends.Xhtml.Themes (getThemes)+import Haddock.Backends.LaTeX+import Haddock.Backends.Hoogle+import Haddock.Backends.Hyperlinker+import Haddock.Interface+import Haddock.Interface.Json+import Haddock.Parser+import Haddock.Types+import Haddock.Version+import Haddock.InterfaceFile+import Haddock.Options+import Haddock.Utils+import Haddock.GhcUtils (modifySessionDynFlags, setOutputDir)++import Control.DeepSeq (force)+import Control.Monad hiding (forM_)+import Control.Monad.IO.Class (MonadIO(..))+import Data.Bifunctor (second)+import Data.Foldable (forM_, foldl')+import Data.Traversable (for)+import Data.List (find, isPrefixOf, nub)+import Control.Exception+import Data.Maybe+import Data.IORef+import Data.Map.Strict (Map)+import Data.Version (makeVersion)+import qualified Data.Map.Strict as Map+import System.IO+import System.Exit+import System.FilePath++#ifdef IN_GHC_TREE+import System.Environment (getExecutablePath)+#else+import qualified GHC.Paths as GhcPaths+import Paths_haddock_api (getDataDir)+#endif+import System.Directory (doesDirectoryExist, getTemporaryDirectory)++import Text.ParserCombinators.ReadP (readP_to_S)+import GHC hiding (verbosity)+import GHC.Settings.Config+import GHC.Driver.Config.Logger (initLogFlags)+import GHC.Driver.Env+import GHC.Driver.Session hiding (projectVersion, verbosity)+import GHC.Utils.Error+import GHC.Utils.Logger+import GHC.Types.Name.Cache+import GHC.Unit+import GHC.Utils.Panic (handleGhcException)+import GHC.Data.FastString++--------------------------------------------------------------------------------+-- * Exception handling+--------------------------------------------------------------------------------+++handleTopExceptions :: IO a -> IO a+handleTopExceptions =+ handleNormalExceptions . handleHaddockExceptions . handleGhcExceptions+++-- | Either returns normally or throws an ExitCode exception;+-- all other exceptions are turned into exit exceptions.+handleNormalExceptions :: IO a -> IO a+handleNormalExceptions inner =+ (inner `onException` hFlush stdout)+ `catches`+ [ Handler (\(code :: ExitCode) -> exitWith code)++ , Handler (\(ex :: AsyncException) ->+ case ex of+ StackOverflow -> do+ putStrLn "stack overflow: use -g +RTS -K<size> to increase it"+ exitFailure+ _ -> do+ putStrLn ("haddock: " ++ show ex)+ exitFailure)++ , Handler (\(ex :: SomeException) -> do+ putStrLn ("haddock: internal error: " ++ show ex)+ exitFailure)+ ]+++handleHaddockExceptions :: IO a -> IO a+handleHaddockExceptions inner =+ catches inner [Handler handler]+ where+ handler (e::HaddockException) = do+ putStrLn $ "haddock: " ++ show e+ exitFailure+++handleGhcExceptions :: IO a -> IO a+handleGhcExceptions =+ -- error messages propagated as exceptions+ handleGhcException $ \e -> do+ hFlush stdout+ print (e :: GhcException)+ exitFailure+++-------------------------------------------------------------------------------+-- * Top level+-------------------------------------------------------------------------------+++-- | Run Haddock with given list of arguments.+--+-- Haddock's own main function is defined in terms of this:+--+-- > main = getArgs >>= haddock+haddock :: [String] -> IO ()+haddock args = haddockWithGhc withGhc args++haddockWithGhc :: (forall a. [Flag] -> Ghc a -> IO a) -> [String] -> IO ()+haddockWithGhc ghc args = handleTopExceptions $ do++ -- Parse command-line flags and handle some of them initially.+ -- TODO: unify all of this (and some of what's in the 'render' function),+ -- into one function that returns a record with a field for each option,+ -- or which exits with an error or help message.+ (flags, files) <- parseHaddockOpts args+ shortcutFlags flags+ qual <- rightOrThrowE (qualification flags)+ sinceQual <- rightOrThrowE (sinceQualification flags)++ -- Inject dynamic-too into ghc options if the ghc we are using was built with+ -- dynamic linking+ flags'' <- ghc flags $ do+ df <- getDynFlags+ case lookup "GHC Dynamic" (compilerInfo df) of+ Just "YES" -> return $ Flag_OptGhc "-dynamic-too" : flags+ _ -> return flags++ -- Inject `-j` into ghc options, if given to Haddock+ flags' <- pure $ case optParCount flags'' of+ Nothing -> flags''+ Just Nothing -> Flag_OptGhc "-j" : flags''+ Just (Just n) -> Flag_OptGhc ("-j" ++ show n) : flags''++ -- Whether or not to bypass the interface version check+ let noChecks = Flag_BypassInterfaceVersonCheck `elem` flags++ -- Create a temporary directory and redirect GHC output there (unless user+ -- requested otherwise).+ --+ -- Output dir needs to be set before calling 'depanal' since 'depanal' uses it+ -- to compute output file names that are stored in the 'DynFlags' of the+ -- resulting 'ModSummary's.+ let withDir | Flag_NoTmpCompDir `elem` flags = id+ | otherwise = withTempOutputDir++ -- Output warnings about potential misuse of some flags+ unless (Flag_NoWarnings `elem` flags) $ do+ hypSrcWarnings flags+ mapM_ (hPutStrLn stderr) (optGhcWarnings args)+ when noChecks $+ hPutStrLn stderr noCheckWarning++ ghc flags' $ withDir $ do+ dflags <- getDynFlags+ logger <- getLogger+ !unit_state <- hsc_units <$> getSession++ -- If any --show-interface was used, show the given interfaces+ forM_ (optShowInterfaceFile flags) $ \path -> liftIO $ do+ name_cache <- freshNameCache+ mIfaceFile <- readInterfaceFiles name_cache [(("", Nothing), Visible, path)] noChecks+ forM_ mIfaceFile $ \(_,_,_, ifaceFile) -> do+ putMsg logger $ renderJson (jsonInterfaceFile ifaceFile)++ -- If we were given source files to generate documentation from, do it+ if not (null files) then do+ (packages, ifaces, homeLinks) <- readPackagesAndProcessModules flags files+ let packageInfo = PackageInfo { piPackageName =+ fromMaybe (PackageName mempty) (optPackageName flags)+ , piPackageVersion =+ fromMaybe (makeVersion []) (optPackageVersion flags)+ }++ -- Dump an "interface file" (.haddock file), if requested.+ forM_ (optDumpInterfaceFile flags) $ \path -> liftIO $ do+ writeInterfaceFile path InterfaceFile {+ ifInstalledIfaces = map toInstalledIface ifaces+ , ifPackageInfo = packageInfo+ , ifLinkEnv = homeLinks+ }++ -- Render the interfaces.+ liftIO $ renderStep logger dflags unit_state flags sinceQual qual packages ifaces++ -- If we were not given any input files, error if documentation was+ -- requested+ else do+ when (any (`elem` [Flag_Html, Flag_Hoogle, Flag_LaTeX]) flags) $+ throwE "No input file(s)."++ -- Get packages supplied with --read-interface.+ name_cache <- liftIO $ freshNameCache+ packages <- liftIO $ readInterfaceFiles name_cache (readIfaceArgs flags) noChecks++ -- Render even though there are no input files (usually contents/index).+ liftIO $ renderStep logger dflags unit_state flags sinceQual qual packages []++-- | Run the GHC action using a temporary output directory+withTempOutputDir :: Ghc a -> Ghc a+withTempOutputDir action = do+ tmp <- liftIO getTemporaryDirectory+ x <- liftIO getProcessID+ let dir = tmp </> ".haddock-" ++ show x+ modifySessionDynFlags (setOutputDir dir)+ withTempDir dir action++-- | Create warnings about potential misuse of -optghc+optGhcWarnings :: [String] -> [String]+optGhcWarnings = map format . filter (isPrefixOf "-optghc")+ where+ format arg = concat ["Warning: `", arg, "' means `-o ", drop 2 arg, "', did you mean `-", arg, "'?"]++-- | Create a warning about bypassing the interface version check+noCheckWarning :: String+noCheckWarning = "Warning: `--bypass-interface-version-check' can cause " +++ "Haddock to crash when reading Haddock interface files."++withGhc :: [Flag] -> Ghc a -> IO a+withGhc flags action = do+ libDir <- fmap (fromMaybe (error "No GhcDir found") . snd) (getGhcDirs flags)++ -- Catches all GHC source errors, then prints and re-throws them.+ let handleSrcErrors action' = flip handleSourceError action' $ \err -> do+ printException err+ liftIO exitFailure+ needHieFiles = Flag_HyperlinkedSource `elem` flags++ withGhc' libDir needHieFiles (ghcFlags flags) (\_ -> handleSrcErrors action)+++readPackagesAndProcessModules :: [Flag] -> [String]+ -> Ghc ([(DocPaths, Visibility, FilePath, InterfaceFile)], [Interface], LinkEnv)+readPackagesAndProcessModules flags files = do+ -- Whether or not we bypass the interface file version check+ let noChecks = Flag_BypassInterfaceVersonCheck `elem` flags++ -- Read package dependency interface files supplied with --read-interface+ name_cache <- hsc_NC <$> getSession+ packages <- liftIO $ readInterfaceFiles name_cache (readIfaceArgs flags) noChecks++ -- Create the interfaces for the given modules -- this is the core part of Haddock+ let ifaceFiles = map (\(_, _, _, ifaceFile) -> ifaceFile) packages+ (ifaces, homeLinks) <- processModules (verbosity flags) files flags ifaceFiles++ return (packages, ifaces, homeLinks)+++renderStep :: Logger -> DynFlags -> UnitState -> [Flag] -> SinceQual -> QualOption+ -> [(DocPaths, Visibility, FilePath, InterfaceFile)] -> [Interface] -> IO ()+renderStep logger dflags unit_state flags sinceQual nameQual pkgs interfaces = do+ updateHTMLXRefs (map (\(docPath, _ifaceFilePath, _showModules, ifaceFile) ->+ ( case baseUrl flags of+ Nothing -> fst docPath+ Just url -> url </> packageName (ifUnitId ifaceFile)+ , ifaceFile)) pkgs)+ let+ installedIfaces =+ map+ (\(_, showModules, ifaceFilePath, ifaceFile)+ -> (ifaceFilePath, mkPackageInterfaces showModules ifaceFile))+ pkgs+ extSrcMap = Map.fromList $ do+ ((_, Just path), _, _, ifile) <- pkgs+ iface <- ifInstalledIfaces ifile+ return (instMod iface, path)+ render logger dflags unit_state flags sinceQual nameQual interfaces installedIfaces extSrcMap+ where+ -- get package name from unit-id+ packageName :: Unit -> String+ packageName unit =+ case lookupUnit unit_state unit of+ Nothing -> show unit+ Just pkg -> unitPackageNameString pkg++-- | Render the interfaces with whatever backend is specified in the flags.+render :: Logger -> DynFlags -> UnitState -> [Flag] -> SinceQual -> QualOption -> [Interface]+ -> [(FilePath, PackageInterfaces)] -> Map Module FilePath -> IO ()+render log' dflags unit_state flags sinceQual qual ifaces packages extSrcMap = do++ let+ packageInfo = PackageInfo { piPackageName = fromMaybe (PackageName mempty)+ $ optPackageName flags+ , piPackageVersion = fromMaybe (makeVersion [])+ $ optPackageVersion flags+ }++ title = fromMaybe "" (optTitle flags)+ unicode = Flag_UseUnicode `elem` flags+ pretty = Flag_PrettyHtml `elem` flags+ opt_wiki_urls = wikiUrls flags+ opt_base_url = baseUrl flags+ opt_contents_url = optContentsUrl flags+ opt_index_url = optIndexUrl flags+ odir = outputDir flags+ opt_latex_style = optLaTeXStyle flags+ opt_source_css = optSourceCssFile flags+ opt_mathjax = optMathjax flags+ dflags'+ | unicode = gopt_set dflags Opt_PrintUnicodeSyntax+ | otherwise = dflags+ logger = setLogFlags log' (initLogFlags dflags')++ visibleIfaces = [ i | i <- ifaces, OptHide `notElem` ifaceOptions i ]++ -- /All/ interfaces including external package modules, grouped by+ -- interface file (package).+ allPackages :: [PackageInterfaces]+ allPackages = [PackageInterfaces+ { piPackageInfo = packageInfo+ , piVisibility = Visible+ , piInstalledInterfaces = map toInstalledIface ifaces+ }]+ ++ map snd packages++ -- /All/ visible interfaces including external package modules, grouped by+ -- interface file (package).+ allVisiblePackages :: [PackageInterfaces]+ allVisiblePackages = [ pinfo { piInstalledInterfaces =+ filter (\i -> OptHide `notElem` instOptions i)+ piInstalledInterfaces+ }+ | pinfo@PackageInterfaces+ { piVisibility = Visible+ , piInstalledInterfaces+ } <- allPackages+ ]++ -- /All/ installed interfaces.+ allInstalledIfaces :: [InstalledInterface]+ allInstalledIfaces = concatMap (piInstalledInterfaces . snd) packages++ pkgMod = fmap ifaceMod (listToMaybe ifaces)+ pkgKey = fmap moduleUnit pkgMod+ pkgStr = fmap unitString pkgKey+ pkgNameVer = modulePackageInfo unit_state flags pkgMod+ pkgName = fmap (unpackFS . (\(PackageName n) -> n)) (fst pkgNameVer)+ sincePkg = case sinceQual of+ External -> pkgName+ Always -> Nothing++ (srcBase, srcModule, srcEntity, srcLEntity) = sourceUrls flags++ srcModule'+ | Flag_HyperlinkedSource `elem` flags = Just hypSrcModuleUrlFormat+ | otherwise = srcModule++ srcMap = Map.union+ (Map.map SrcExternal extSrcMap)+ (Map.fromList [ (ifaceMod iface, SrcLocal) | iface <- ifaces ])++ pkgSrcMap = Map.mapKeys moduleUnit extSrcMap+ pkgSrcMap'+ | Flag_HyperlinkedSource `elem` flags+ , Just k <- pkgKey+ = Map.insert k hypSrcModuleNameUrlFormat pkgSrcMap+ | Just srcNameUrl <- srcEntity+ , Just k <- pkgKey+ = Map.insert k srcNameUrl pkgSrcMap+ | otherwise = pkgSrcMap++ -- TODO: Get these from the interface files as with srcMap+ pkgSrcLMap'+ | Flag_HyperlinkedSource `elem` flags+ , Just k <- pkgKey+ = Map.singleton k hypSrcModuleLineUrlFormat+ | Just path <- srcLEntity+ , Just k <- pkgKey+ = Map.singleton k path+ | otherwise = Map.empty++ sourceUrls' = (srcBase, srcModule', pkgSrcMap', pkgSrcLMap')++ installedMap :: Map Module InstalledInterface+ installedMap = Map.fromList [ (unwire (instMod iface), iface) | iface <- allInstalledIfaces ]++ -- The user gives use base-4.9.0.0, but the InstalledInterface+ -- records the *wired in* identity base. So untranslate it+ -- so that we can service the request.+ unwire :: Module -> Module+ unwire m = m { moduleUnit = unwireUnit unit_state (moduleUnit m) }++ reexportedIfaces <- concat `fmap` (for (reexportFlags flags) $ \mod_str -> do+ let warn' = hPutStrLn stderr . ("Warning: " ++)+ case readP_to_S parseHoleyModule mod_str of+ [(m, "")]+ | Just iface <- Map.lookup m installedMap+ -> return [iface]+ | otherwise+ -> warn' ("Cannot find reexported module '" ++ mod_str ++ "'") >> return []+ _ -> warn' ("Cannot parse reexported module flag '" ++ mod_str ++ "'") >> return [])++ libDir <- getHaddockLibDir flags+ !prologue <- force <$> getPrologue dflags' flags+ themes <- getThemes libDir flags >>= either bye return++ let withQuickjump = Flag_QuickJumpIndex `elem` flags+ withBaseURL = isJust+ . find (\flag -> case flag of+ Flag_BaseURL base_url ->+ base_url /= "." && base_url /= "./"+ _ -> False+ )+ $ flags++ when (Flag_GenIndex `elem` flags) $ do+ withTiming logger "ppHtmlIndex" (const ()) $ do+ _ <- {-# SCC ppHtmlIndex #-}+ ppHtmlIndex odir title pkgStr+ themes opt_mathjax opt_contents_url sourceUrls' opt_wiki_urls+ withQuickjump+ (concatMap piInstalledInterfaces allVisiblePackages) pretty+ return ()++ unless withBaseURL $+ copyHtmlBits odir libDir themes withQuickjump++ when (Flag_GenContents `elem` flags) $ do+ withTiming logger "ppHtmlContents" (const ()) $ do+ _ <- {-# SCC ppHtmlContents #-}+ ppHtmlContents unit_state odir title pkgStr+ themes opt_mathjax opt_index_url sourceUrls' opt_wiki_urls+ withQuickjump+ allVisiblePackages True prologue pretty+ sincePkg (makeContentsQual qual)+ return ()+ copyHtmlBits odir libDir themes withQuickjump++ when withQuickjump $ void $+ ppJsonIndex odir sourceUrls' opt_wiki_urls+ unicode Nothing qual+ ifaces+ ( nub+ . map fst+ . filter ((== Visible) . piVisibility . snd)+ $ packages)++ when (Flag_Html `elem` flags) $ do+ withTiming logger "ppHtml" (const ()) $ do+ _ <- {-# SCC ppHtml #-}+ ppHtml unit_state title pkgStr visibleIfaces reexportedIfaces odir+ prologue+ themes opt_mathjax sourceUrls' opt_wiki_urls opt_base_url+ opt_contents_url opt_index_url unicode sincePkg packageInfo+ qual pretty withQuickjump+ return ()+ unless withBaseURL $ do+ copyHtmlBits odir libDir themes withQuickjump+ writeHaddockMeta odir withQuickjump++ -- TODO: we throw away Meta for both Hoogle and LaTeX right now,+ -- might want to fix that if/when these two get some work on them+ when (Flag_Hoogle `elem` flags) $ do+ case pkgNameVer of+ (Just (PackageName pkgNameFS), mpkgVer) ->+ let+ pkgNameStr | unpackFS pkgNameFS == "main" && title /= [] = title+ | otherwise = unpackFS pkgNameFS++ pkgVer =+ fromMaybe (makeVersion []) mpkgVer+ in ppHoogle dflags' pkgNameStr pkgVer title (fmap _doc prologue)+ visibleIfaces odir+ _ -> putStrLn . unlines $+ [ "haddock: Unable to find a package providing module "+ ++ maybe "<no-mod>" (moduleNameString . moduleName) pkgMod+ ++ ", skipping Hoogle."+ , ""+ , " Perhaps try specifying the desired package explicitly"+ ++ " using the --package-name"+ , " and --package-version arguments."+ ]++ when (Flag_LaTeX `elem` flags) $ do+ withTiming logger "ppLatex" (const ()) $ do+ _ <- {-# SCC ppLatex #-}+ ppLaTeX title pkgStr visibleIfaces odir (fmap _doc prologue) opt_latex_style+ libDir+ return ()++ when (Flag_HyperlinkedSource `elem` flags && not (null ifaces)) $ do+ withTiming logger "ppHyperlinkedSource" (const ()) $ do+ _ <- {-# SCC ppHyperlinkedSource #-}+ ppHyperlinkedSource (verbosity flags) odir libDir opt_source_css pretty srcMap ifaces+ return ()+++-------------------------------------------------------------------------------+-- * Reading and dumping interface files+-------------------------------------------------------------------------------+++readInterfaceFiles :: NameCache+ -> [(DocPaths, Visibility, FilePath)]+ -> Bool+ -> IO [(DocPaths, Visibility, FilePath, InterfaceFile)]+readInterfaceFiles name_cache_accessor pairs bypass_version_check = do+ catMaybes `liftM` mapM ({-# SCC readInterfaceFile #-} tryReadIface) pairs+ where+ -- try to read an interface, warn if we can't+ tryReadIface (paths, vis, file) =+ readInterfaceFile name_cache_accessor file bypass_version_check >>= \case+ Left err -> do+ putStrLn ("Warning: Cannot read " ++ file ++ ":")+ putStrLn (" " ++ err)+ putStrLn "Skipping this interface."+ return Nothing+ Right f -> return (Just (paths, vis, file, f))+++-------------------------------------------------------------------------------+-- * Creating a GHC session+-------------------------------------------------------------------------------+++-- | Start a GHC session with the -haddock flag set. Also turn off+-- compilation and linking. Then run the given 'Ghc' action.+withGhc' :: String -> Bool -> [String] -> (DynFlags -> Ghc a) -> IO a+withGhc' libDir needHieFiles flags ghcActs = runGhc (Just libDir) $ do+ logger <- getLogger+ dynflags' <- parseGhcFlags logger =<< getSessionDynFlags++ -- We disable pattern match warnings because than can be very+ -- expensive to check+ let dynflags'' = unsetPatternMatchWarnings $ updOptLevel 0 dynflags'++ -- ignore the following return-value, which is a list of packages+ -- that may need to be re-linked: Haddock doesn't do any+ -- dynamic or static linking at all!+ _ <- setSessionDynFlags dynflags''+ ghcActs dynflags''+ where+ -- ignore sublists of flags that start with "+RTS" and end in "-RTS"+ --+ -- See https://github.com/haskell/haddock/issues/666+ filterRtsFlags :: [String] -> [String]+ filterRtsFlags flgs = foldr go (const []) flgs True+ where go "-RTS" func _ = func True+ go "+RTS" func _ = func False+ go _ func False = func False+ go arg func True = arg : func True++ parseGhcFlags :: MonadIO m => Logger -> DynFlags -> m DynFlags+ parseGhcFlags logger dynflags = do+ -- TODO: handle warnings?++ let extra_opts | needHieFiles = [Opt_WriteHie, Opt_Haddock]+ | otherwise = [Opt_Haddock]+ dynflags' = (foldl' gopt_set dynflags extra_opts)+ { backend = noBackend+ , ghcMode = CompManager+ , ghcLink = NoLink+ }+ flags' = filterRtsFlags flags++ (dynflags'', rest, _) <- parseDynamicFlags logger dynflags' (map noLoc flags')+ if not (null rest)+ then throwE ("Couldn't parse GHC options: " ++ unwords flags')+ else return dynflags''++unsetPatternMatchWarnings :: DynFlags -> DynFlags+unsetPatternMatchWarnings dflags =+ foldl' wopt_unset dflags pattern_match_warnings+ where+ pattern_match_warnings =+ [ Opt_WarnIncompletePatterns+ , Opt_WarnIncompleteUniPatterns+ , Opt_WarnIncompletePatternsRecUpd+ , Opt_WarnOverlappingPatterns+ ]++-------------------------------------------------------------------------------+-- * Misc+-------------------------------------------------------------------------------+++getHaddockLibDir :: [Flag] -> IO FilePath+getHaddockLibDir flags =+ case [str | Flag_Lib str <- flags] of+ [] -> do+#ifdef IN_GHC_TREE++ -- When in the GHC tree, we should be able to locate the "lib" folder+ -- based on the location of the current executable.+ base_dir <- getBaseDir -- Provided by GHC+ let res_dirs = [ d | Just d <- [base_dir] ] ++++#else++ -- When Haddock was installed by @cabal@, the resources (which are listed+ -- under @data-files@ in the Cabal file) will have been copied to a+ -- special directory.+ data_dir <- getDataDir -- Provided by Cabal+ let res_dirs = [ data_dir ] ++++#endif++ -- When Haddock is built locally (eg. regular @cabal new-build@), the data+ -- directory does not exist and we are probably invoking from either+ -- @./haddock-api@ or @./@+ [ "resources"+ , "haddock-api/resources"+ ]++ res_dir <- check res_dirs+ case res_dir of+ Just p -> return p+ _ -> die "Haddock's resource directory does not exist!\n"++ fs -> return (last fs)+ where+ -- Pick the first path that corresponds to a directory that exists+ check :: [FilePath] -> IO (Maybe FilePath)+ check [] = pure Nothing+ check (path : other_paths) = do+ exists <- doesDirectoryExist path+ if exists then pure (Just path) else check other_paths++-- | Find the @lib@ directory for GHC and the path to @ghc@+getGhcDirs :: [Flag] -> IO (Maybe FilePath, Maybe FilePath)+getGhcDirs flags = do++#ifdef IN_GHC_TREE+ base_dir <- getBaseDir+ let ghc_path = Nothing+#else+ let base_dir = Just GhcPaths.libdir+ ghc_path = Just GhcPaths.ghc+#endif++ -- If the user explicitly specifies a lib dir, use that+ let ghc_dir = case [ dir | Flag_GhcLibDir dir <- flags ] of+ [] -> base_dir+ xs -> Just (last xs)++ pure (ghc_path, ghc_dir)+++#ifdef IN_GHC_TREE++-- | See 'getBaseDir' in "SysTools.BaseDir"+getBaseDir :: IO (Maybe FilePath)+getBaseDir = do++ -- Getting executable path can fail. Turn that into 'Nothing'+ exec_path_opt <- catch (Just <$> getExecutablePath)+ (\(_ :: SomeException) -> pure Nothing)++ -- Check that the path we are about to return actually exists+ case exec_path_opt of+ Nothing -> pure Nothing+ Just exec_path -> do+ let base_dir = takeDirectory (takeDirectory exec_path) </> "lib"+ exists <- doesDirectoryExist base_dir+ pure (if exists then Just base_dir else Nothing)++#endif++shortcutFlags :: [Flag] -> IO ()+shortcutFlags flags = do+ usage <- getUsage++ when (Flag_Help `elem` flags) (bye usage)+ when (Flag_Version `elem` flags) byeVersion+ when (Flag_InterfaceVersion `elem` flags) (bye (show binaryInterfaceVersion ++ "\n"))+ when (Flag_CompatibleInterfaceVersions `elem` flags)+ (bye (unwords (map show binaryInterfaceVersionCompatibility) ++ "\n"))+ when (Flag_GhcVersion `elem` flags) (bye (cProjectVersion ++ "\n"))++ when (Flag_PrintGhcPath `elem` flags) $ do+ path <- fmap fst (getGhcDirs flags)+ bye $ fromMaybe "not available" path ++ "\n"++ when (Flag_PrintGhcLibDir `elem` flags) $ do+ dir <- fmap snd (getGhcDirs flags)+ bye $ fromMaybe "not available" dir ++ "\n"++ when (Flag_UseUnicode `elem` flags && Flag_Html `notElem` flags) $+ throwE "Unicode can only be enabled for HTML output."++ when ((Flag_GenIndex `elem` flags || Flag_GenContents `elem` flags)+ && Flag_Html `elem` flags) $+ throwE "-h/--html cannot be used with --gen-index or --gen-contents"++ when ((Flag_GenIndex `elem` flags || Flag_GenContents `elem` flags)+ && Flag_Hoogle `elem` flags) $+ throwE "--hoogle cannot be used with --gen-index or --gen-contents"++ when ((Flag_GenIndex `elem` flags || Flag_GenContents `elem` flags)+ && Flag_LaTeX `elem` flags) $+ throwE "--latex cannot be used with --gen-index or --gen-contents"+ where+ byeVersion = bye $+ "Haddock version " ++ projectVersion ++ ", (c) Simon Marlow 2006\n"+ ++ "Ported to use the GHC API by David Waern 2006-2008\n"+++-- | Generate some warnings about potential misuse of @--hyperlinked-source@.+hypSrcWarnings :: [Flag] -> IO ()+hypSrcWarnings flags = do+ when (hypSrc && any isSourceUrlFlag flags) $+ hPutStrLn stderr $ concat+ [ "Warning: "+ , "--source-* options are ignored when "+ , "--hyperlinked-source is enabled."+ ]+ when (not hypSrc && any isSourceCssFlag flags) $+ hPutStrLn stderr $ concat+ [ "Warning: "+ , "source CSS file is specified but "+ , "--hyperlinked-source is disabled."+ ]+ where+ hypSrc :: Bool+ hypSrc = Flag_HyperlinkedSource `elem` flags++ isSourceUrlFlag :: Flag -> Bool+ isSourceUrlFlag (Flag_SourceBaseURL _) = True+ isSourceUrlFlag (Flag_SourceModuleURL _) = True+ isSourceUrlFlag (Flag_SourceEntityURL _) = True+ isSourceUrlFlag (Flag_SourceLEntityURL _) = True+ isSourceUrlFlag _ = False++ isSourceCssFlag :: Flag -> Bool+ isSourceCssFlag (Flag_SourceCss _) = True+ isSourceCssFlag _ = False+++updateHTMLXRefs :: [(FilePath, InterfaceFile)] -> IO ()+updateHTMLXRefs packages = do+ let !modMap = force $ Map.fromList mapping+ !modNameMap = force $ Map.fromList mapping'+ writeIORef html_xrefs_ref modMap+ writeIORef html_xrefs_ref' modNameMap+ where+ mapping = [ (instMod iface, html) | (html, ifaces) <- packages+ , iface <- ifInstalledIfaces ifaces ]+ mapping' = [ (moduleName m, html) | (m, html) <- mapping ]+++getPrologue :: DynFlags -> [Flag] -> IO (Maybe (MDoc RdrName))+getPrologue dflags flags =+ case [filename | Flag_Prologue filename <- flags ] of+ [] -> return Nothing+ [filename] -> do+ h <- openFile filename ReadMode+ hSetEncoding h utf8+ str <- hGetContents h -- semi-closes the handle+ return . Just $! second (fmap rdrName) $ parseParas dflags Nothing str+ _ -> throwE "multiple -p/--prologue options"+++rightOrThrowE :: Either String b -> IO b+rightOrThrowE (Left msg) = throwE msg+rightOrThrowE (Right x) = pure x+
@@ -0,0 +1,175 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.HaddockDB+-- Copyright : (c) Simon Marlow 2003+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.HaddockDB (ppDocBook) where++{-+import HaddockTypes+import HaddockUtil+import HsSyn2++import Text.PrettyPrint+-}++-----------------------------------------------------------------------------+-- Printing the results in DocBook format++ppDocBook :: a+ppDocBook = error "not working"+{-+ppDocBook :: FilePath -> [(Module, Interface)] -> String+ppDocBook odir mods = render (ppIfaces mods)++ppIfaces mods+ = text "<!DOCTYPE BOOK PUBLIC \"-//OASIS//DTD DocBook V3.1//EN\" ["+ $$ text "]>"+ $$ text "<book>"+ $$ text "<bookinfo>"+ $$ text "<author><othername>HaskellDoc version 0.0</othername></author>"+ $$ text "</bookinfo>"+ $$ text "<article>"+ $$ vcat (map do_mod mods)+ $$ text "</article></book>"+ where+ do_mod (Module mod, iface)+ = text "<sect1 id=\"sec-" <> text mod <> text "\">"+ $$ text "<title><literal>"+ <> text mod+ <> text "</literal></title>"+ $$ text "<indexterm><primary><literal>"+ <> text mod+ <> text "</literal></primary></indexterm>"+ $$ text "<variablelist>"+ $$ vcat (map (do_export mod) (eltsFM (iface_decls iface)))+ $$ text "</variablelist>"+ $$ text "</sect1>"++ do_export mod decl | (nm:_) <- declBinders decl+ = text "<varlistentry id=" <> ppLinkId mod nm <> char '>'+ $$ text "<term><literal>"+ <> do_decl decl+ <> text "</literal></term>"+ $$ text "<listitem>"+ $$ text "<para>"+ $$ text "</para>"+ $$ text "</listitem>"+ $$ text "</varlistentry>"+ do_export _ _ = empty++ do_decl (HsTypeSig _ [nm] ty _)+ = ppHsName nm <> text " :: " <> ppHsType ty+ do_decl (HsTypeDecl _ nm args ty _)+ = hsep ([text "type", ppHsName nm ]+ ++ map ppHsName args+ ++ [equals, ppHsType ty])+ do_decl (HsNewTypeDecl loc ctx nm args con drv _)+ = hsep ([text "data", ppHsName nm] -- data, not newtype+ ++ map ppHsName args+ ) <+> equals <+> ppHsConstr con -- ToDo: derivings+ do_decl (HsDataDecl loc ctx nm args cons drv _)+ = hsep ([text "data", {-ToDo: context-}ppHsName nm]+ ++ map ppHsName args)+ <+> vcat (zipWith (<+>) (equals : repeat (char '|'))+ (map ppHsConstr cons))+ do_decl (HsClassDecl loc ty fds decl _)+ = hsep [text "class", ppHsType ty]+ do_decl decl+ = empty++ppHsConstr :: HsConDecl -> Doc+ppHsConstr (HsRecDecl pos name tvs ctxt fieldList maybe_doc) =+ ppHsName name+ <> (braces . hsep . punctuate comma . map ppField $ fieldList)+ppHsConstr (HsConDecl pos name tvs ctxt typeList maybe_doc) =+ hsep (ppHsName name : map ppHsBangType typeList)++ppField (HsFieldDecl ns ty doc)+ = hsep (punctuate comma (map ppHsName ns) +++ [text "::", ppHsBangType ty])++ppHsBangType :: HsBangType -> Doc+ppHsBangType (HsBangedTy ty) = char '!' <> ppHsType ty+ppHsBangType (HsUnBangedTy ty) = ppHsType ty++ppHsContext :: HsContext -> Doc+ppHsContext [] = empty+ppHsContext context = parenList (map (\ (a,b) -> ppHsQName a <+>+ hsep (map ppHsAType b)) context)++ppHsType :: HsType -> Doc+ppHsType (HsForAllType _ Nothing context htype) =+ hsep [ ppHsContext context, text "=>", ppHsType htype]+ppHsType (HsForAllType fvf (Just tvs) [] htype) =+ hsep (text "forall" : map ppHsName tvs ++ pprHsForAllSeparator fvf :+ [ppHsType htype])+ppHsType (HsForAllType fvf (Just tvs) context htype) =+ hsep (text "forall" : map ppHsName tvs ++ pprHsForAllSeparator fvf :+ ppHsContext context : text "=>" : [ppHsType htype])+ppHsType (HsTyFun a b) = fsep [ppHsBType a, text "->", ppHsType b]+ppHsType (HsTyIP n t) = fsep [(char '?' <> ppHsName n), text "::", ppHsType t]+ppHsType t = ppHsBType t++ppHsForAllSeparator :: ForallVisFlag -> Doc+ppHsForAllSeparator ForallVis = text "->"+ppHsForAllSeparator ForallInvis = text "."++ppHsBType (HsTyApp (HsTyCon (Qual (Module "Prelude") (HsTyClsName (HsSpecial "[]")))) b )+ = brackets $ ppHsType b+ppHsBType (HsTyApp a b) = fsep [ppHsBType a, ppHsAType b]+ppHsBType t = ppHsAType t++ppHsAType :: HsType -> Doc+ppHsAType (HsTyTuple True l) = parenList . map ppHsType $ l+ppHsAType (HsTyTuple False l) = ubxParenList . map ppHsType $ l+-- special case+ppHsAType (HsTyApp (HsTyCon (Qual (Module "Prelude") (HsTyClsName (HsSpecial "[]")))) b )+ = brackets $ ppHsType b+ppHsAType (HsTyVar name) = ppHsName name+ppHsAType (HsTyCon name) = ppHsQName name+ppHsAType t = parens $ ppHsType t++ppHsQName :: HsQName -> Doc+ppHsQName (UnQual str) = ppHsName str+ppHsQName n@(Qual (Module mod) str)+ | n == unit_con_name = ppHsName str+ | isSpecial str = ppHsName str+ | otherwise+ = text "<link linkend=" <> ppLinkId mod str <> char '>'+ <> ppHsName str+ <> text "</link>"++isSpecial (HsTyClsName id) | HsSpecial _ <- id = True+isSpecial (HsVarName id) | HsSpecial _ <- id = True+isSpecial _ = False++ppHsName :: HsName -> Doc+ppHsName (HsTyClsName id) = ppHsIdentifier id+ppHsName (HsVarName id) = ppHsIdentifier id++ppHsIdentifier :: HsIdentifier -> Doc+ppHsIdentifier (HsIdent str) = text str+ppHsIdentifier (HsSymbol str) = text str+ppHsIdentifier (HsSpecial str) = text str++ppLinkId :: String -> HsName -> Doc+ppLinkId mod str+ = hcat [char '\"', text mod, char '.', ppHsName str, char '\"']++-- -----------------------------------------------------------------------------+-- * Misc++parenList :: [Doc] -> Doc+parenList = parens . fsep . punctuate comma++ubxParenList :: [Doc] -> Doc+ubxParenList = ubxparens . fsep . punctuate comma++ubxparens p = text "(#" <> p <> text "#)"+-}
@@ -0,0 +1,428 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeFamilies #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Hoogle+-- Copyright : (c) Neil Mitchell 2006-2008+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Write out Hoogle compatible documentation+-- http://www.haskell.org/hoogle/+-----------------------------------------------------------------------------+module Haddock.Backends.Hoogle (+ -- * Main entry point to Hoogle output generation+ ppHoogle++ -- * Utilities for generating Hoogle output during interface creation+ , ppExportD+ , outWith+ ) where++import Documentation.Haddock.Markup+import Haddock.GhcUtils+import Haddock.Types hiding (Version)+import Haddock.Utils hiding (out)++import GHC+import GHC.Driver.Ppr+import GHC.Plugins (TopLevelFlag(..))+import GHC.Utils.Outputable as Outputable+import GHC.Utils.Panic+import GHC.Unit.State++import Data.Char+import Data.Foldable (toList)+import Data.List (intercalate, isPrefixOf)+import Data.Maybe+import Data.Version++import System.Directory+import System.FilePath++prefix :: [String]+prefix = ["-- Hoogle documentation, generated by Haddock"+ ,"-- See Hoogle, http://www.haskell.org/hoogle/"+ ,""]+++ppHoogle :: DynFlags -> String -> Version -> String -> Maybe (Doc RdrName) -> [Interface] -> FilePath -> IO ()+ppHoogle dflags package version synopsis prologue ifaces odir = do+ let -- Since Hoogle is line based, we want to avoid breaking long lines.+ dflags' = dflags{ pprCols = maxBound }+ filename = package ++ ".txt"+ contents = prefix +++ docWith dflags' (drop 2 $ dropWhile (/= ':') synopsis) prologue +++ ["@package " ++ package] +++ ["@version " ++ showVersion version+ | not (null (versionBranch version))+ ] +++ concat [ppModule dflags' i | i <- ifaces, OptHide `notElem` ifaceOptions i]+ createDirectoryIfMissing True odir+ writeUtf8File (odir </> filename) (unlines contents)++ppModule :: DynFlags -> Interface -> [String]+ppModule dflags iface =+ "" : ppDocumentation dflags (ifaceDoc iface) +++ ["module " ++ moduleString (ifaceMod iface)] +++ concatMap ppExportItem (ifaceRnExportItems $ iface) +++ map (fromMaybe "" . haddockClsInstPprHoogle) (ifaceInstances iface)++-- | If the export item is an 'ExportDecl', get the attached Hoogle textual+-- database entries for that export declaration.+ppExportItem :: ExportItem DocNameI -> [String]+ppExportItem (ExportDecl RnExportD { rnExpDHoogle = o }) = o+ppExportItem _ = []++---------------------------------------------------------------------+-- Utility functions++dropHsDocTy :: HsSigType GhcRn -> HsSigType GhcRn+dropHsDocTy = drop_sig_ty+ where+ drop_sig_ty (HsSig x a b) = HsSig x a (drop_lty b)+ drop_sig_ty x@XHsSigType{} = x++ drop_lty (L src x) = L src (drop_ty x)++ drop_ty (HsForAllTy x a e) = HsForAllTy x a (drop_lty e)+ drop_ty (HsQualTy x a e) = HsQualTy x a (drop_lty e)+ drop_ty (HsBangTy x a b) = HsBangTy x a (drop_lty b)+ drop_ty (HsAppTy x a b) = HsAppTy x (drop_lty a) (drop_lty b)+ drop_ty (HsAppKindTy x a b) = HsAppKindTy x (drop_lty a) (drop_lty b)+ drop_ty (HsFunTy x w a b) = HsFunTy x w (drop_lty a) (drop_lty b)+ drop_ty (HsListTy x a) = HsListTy x (drop_lty a)+ drop_ty (HsTupleTy x a b) = HsTupleTy x a (map drop_lty b)+ drop_ty (HsOpTy x p a b c) = HsOpTy x p (drop_lty a) b (drop_lty c)+ drop_ty (HsParTy x a) = HsParTy x (drop_lty a)+ drop_ty (HsKindSig x a b) = HsKindSig x (drop_lty a) b+ drop_ty (HsDocTy _ a _) = drop_ty $ unL a+ drop_ty x = x++outHsSigType :: DynFlags -> HsSigType GhcRn -> String+outHsSigType dflags = out dflags . reparenSigType . dropHsDocTy++outWith :: Outputable a => (SDoc -> String) -> a -> [Char]+outWith p = f . unwords . map (dropWhile isSpace) . lines . p . ppr+ where+ f xs | " <document comment>" `isPrefixOf` xs = f $ drop 19 xs+ f (x:xs) = x : f xs+ f [] = []++out :: Outputable a => DynFlags -> a -> String+out dflags = outWith $ showSDoc dflags++operator :: String -> String+operator (x:xs) | not (isAlphaNum x) && x `notElem` "_' ([{" = '(' : x:xs ++ ")"+operator x = x++commaSeparate :: Outputable a => DynFlags -> [a] -> String+commaSeparate dflags = showSDoc dflags . interpp'SP++---------------------------------------------------------------------+-- How to print each export++ppExportD :: DynFlags -> ExportD GhcRn -> [String]+ppExportD dflags+ ExportD+ { expDDecl = L _ decl+ , expDPats = bundledPats+ , expDMbDoc = mbDoc+ , expDSubDocs = subdocs+ , expDFixities = fixities+ }+ = let+ -- Since Hoogle is line based, we want to avoid breaking long lines.+ dflags' = dflags{ pprCols = maxBound }+ in+ concat+ [ ppDocumentation dflags' dc ++ f d+ | (d, (dc, _)) <- (decl, mbDoc) : bundledPats+ ] ++ ppFixities+ where+ f :: HsDecl GhcRn -> [String]+ f (TyClD _ d@DataDecl{}) = ppData dflags d subdocs+ f (TyClD _ d@SynDecl{}) = ppSynonym dflags d+ f (TyClD _ d@ClassDecl{}) = ppClass dflags d subdocs+ f (TyClD _ (FamDecl _ d)) = ppFam dflags d+ f (ForD _ (ForeignImport _ name typ _)) = [pp_sig dflags [name] typ]+ f (ForD _ (ForeignExport _ name typ _)) = [pp_sig dflags [name] typ]+ f (SigD _ sig) = ppSig dflags sig+ f _ = []++ ppFixities :: [String]+ ppFixities = concatMap (ppFixity dflags) fixities+++ppSigWithDoc :: DynFlags -> Sig GhcRn -> [(Name, DocForDecl Name)] -> [String]+ppSigWithDoc dflags sig subdocs = case sig of+ TypeSig _ names t -> concatMap (mkDocSig "" (dropWildCards t)) names+ PatSynSig _ names t -> concatMap (mkDocSig "pattern " t) names+ _ -> []+ where+ mkDocSig leader typ n = mkSubdocN dflags n subdocs+ [leader ++ pp_sig dflags [n] typ]++ppSig :: DynFlags -> Sig GhcRn -> [String]+ppSig dflags x = ppSigWithDoc dflags x []++pp_sig :: DynFlags -> [LocatedN Name] -> LHsSigType GhcRn -> String+pp_sig dflags names (L _ typ) =+ operator prettyNames ++ " :: " ++ outHsSigType dflags typ+ where+ prettyNames = intercalate ", " $ map (out dflags) names++-- note: does not yet output documentation for class methods+ppClass :: DynFlags -> TyClDecl GhcRn -> [(Name, DocForDecl Name)] -> [String]+ppClass dflags decl@(ClassDecl {}) subdocs =+ (out dflags decl{tcdSigs=[], tcdATs=[], tcdATDefs=[], tcdMeths=emptyLHsBinds}+ ++ ppTyFams) : ppMethods+ where++ ppMethods = concat . map (ppSig' . unLoc . add_ctxt) $ tcdSigs decl+ ppSig' = flip (ppSigWithDoc dflags) subdocs++ add_ctxt = addClassContext (tcdName decl) (tyClDeclTyVars decl)++ ppTyFams+ | null $ tcdATs decl = ""+ | otherwise = (" " ++) . showSDoc dflags . whereWrapper $ concat+ [ map pprTyFam (tcdATs decl)+ , map (pprTyFamInstDecl NotTopLevel . unLoc) (tcdATDefs decl)+ ]++ pprTyFam :: LFamilyDecl GhcRn -> SDoc+ pprTyFam (L _ at) = vcat' $ map text $+ mkSubdocN dflags (fdLName at) subdocs (ppFam dflags at)++ whereWrapper elems = vcat'+ [ text "where" <+> lbrace+ , nest 4 . vcat . map (Outputable.<> semi) $ elems+ , rbrace+ ]+ppClass _ _non_cls_decl _ = []+ppFam :: DynFlags -> FamilyDecl GhcRn -> [String]+ppFam dflags decl@(FamilyDecl { fdInfo = info })+ = [out dflags decl']+ where+ decl' = case info of+ -- We don't need to print out a closed type family's equations+ -- for Hoogle, so pretend it doesn't have any.+ ClosedTypeFamily{} -> decl { fdInfo = OpenTypeFamily }+ _ -> decl++ppSynonym :: DynFlags -> TyClDecl GhcRn -> [String]+ppSynonym dflags x = [out dflags x]++ppData :: DynFlags -> TyClDecl GhcRn -> [(Name, DocForDecl Name)] -> [String]+ppData dflags decl@DataDecl { tcdLName = name, tcdTyVars = tvs, tcdFixity = fixity, tcdDataDefn = defn } subdocs+ = out dflags (ppDataDefnHeader (pp_vanilla_decl_head name tvs fixity) defn) :+ concatMap (ppCtor dflags decl subdocs . unLoc) (dd_cons defn)+ where+ppData _ _ _ = panic "ppData"++-- | for constructors, and named-fields...+lookupCon :: DynFlags -> [(Name, DocForDecl Name)] -> LocatedN Name -> [String]+lookupCon dflags subdocs (L _ name) = case lookup name subdocs of+ Just (d, _) -> ppDocumentation dflags d+ _ -> []++ppCtor :: DynFlags -> TyClDecl GhcRn -> [(Name, DocForDecl Name)] -> ConDecl GhcRn -> [String]+ppCtor dflags dat subdocs con@ConDeclH98 { con_args = con_args' }+ -- AZ:TODO get rid of the concatMap+ = concatMap (lookupCon dflags subdocs) [con_name con] ++ f con_args'+ where+ f (PrefixCon _ args) = [typeSig name $ (map hsScaledThing args) ++ [resType]]+ f (InfixCon a1 a2) = f $ PrefixCon [] [a1,a2]+ f (RecCon (L _ recs)) = f (PrefixCon [] $ map (hsLinear . cd_fld_type . unLoc) recs) ++ concat+ [(concatMap (lookupCon dflags subdocs . noLocA . foExt . unLoc) (cd_fld_names r)) +++ [out dflags (map (foExt . unLoc) $ cd_fld_names r) `typeSig` [resType, cd_fld_type r]]+ | r <- map unLoc recs]++ funs = foldr1 (\x y -> reL $ HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) x y)+ apps = foldl1 (\x y -> reL $ HsAppTy noExtField x y)++ typeSig nm flds = operator nm ++ " :: " +++ outHsSigType dflags (unL $ mkEmptySigType $ funs flds)++ -- We print the constructors as comma-separated list. See GHC+ -- docs for con_names on why it is a list to begin with.+ name = commaSeparate dflags . toList $ unL <$> getConNames con++ tyVarArg (UserTyVar _ _ n) = HsTyVar noAnn NotPromoted n+ tyVarArg (KindedTyVar _ _ n lty) = HsKindSig noAnn (reL (HsTyVar noAnn NotPromoted n)) lty+ tyVarArg _ = panic "ppCtor"++ resType = apps $ map reL $+ (HsTyVar noAnn NotPromoted (reL (tcdName dat))) :+ map (tyVarArg . unLoc) (hsQTvExplicit $ tyClDeclTyVars dat)++ppCtor dflags _dat subdocs (ConDeclGADT { con_names = names+ , con_bndrs = L _ outer_bndrs+ , con_mb_cxt = mcxt+ , con_g_args = args+ , con_res_ty = res_ty })+ = concatMap (lookupCon dflags subdocs) names ++ [typeSig]+ where+ typeSig = operator name ++ " :: " ++ outHsSigType dflags con_sig_ty+ name = out dflags $ unL <$> names+ con_sig_ty = HsSig noExtField outer_bndrs theta_ty where+ theta_ty = case mcxt of+ Just theta -> noLocA (HsQualTy { hst_xqual = noExtField, hst_ctxt = theta, hst_body = tau_ty })+ Nothing -> tau_ty+ tau_ty = foldr mkFunTy res_ty $+ case args of PrefixConGADT pos_args -> map hsScaledThing pos_args+ RecConGADT (L _ flds) _ -> map (cd_fld_type . unL) flds+ mkFunTy a b = noLocA (HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) a b)++ppFixity :: DynFlags -> (Name, Fixity) -> [String]+ppFixity dflags (name, fixity) = [out dflags ((FixitySig noExtField [noLocA name] fixity) :: FixitySig GhcRn)]+++---------------------------------------------------------------------+-- DOCUMENTATION++ppDocumentation :: Outputable o => DynFlags -> Documentation o -> [String]+ppDocumentation dflags (Documentation d w) = mdoc dflags d ++ doc dflags w+++doc :: Outputable o => DynFlags -> Maybe (Doc o) -> [String]+doc dflags = docWith dflags ""++mdoc :: Outputable o => DynFlags -> Maybe (MDoc o) -> [String]+mdoc dflags = docWith dflags "" . fmap _doc++docWith :: Outputable o => DynFlags -> String -> Maybe (Doc o) -> [String]+docWith _ [] Nothing = []+docWith dflags header d+ = ("":) $ zipWith (++) ("-- | " : repeat "-- ") $+ lines header ++ ["" | header /= "" && isJust d] +++ maybe [] (showTags . markup (markupTag dflags)) d++mkSubdocN :: DynFlags -> LocatedN Name -> [(Name, DocForDecl Name)] -> [String] -> [String]+mkSubdocN dflags n subdocs s = mkSubdoc dflags (n2l n) subdocs s++mkSubdoc :: DynFlags -> LocatedA Name -> [(Name, DocForDecl Name)] -> [String] -> [String]+mkSubdoc dflags n subdocs s = concatMap (ppDocumentation dflags) getDoc ++ s+ where+ getDoc = maybe [] (return . fst) (lookup (unLoc n) subdocs)++data Tag = TagL Char [Tags] | TagP Tags | TagPre Tags | TagInline String Tags | Str String+ deriving Show++type Tags = [Tag]++box :: (a -> b) -> a -> [b]+box f x = [f x]++str :: String -> [Tag]+str a = [Str a]++-- want things like paragraph, pre etc to be handled by blank lines in the source document+-- and things like \n and \t converted away+-- much like blogger in HTML mode+-- everything else wants to be included as tags, neatly nested for some (ul,li,ol)+-- or inlne for others (a,i,tt)+-- entities (&,>,<) should always be appropriately escaped++markupTag :: Outputable o => DynFlags -> DocMarkup o [Tag]+markupTag dflags = Markup {+ markupParagraph = box TagP,+ markupEmpty = str "",+ markupString = str,+ markupAppend = (++),+ markupIdentifier = box (TagInline "a") . str . out dflags,+ markupIdentifierUnchecked = box (TagInline "a") . str . showWrapped (out dflags . snd),+ markupModule = \(ModLink m label) -> box (TagInline "a") (fromMaybe (str m) label),+ markupWarning = box (TagInline "i"),+ markupEmphasis = box (TagInline "i"),+ markupBold = box (TagInline "b"),+ markupMonospaced = box (TagInline "tt"),+ markupPic = const $ str " ",+ markupMathInline = const $ str "<math>",+ markupMathDisplay = const $ str "<math>",+ markupUnorderedList = box (TagL 'u'),+ markupOrderedList = box (TagL 'o') . map snd,+ markupDefList = box (TagL 'u') . map (\(a,b) -> TagInline "i" a : Str " " : b),+ markupCodeBlock = box TagPre,+ markupHyperlink = \(Hyperlink url mLabel) -> box (TagInline "a") (fromMaybe (str url) mLabel),+ markupAName = const $ str "",+ markupProperty = box TagPre . str,+ markupExample = box TagPre . str . unlines . map exampleToString,+ markupHeader = \(Header l h) -> box (TagInline $ "h" ++ show l) h,+ markupTable = \(Table _ _) -> str "TODO: table"+ }+++showTags :: [Tag] -> [String]+showTags = intercalate [""] . map showBlock+++showBlock :: Tag -> [String]+showBlock (TagP xs) = showInline xs+showBlock (TagL t xs) = ['<':t:"l>"] ++ mid ++ ['<':'/':t:"l>"]+ where mid = concatMap (showInline . box (TagInline "li")) xs+showBlock (TagPre xs) = ["<pre>"] ++ showPre xs ++ ["</pre>"]+showBlock x = showInline [x]+++asInline :: Tag -> Tags+asInline (TagP xs) = xs+asInline (TagPre xs) = [TagInline "pre" xs]+asInline (TagL t xs) = [TagInline (t:"l") $ map (TagInline "li") xs]+asInline x = [x]+++showInline :: [Tag] -> [String]+showInline = unwordsWrap 70 . words . concatMap f+ where+ fs = concatMap f+ f (Str x) = escape x+ f (TagInline s xs) = "<"++s++">" ++ (if s == "li" then trim else id) (fs xs) ++ "</"++s++">"+ f x = fs $ asInline x++ trim = dropWhile isSpace . reverse . dropWhile isSpace . reverse+++showPre :: [Tag] -> [String]+showPre = trimFront . trimLines . lines . concatMap f+ where+ trimLines = dropWhile null . reverse . dropWhile null . reverse+ trimFront xs = map (drop i) xs+ where+ ns = [length a | x <- xs, let (a,b) = span isSpace x, b /= ""]+ i = if null ns then 0 else minimum ns++ fs = concatMap f+ f (Str x) = escape x+ f (TagInline s xs) = "<"++s++">" ++ fs xs ++ "</"++s++">"+ f x = fs $ asInline x+++unwordsWrap :: Int -> [String] -> [String]+unwordsWrap n = f n []+ where+ f _ s [] = [g s | s /= []]+ f i s (x:xs) | nx > i = g s : f (n - nx - 1) [x] xs+ | otherwise = f (i - nx - 1) (x:s) xs+ where nx = length x++ g = unwords . reverse+++escape :: String -> String+escape = concatMap f+ where+ f '<' = "<"+ f '>' = ">"+ f '&' = "&"+ f x = [x]+++-- | Just like 'vcat' but uses '($+$)' instead of '($$)'.+vcat' :: [SDoc] -> SDoc+vcat' = foldr ($+$) empty
@@ -0,0 +1,114 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+module Haddock.Backends.Hyperlinker+ ( ppHyperlinkedSource+ , module Haddock.Backends.Hyperlinker.Types+ , module Haddock.Backends.Hyperlinker.Utils+ ) where+++import Haddock.Types+import Haddock.Utils (writeUtf8File, out, verbose, Verbosity)+import Haddock.InterfaceFile+import Haddock.Backends.Hyperlinker.Renderer+import Haddock.Backends.Hyperlinker.Parser+import Haddock.Backends.Hyperlinker.Types+import Haddock.Backends.Hyperlinker.Utils+import Haddock.Backends.Xhtml.Utils ( renderToString )++import Data.Maybe+import System.Directory+import System.FilePath++import GHC.Iface.Ext.Types ( pattern HiePath, HieFile(..), HieASTs(..), HieAST(..), SourcedNodeInfo(..) )+import GHC.Iface.Ext.Binary ( readHieFile, hie_file_result )+import GHC.Types.SrcLoc ( realSrcLocSpan, mkRealSrcLoc, srcSpanFile )+import Data.Map as M+import GHC.Data.FastString ( mkFastString )+import GHC.Unit.Module ( Module, moduleName )+++-- | Generate hyperlinked source for given interfaces.+--+-- Note that list of interfaces should also contain interfaces normally hidden+-- when generating documentation. Otherwise this could lead to dead links in+-- produced source.+ppHyperlinkedSource :: Verbosity+ -> FilePath -- ^ Output directory+ -> FilePath -- ^ Resource directory+ -> Maybe FilePath -- ^ Custom CSS file path+ -> Bool -- ^ Flag indicating whether to pretty-print HTML+ -> M.Map Module SrcPath -- ^ Paths to sources+ -> [Interface] -- ^ Interfaces for which we create source+ -> IO ()+ppHyperlinkedSource verbosity outdir libdir mstyle pretty srcs' ifaces = do+ createDirectoryIfMissing True srcdir+ let cssFile = fromMaybe (defaultCssFile libdir) mstyle+ copyFile cssFile $ srcdir </> srcCssFile+ copyFile (libdir </> "html" </> highlightScript) $+ srcdir </> highlightScript+ mapM_ (ppHyperlinkedModuleSource verbosity srcdir pretty srcs) ifaces+ where+ srcdir = outdir </> hypSrcDir+ srcs = (srcs', M.mapKeys moduleName srcs')++-- | Generate hyperlinked source for particular interface.+ppHyperlinkedModuleSource :: Verbosity -> FilePath -> Bool -> SrcMaps -> Interface -> IO ()+ppHyperlinkedModuleSource verbosity srcdir pretty srcs iface = case ifaceHieFile iface of+ Just hfp -> do+ -- Parse the GHC-produced HIE file+ nc <- freshNameCache+ HieFile { hie_hs_file = file+ , hie_asts = HieASTs asts+ , hie_types = types+ , hie_hs_src = rawSrc+ } <- hie_file_result+ <$> (readHieFile nc hfp)++ -- Get the AST and tokens corresponding to the source file we want+ let fileFs = mkFastString file+ mast | M.size asts == 1 = snd <$> M.lookupMin asts+ | otherwise = M.lookup (HiePath (mkFastString file)) asts+ tokens' = parse df file rawSrc+ ast = fromMaybe (emptyHieAst fileFs) mast+ fullAst = recoverFullIfaceTypes df types ast++ -- Warn if we didn't find an AST, but there were still ASTs+ if M.null asts+ then pure ()+ else out verbosity verbose $ unwords [ "couldn't find ast for"+ , file, show (M.keys asts) ]++ -- The C preprocessor can double the backslashes on tokens (see #19236),+ -- which means the source spans will not be comparable and we will not+ -- be able to associate the HieAST with the correct tokens.+ --+ -- We work around this by setting the source span of the tokens to the file+ -- name from the HieAST+ let tokens = fmap (\tk -> tk {tkSpan = (tkSpan tk){srcSpanFile = srcSpanFile $ nodeSpan fullAst}}) tokens'++ -- Produce and write out the hyperlinked sources+ writeUtf8File path . renderToString pretty . render' fullAst $ tokens+ Nothing -> return ()+ where+ df = ifaceDynFlags iface+ render' = render (Just srcCssFile) (Just highlightScript) srcs+ path = srcdir </> hypSrcModuleFile (ifaceMod iface)++ emptyHieAst fileFs = Node+ { nodeSpan = realSrcLocSpan (mkRealSrcLoc fileFs 1 0)+ , nodeChildren = []+ , sourcedNodeInfo = SourcedNodeInfo mempty+ }++-- | Name of CSS file in output directory.+srcCssFile :: FilePath+srcCssFile = "style.css"++-- | Name of highlight script in output and resource directory.+highlightScript :: FilePath+highlightScript = "highlight.js"++-- | Path to default CSS file.+defaultCssFile :: FilePath -> FilePath+defaultCssFile libdir = libdir </> "html" </> "solarized.css"
@@ -0,0 +1,406 @@+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}+module Haddock.Backends.Hyperlinker.Parser (parse) where++import Control.Monad.Trans.Maybe+import Control.Monad.Trans.Class+import Control.Applicative ( Alternative(..) )+import Data.List ( isPrefixOf, isSuffixOf )++import qualified Data.ByteString as BS++import GHC.Platform+import GHC.Types.SourceText+import GHC.Driver.Session+import GHC.Driver.Config.Diagnostic+import GHC.Utils.Error ( pprLocMsgEnvelopeDefault )+import GHC.Data.FastString ( mkFastString )+import GHC.Parser.Errors.Ppr ()+import qualified GHC.Types.Error as E+import GHC.Parser.Lexer as Lexer+ ( P(..), ParseResult(..), PState(..), Token(..)+ , initParserState, lexer, mkParserOpts, getPsErrorMessages)+import GHC.Data.Bag ( bagToList )+import GHC.Utils.Outputable ( text, ($$) )+import GHC.Utils.Panic ( panic )+import GHC.Driver.Ppr ( showSDoc )+import GHC.Types.SrcLoc+import GHC.Data.StringBuffer ( StringBuffer, atEnd )++import Haddock.Backends.Hyperlinker.Types as T+import Haddock.GhcUtils++-- | Turn source code string into a stream of more descriptive tokens.+--+-- Result should retain original file layout (including comments,+-- whitespace, and CPP).+parse+ :: DynFlags -- ^ Flags for this module+ -> FilePath -- ^ Path to the source of this module+ -> BS.ByteString -- ^ Raw UTF-8 encoded source of this module+ -> [T.Token]+parse dflags fpath bs = case unP (go False []) initState of+ POk _ toks -> reverse toks+ PFailed pst ->+ let err:_ = bagToList (E.getMessages $ getPsErrorMessages pst) in+ panic $ showSDoc dflags $+ text "Hyperlinker parse error:" $$ pprLocMsgEnvelopeDefault err+ where++ initState = initParserState pflags buf start+ buf = stringBufferFromByteString bs+ start = mkRealSrcLoc (mkFastString fpath) 1 1+ arch_os = platformArchOS (targetPlatform dflags)+ pflags = mkParserOpts (extensionFlags dflags)+ (initDiagOpts dflags)+ (supportedLanguagesAndExtensions arch_os)+ (safeImportsOn dflags)+ False -- lex Haddocks as comment tokens+ True -- produce comment tokens+ False -- produce position pragmas tokens++ go :: Bool -- ^ are we currently in a pragma?+ -> [T.Token] -- ^ tokens accumulated so far (in reverse)+ -> P [T.Token]+ go inPrag toks = do+ (b, _) <- getInput+ if not (atEnd b)+ then do+ mtok <- runMaybeT (parseCppLine <|> parsePlainTok inPrag)+ (newToks, inPrag') <- case mtok of+ Nothing -> unknownLine+ Just a -> pure a+ go inPrag' (newToks ++ toks)+ else+ pure toks++ -- | Like 'Lexer.lexer', but slower, with a better API, and filtering out empty tokens+ wrappedLexer :: P (RealLocated Lexer.Token)+ wrappedLexer = Lexer.lexer False andThen+ where andThen (L (RealSrcSpan s _) t)+ | srcSpanStartLine s /= srcSpanEndLine s ||+ srcSpanStartCol s /= srcSpanEndCol s+ = pure (L s t)+ andThen (L (RealSrcSpan s _) ITeof) = pure (L s ITeof)+ andThen _ = wrappedLexer++ -- | Try to parse a CPP line (can fail)+ parseCppLine :: MaybeT P ([T.Token], Bool)+ parseCppLine = MaybeT $ do+ (b, l) <- getInput+ case tryCppLine l b of+ Just (cppBStr, l', b')+ -> let cppTok = T.Token { tkType = TkCpp+ , tkValue = cppBStr+ , tkSpan = mkRealSrcSpan l l' }+ in setInput (b', l') *> pure (Just ([cppTok], False))+ _ -> return Nothing++ -- | Try to parse a regular old token (can fail)+ parsePlainTok :: Bool -> MaybeT P ([T.Token], Bool) -- return list is only ever 0-2 elements+ parsePlainTok inPrag = do+ (bInit, lInit) <- lift getInput+ L sp tok <- tryP (Lexer.lexer False return)+ (bEnd, _) <- lift getInput+ case sp of+ UnhelpfulSpan _ -> pure ([], False) -- pretend the token never existed+ RealSrcSpan rsp _ -> do+ let typ = if inPrag then TkPragma else classify tok+ RealSrcLoc lStart _ = srcSpanStart sp -- safe since @sp@ is real+ (spaceBStr, bStart) = spanPosition lInit lStart bInit+ inPragDef = inPragma inPrag tok++ (bEnd', inPrag') <- case tok of++ -- Update internal line + file position if this is a LINE pragma+ ITline_prag _ -> tryOrElse (bEnd, inPragDef) $ do+ L _ (ITinteger (IL { il_value = line })) <- tryP wrappedLexer+ L _ (ITstring _ file) <- tryP wrappedLexer+ L spF ITclose_prag <- tryP wrappedLexer++ let newLoc = mkRealSrcLoc file (fromIntegral line - 1) (srcSpanEndCol spF)+ (bEnd'', _) <- lift getInput+ lift $ setInput (bEnd'', newLoc)++ pure (bEnd'', False)++ -- Update internal column position if this is a COLUMN pragma+ ITcolumn_prag _ -> tryOrElse (bEnd, inPragDef) $ do+ L _ (ITinteger (IL { il_value = col })) <- tryP wrappedLexer+ L spF ITclose_prag <- tryP wrappedLexer++ let newLoc = mkRealSrcLoc (srcSpanFile spF) (srcSpanEndLine spF) (fromIntegral col)+ (bEnd'', _) <- lift getInput+ lift $ setInput (bEnd'', newLoc)++ pure (bEnd'', False)++ _ -> pure (bEnd, inPragDef)++ let tokBStr = splitStringBuffer bStart bEnd'+ plainTok = T.Token { tkType = typ+ , tkValue = tokBStr+ , tkSpan = rsp }+ spaceTok = T.Token { tkType = TkSpace+ , tkValue = spaceBStr+ , tkSpan = mkRealSrcSpan lInit lStart }++ pure (plainTok : [ spaceTok | not (BS.null spaceBStr) ], inPrag')++ -- | Parse whatever remains of the line as an unknown token (can't fail)+ unknownLine :: P ([T.Token], Bool)+ unknownLine = do+ (b, l) <- getInput+ let (unkBStr, l', b') = spanLine l b+ unkTok = T.Token { tkType = TkUnknown+ , tkValue = unkBStr+ , tkSpan = mkRealSrcSpan l l' }+ setInput (b', l')+ pure ([unkTok], False)+++-- | Get the input+getInput :: P (StringBuffer, RealSrcLoc)+getInput = P $ \p@PState { buffer = buf, loc = srcLoc } -> POk p (buf, psRealLoc srcLoc)++-- | Set the input+setInput :: (StringBuffer, RealSrcLoc) -> P ()+setInput (buf, srcLoc) =+ P $ \p@PState{ loc = PsLoc _ buf_loc } ->+ POk (p { buffer = buf, loc = PsLoc srcLoc buf_loc }) ()++tryP :: P a -> MaybeT P a+tryP (P f) = MaybeT $ P $ \s -> case f s of+ POk s' a -> POk s' (Just a)+ PFailed _ -> POk s Nothing++tryOrElse :: Alternative f => a -> f a -> f a+tryOrElse x p = p <|> pure x++-- | Classify given tokens as appropriate Haskell token type.+classify :: Lexer.Token -> TokenType+classify tok =+ case tok of+ ITas -> TkKeyword+ ITcase -> TkKeyword+ ITclass -> TkKeyword+ ITdata -> TkKeyword+ ITdefault -> TkKeyword+ ITderiving -> TkKeyword+ ITdo {} -> TkKeyword+ ITelse -> TkKeyword+ IThiding -> TkKeyword+ ITforeign -> TkKeyword+ ITif -> TkKeyword+ ITimport -> TkKeyword+ ITin -> TkKeyword+ ITinfix -> TkKeyword+ ITinfixl -> TkKeyword+ ITinfixr -> TkKeyword+ ITinstance -> TkKeyword+ ITlet -> TkKeyword+ ITmodule -> TkKeyword+ ITnewtype -> TkKeyword+ ITof -> TkKeyword+ ITqualified -> TkKeyword+ ITthen -> TkKeyword+ ITtype -> TkKeyword+ ITvia -> TkKeyword+ ITwhere -> TkKeyword++ ITforall {} -> TkKeyword+ ITexport -> TkKeyword+ ITlabel -> TkKeyword+ ITdynamic -> TkKeyword+ ITsafe -> TkKeyword+ ITinterruptible -> TkKeyword+ ITunsafe -> TkKeyword+ ITstdcallconv -> TkKeyword+ ITccallconv -> TkKeyword+ ITcapiconv -> TkKeyword+ ITprimcallconv -> TkKeyword+ ITjavascriptcallconv -> TkKeyword+ ITmdo {} -> TkKeyword+ ITfamily -> TkKeyword+ ITrole -> TkKeyword+ ITgroup -> TkKeyword+ ITby -> TkKeyword+ ITusing -> TkKeyword+ ITpattern -> TkKeyword+ ITstatic -> TkKeyword+ ITstock -> TkKeyword+ ITanyclass -> TkKeyword++ ITunit -> TkKeyword+ ITsignature -> TkKeyword+ ITdependency -> TkKeyword+ ITrequires -> TkKeyword++ ITinline_prag {} -> TkPragma+ ITopaque_prag {} -> TkPragma+ ITspec_prag {} -> TkPragma+ ITspec_inline_prag {} -> TkPragma+ ITsource_prag {} -> TkPragma+ ITrules_prag {} -> TkPragma+ ITwarning_prag {} -> TkPragma+ ITdeprecated_prag {} -> TkPragma+ ITline_prag {} -> TkPragma+ ITcolumn_prag {} -> TkPragma+ ITscc_prag {} -> TkPragma+ ITunpack_prag {} -> TkPragma+ ITnounpack_prag {} -> TkPragma+ ITann_prag {} -> TkPragma+ ITcomplete_prag {} -> TkPragma+ ITclose_prag -> TkPragma+ IToptions_prag {} -> TkPragma+ ITinclude_prag {} -> TkPragma+ ITlanguage_prag -> TkPragma+ ITminimal_prag {} -> TkPragma+ IToverlappable_prag {} -> TkPragma+ IToverlapping_prag {} -> TkPragma+ IToverlaps_prag {} -> TkPragma+ ITincoherent_prag {} -> TkPragma+ ITctype {} -> TkPragma++ ITdotdot -> TkGlyph+ ITcolon -> TkGlyph+ ITdcolon {} -> TkGlyph+ ITequal -> TkGlyph+ ITlam -> TkGlyph+ ITlcase -> TkGlyph+ ITlcases -> TkGlyph+ ITvbar -> TkGlyph+ ITlarrow {} -> TkGlyph+ ITrarrow {} -> TkGlyph+ ITlolly {} -> TkGlyph+ ITat -> TkGlyph+ ITtilde -> TkGlyph+ ITdarrow {} -> TkGlyph+ ITminus -> TkGlyph+ ITprefixminus -> TkGlyph+ ITbang -> TkGlyph+ ITdot -> TkOperator+ ITproj {} -> TkOperator+ ITstar {} -> TkOperator+ ITtypeApp -> TkGlyph+ ITpercent -> TkGlyph++ ITbiglam -> TkGlyph++ ITocurly -> TkSpecial+ ITccurly -> TkSpecial+ ITvocurly -> TkSpecial+ ITvccurly -> TkSpecial+ ITobrack -> TkSpecial+ ITopabrack -> TkSpecial+ ITcpabrack -> TkSpecial+ ITcbrack -> TkSpecial+ IToparen -> TkSpecial+ ITcparen -> TkSpecial+ IToubxparen -> TkSpecial+ ITcubxparen -> TkSpecial+ ITsemi -> TkSpecial+ ITcomma -> TkSpecial+ ITunderscore -> TkIdentifier+ ITbackquote -> TkSpecial+ ITsimpleQuote -> TkSpecial++ ITvarid {} -> TkIdentifier+ ITconid {} -> TkIdentifier+ ITvarsym {} -> TkOperator+ ITconsym {} -> TkOperator+ ITqvarid {} -> TkIdentifier+ ITqconid {} -> TkIdentifier+ ITqvarsym {} -> TkOperator+ ITqconsym {} -> TkOperator++ ITdupipvarid {} -> TkUnknown+ ITlabelvarid {} -> TkUnknown++ ITchar {} -> TkChar+ ITstring {} -> TkString+ ITinteger {} -> TkNumber+ ITrational {} -> TkNumber++ ITprimchar {} -> TkChar+ ITprimstring {} -> TkString+ ITprimint {} -> TkNumber+ ITprimword {} -> TkNumber+ ITprimfloat {} -> TkNumber+ ITprimdouble {} -> TkNumber++ ITopenExpQuote {} -> TkSpecial+ ITopenPatQuote -> TkSpecial+ ITopenDecQuote -> TkSpecial+ ITopenTypQuote -> TkSpecial+ ITcloseQuote {} -> TkSpecial+ ITopenTExpQuote {} -> TkSpecial+ ITcloseTExpQuote -> TkSpecial+ ITdollar -> TkSpecial+ ITdollardollar -> TkSpecial+ ITtyQuote -> TkSpecial+ ITquasiQuote {} -> TkUnknown+ ITqQuasiQuote {} -> TkUnknown++ ITproc -> TkKeyword+ ITrec -> TkKeyword+ IToparenbar {} -> TkGlyph+ ITcparenbar {} -> TkGlyph+ ITlarrowtail {} -> TkGlyph+ ITrarrowtail {} -> TkGlyph+ ITLarrowtail {} -> TkGlyph+ ITRarrowtail {} -> TkGlyph++ ITcomment_line_prag -> TkUnknown+ ITunknown {} -> TkUnknown+ ITeof -> TkUnknown++ ITlineComment {} -> TkComment+ ITdocComment {} -> TkComment+ ITdocOptions {} -> TkComment++ -- The lexer considers top-level pragmas as comments (see `pragState` in+ -- the GHC lexer for more), so we have to manually reverse this. The+ -- following is a hammer: it smashes _all_ pragma-like block comments into+ -- pragmas.+ ITblockComment c _+ | isPrefixOf "{-#" c+ , isSuffixOf "#-}" c -> TkPragma+ | otherwise -> TkComment++-- | Classify given tokens as beginning pragmas (or not).+inPragma :: Bool -- ^ currently in pragma+ -> Lexer.Token -- ^ current token+ -> Bool -- ^ new information about whether we are in a pragma+inPragma _ ITclose_prag = False+inPragma True _ = True+inPragma False tok =+ case tok of+ ITinline_prag {} -> True+ ITopaque_prag {} -> True+ ITspec_prag {} -> True+ ITspec_inline_prag {} -> True+ ITsource_prag {} -> True+ ITrules_prag {} -> True+ ITwarning_prag {} -> True+ ITdeprecated_prag {} -> True+ ITline_prag {} -> True+ ITcolumn_prag {} -> True+ ITscc_prag {} -> True+ ITunpack_prag {} -> True+ ITnounpack_prag {} -> True+ ITann_prag {} -> True+ ITcomplete_prag {} -> True+ IToptions_prag {} -> True+ ITinclude_prag {} -> True+ ITlanguage_prag -> True+ ITminimal_prag {} -> True+ IToverlappable_prag {} -> True+ IToverlapping_prag {} -> True+ IToverlaps_prag {} -> True+ ITincoherent_prag {} -> True+ ITctype {} -> True++ _ -> False+
@@ -0,0 +1,294 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE BangPatterns #-}++module Haddock.Backends.Hyperlinker.Renderer (render) where+++import Haddock.Backends.Hyperlinker.Types+import Haddock.Backends.Hyperlinker.Utils++import qualified Data.ByteString as BS++import GHC.Iface.Ext.Types+import GHC.Iface.Ext.Utils ( isEvidenceContext , emptyNodeInfo )+import GHC.Unit.Module ( ModuleName, moduleNameString )+import GHC.Types.Name ( getOccString, isInternalName, Name, nameModule, nameUnique )+import GHC.Types.SrcLoc+import GHC.Types.Unique ( getKey )+import GHC.Utils.Encoding ( utf8DecodeByteString )++import System.FilePath.Posix ((</>))++import qualified Data.Map as Map+import qualified Data.Set as Set+import qualified Data.List as List++import Text.XHtml (Html, HtmlAttr, (!))+import qualified Text.XHtml as Html+++type StyleClass = String++-- | Produce the HTML corresponding to a hyperlinked Haskell source+render+ :: Maybe FilePath -- ^ path to the CSS file+ -> Maybe FilePath -- ^ path to the JS file+ -> SrcMaps -- ^ Paths to sources+ -> HieAST PrintedType -- ^ ASTs from @.hie@ files+ -> [Token] -- ^ tokens to render+ -> Html+render mcss mjs srcs ast tokens = header mcss mjs <> body srcs ast tokens++body :: SrcMaps -> HieAST PrintedType -> [Token] -> Html+body srcs ast tokens = Html.body . Html.pre $ hypsrc+ where+ hypsrc = renderWithAst srcs ast tokens++header :: Maybe FilePath -> Maybe FilePath -> Html+header Nothing Nothing = Html.noHtml+header mcss mjs = Html.header $ css mcss <> js mjs+ where+ css Nothing = Html.noHtml+ css (Just cssFile) = Html.thelink Html.noHtml !+ [ Html.rel "stylesheet"+ , Html.thetype "text/css"+ , Html.href cssFile+ ]+ js Nothing = Html.noHtml+ js (Just scriptFile) = Html.script Html.noHtml !+ [ Html.thetype "text/javascript"+ , Html.src scriptFile+ ]+++splitTokens :: HieAST PrintedType -> [Token] -> ([Token],[Token],[Token])+splitTokens ast toks = (before,during,after)+ where+ (before,rest) = span leftOf toks+ (during,after) = span inAst rest+ leftOf t = realSrcSpanEnd (tkSpan t) <= realSrcSpanStart nodeSp+ inAst t = nodeSp `containsSpan` tkSpan t+ nodeSp = nodeSpan ast++-- | Turn a list of tokens into hyperlinked sources, threading in relevant link+-- information from the 'HieAST'.+renderWithAst :: SrcMaps -> HieAST PrintedType -> [Token] -> Html+renderWithAst srcs Node{..} toks = anchored $ case toks of++ [tok] | nodeSpan == tkSpan tok -> richToken srcs nodeInfo tok++ -- NB: the GHC lexer lexes backquoted identifiers and parenthesized operators+ -- as multiple tokens.+ --+ -- * @a `elem` b@ turns into @[a, `, elem, `, b]@ (excluding space tokens)+ -- * @(+) 1 2@ turns into @[(, +, ), 1, 2]@ (excluding space tokens)+ --+ -- However, the HIE ast considers @`elem`@ and @(+)@ to be single nodes. In+ -- order to make sure these get hyperlinked properly, we intercept these+ -- special sequences of tokens and merge them into just one identifier or+ -- operator token.+ [BacktickTok s1, tok@Token{ tkType = TkIdentifier }, BacktickTok s2]+ | realSrcSpanStart s1 == realSrcSpanStart nodeSpan+ , realSrcSpanEnd s2 == realSrcSpanEnd nodeSpan+ -> richToken srcs nodeInfo+ (Token{ tkValue = "`" <> tkValue tok <> "`"+ , tkType = TkOperator+ , tkSpan = nodeSpan })+ [OpenParenTok s1, tok@Token{ tkType = TkOperator }, CloseParenTok s2]+ | realSrcSpanStart s1 == realSrcSpanStart nodeSpan+ , realSrcSpanEnd s2 == realSrcSpanEnd nodeSpan+ -> richToken srcs nodeInfo+ (Token{ tkValue = "(" <> tkValue tok <> ")"+ , tkType = TkOperator+ , tkSpan = nodeSpan })++ _ -> go nodeChildren toks+ where+ nodeInfo = maybe emptyNodeInfo id (Map.lookup SourceInfo $ getSourcedNodeInfo sourcedNodeInfo)+ go _ [] = mempty+ go [] xs = foldMap renderToken xs+ go (cur:rest) xs =+ foldMap renderToken before <> renderWithAst srcs cur during <> go rest after+ where+ (before,during,after) = splitTokens cur xs+ anchored c = Map.foldrWithKey anchorOne c (nodeIdentifiers nodeInfo)+ anchorOne n dets c = externalAnchor n d $ internalAnchor n d c+ where d = identInfo dets++renderToken :: Token -> Html+renderToken Token{..}+ | BS.null tkValue = mempty+ | tkType == TkSpace = renderSpace (srcSpanStartLine tkSpan) tkValue'+ | otherwise = tokenSpan ! [ multiclass style ]+ where+ tkValue' = filterCRLF $ utf8DecodeByteString tkValue+ style = tokenStyle tkType+ tokenSpan = Html.thespan (Html.toHtml tkValue')+++-- | Given information about the source position of definitions, render a token+richToken :: SrcMaps -> NodeInfo PrintedType -> Token -> Html+richToken srcs details Token{..}+ | tkType == TkSpace = renderSpace (srcSpanStartLine tkSpan) tkValue'+ | otherwise = annotate details $ linked content+ where+ tkValue' = filterCRLF $ utf8DecodeByteString tkValue+ content = tokenSpan ! [ multiclass style ]+ tokenSpan = Html.thespan (Html.toHtml tkValue')+ style = tokenStyle tkType ++ concatMap (richTokenStyle (null (nodeType details))) contexts++ contexts = concatMap (Set.elems . identInfo) . Map.elems . nodeIdentifiers $ details++ -- pick an arbitrary non-evidence identifier to hyperlink with+ identDet = Map.lookupMin $ Map.filter notEvidence $ nodeIdentifiers details+ notEvidence = not . any isEvidenceContext . identInfo++ -- If we have name information, we can make links+ linked = case identDet of+ Just (n,_) -> hyperlink srcs n+ Nothing -> id++-- | Remove CRLFs from source+filterCRLF :: String -> String+filterCRLF ('\r':'\n':cs) = '\n' : filterCRLF cs+filterCRLF (c:cs) = c : filterCRLF cs+filterCRLF [] = []++annotate :: NodeInfo PrintedType -> Html -> Html+annotate ni content =+ Html.thespan (annot <> content) ! [ Html.theclass "annot" ]+ where+ annot+ | not (null annotation) =+ Html.thespan (Html.toHtml annotation) ! [ Html.theclass "annottext" ]+ | otherwise = mempty+ annotation = typ ++ identTyps+ typ = unlines (nodeType ni)+ typedIdents = [ (n,t) | (n, c@(identType -> Just t)) <- Map.toList $ nodeIdentifiers ni+ , not (any isEvidenceContext $ identInfo c) ]+ identTyps+ | length typedIdents > 1 || null (nodeType ni)+ = concatMap (\(n,t) -> printName n ++ " :: " ++ t ++ "\n") typedIdents+ | otherwise = ""++ printName :: Either ModuleName Name -> String+ printName = either moduleNameString getOccString++richTokenStyle+ :: Bool -- ^ are we lacking a type annotation?+ -> ContextInfo -- ^ in what context did this token show up?+ -> [StyleClass]+richTokenStyle True Use = ["hs-type"]+richTokenStyle False Use = ["hs-var"]+richTokenStyle _ RecField{} = ["hs-var"]+richTokenStyle _ PatternBind{} = ["hs-var"]+richTokenStyle _ MatchBind{} = ["hs-var"]+richTokenStyle _ TyVarBind{} = ["hs-type"]+richTokenStyle _ ValBind{} = ["hs-var"]+richTokenStyle _ TyDecl = ["hs-type"]+richTokenStyle _ ClassTyDecl{} = ["hs-type"]+richTokenStyle _ Decl{} = ["hs-var"]+richTokenStyle _ IEThing{} = [] -- could be either a value or type+richTokenStyle _ EvidenceVarBind{} = []+richTokenStyle _ EvidenceVarUse{} = []++tokenStyle :: TokenType -> [StyleClass]+tokenStyle TkIdentifier = ["hs-identifier"]+tokenStyle TkKeyword = ["hs-keyword"]+tokenStyle TkString = ["hs-string"]+tokenStyle TkChar = ["hs-char"]+tokenStyle TkNumber = ["hs-number"]+tokenStyle TkOperator = ["hs-operator"]+tokenStyle TkGlyph = ["hs-glyph"]+tokenStyle TkSpecial = ["hs-special"]+tokenStyle TkSpace = []+tokenStyle TkComment = ["hs-comment"]+tokenStyle TkCpp = ["hs-cpp"]+tokenStyle TkPragma = ["hs-pragma"]+tokenStyle TkUnknown = []++multiclass :: [StyleClass] -> HtmlAttr+multiclass = Html.theclass . unwords++externalAnchor :: Identifier -> Set.Set ContextInfo -> Html -> Html+externalAnchor (Right name) contexts content+ | not (isInternalName name)+ , any isBinding contexts+ = Html.thespan content ! [ Html.identifier $ externalAnchorIdent name ]+externalAnchor _ _ content = content++isBinding :: ContextInfo -> Bool+isBinding (ValBind RegularBind _ _) = True+isBinding PatternBind{} = True+isBinding Decl{} = True+isBinding (RecField RecFieldDecl _) = True+isBinding TyVarBind{} = True+isBinding ClassTyDecl{} = True+isBinding _ = False++internalAnchor :: Identifier -> Set.Set ContextInfo -> Html -> Html+internalAnchor (Right name) contexts content+ | isInternalName name+ , any isBinding contexts+ = Html.thespan content ! [ Html.identifier $ internalAnchorIdent name ]+internalAnchor _ _ content = content++externalAnchorIdent :: Name -> String+externalAnchorIdent = hypSrcNameUrl++internalAnchorIdent :: Name -> String+internalAnchorIdent = ("local-" ++) . show . getKey . nameUnique++-- | Generate the HTML hyperlink for an identifier+hyperlink :: SrcMaps -> Identifier -> Html -> Html+hyperlink (srcs, srcs') ident = case ident of+ Right name | isInternalName name -> internalHyperlink name+ | otherwise -> externalNameHyperlink name+ Left name -> externalModHyperlink name++ where+ -- In a Nix environment, we have file:// URLs with absolute paths+ makeHyperlinkUrl url | List.isPrefixOf "file://" url = url+ makeHyperlinkUrl url = ".." </> url++ internalHyperlink name content =+ Html.anchor content ! [ Html.href $ "#" ++ internalAnchorIdent name ]++ externalNameHyperlink name content = case Map.lookup mdl srcs of+ Just SrcLocal -> Html.anchor content !+ [ Html.href $ hypSrcModuleNameUrl mdl name ]+ Just (SrcExternal path) ->+ let hyperlinkUrl = makeHyperlinkUrl path </> hypSrcModuleNameUrl mdl name+ in Html.anchor content !+ [ Html.href $ spliceURL Nothing (Just mdl) (Just name) Nothing hyperlinkUrl ]+ Nothing -> content+ where+ mdl = nameModule name++ externalModHyperlink moduleName content =+ case Map.lookup moduleName srcs' of+ Just SrcLocal -> Html.anchor content !+ [ Html.href $ hypSrcModuleUrl' moduleName ]+ Just (SrcExternal path) ->+ let hyperlinkUrl = makeHyperlinkUrl path </> hypSrcModuleUrl' moduleName+ in Html.anchor content !+ [ Html.href $ spliceURL' Nothing (Just moduleName) Nothing Nothing hyperlinkUrl ]+ Nothing -> content+++renderSpace :: Int -> String -> Html+renderSpace !_ "" = Html.noHtml+renderSpace !line ('\n':rest) = mconcat+ [ Html.thespan (Html.toHtml '\n')+ , lineAnchor (line + 1)+ , renderSpace (line + 1) rest+ ]+renderSpace line space =+ let (hspace, rest) = span (/= '\n') space+ in (Html.thespan . Html.toHtml) hspace <> renderSpace line rest+++lineAnchor :: Int -> Html+lineAnchor line = Html.thespan Html.noHtml ! [ Html.identifier $ hypSrcLineUrl line ]
@@ -0,0 +1,51 @@+{-# LANGUAGE PatternSynonyms, OverloadedStrings #-}+module Haddock.Backends.Hyperlinker.Types where++import qualified GHC++import Data.ByteString ( ByteString )++import Data.Map (Map)++data Token = Token+ { tkType :: TokenType+ , tkValue :: ByteString -- ^ UTF-8 encoded+ , tkSpan :: {-# UNPACK #-} !Span+ }+ deriving (Show)++pattern BacktickTok, OpenParenTok, CloseParenTok :: Span -> Token+pattern BacktickTok sp = Token TkSpecial "`" sp+pattern OpenParenTok sp = Token TkSpecial "(" sp+pattern CloseParenTok sp = Token TkSpecial ")" sp++type Position = GHC.RealSrcLoc+type Span = GHC.RealSrcSpan++data TokenType+ = TkIdentifier+ | TkKeyword+ | TkString+ | TkChar+ | TkNumber+ | TkOperator+ | TkGlyph+ | TkSpecial+ | TkSpace+ | TkComment+ | TkCpp+ | TkPragma+ | TkUnknown+ deriving (Show, Eq)++-- | Path for making cross-package hyperlinks in generated sources.+--+-- Used in 'SrcMap' to determine whether module originates in current package+-- or in an external package.+data SrcPath+ = SrcExternal FilePath+ | SrcLocal++-- | Mapping from modules to cross-package source paths.+type SrcMaps = (Map GHC.Module SrcPath, Map GHC.ModuleName SrcPath)+
@@ -0,0 +1,144 @@+{-# LANGUAGE OverloadedStrings #-}+module Haddock.Backends.Hyperlinker.Utils+ ( hypSrcDir, hypSrcModuleFile, hypSrcModuleFile'+ , hypSrcModuleUrl, hypSrcModuleUrl'+ , hypSrcNameUrl+ , hypSrcLineUrl+ , hypSrcModuleNameUrl, hypSrcModuleLineUrl+ , hypSrcModuleUrlFormat+ , hypSrcModuleNameUrlFormat, hypSrcModuleLineUrlFormat+ , spliceURL, spliceURL'++ -- * HIE file processing+ , PrintedType+ , recoverFullIfaceTypes+ ) where++import Haddock.Utils+import Haddock.Backends.Xhtml.Utils++import GHC+import GHC.Iface.Ext.Types ( HieAST(..), HieType(..), HieArgs(..), TypeIndex, HieTypeFlat )+import GHC.Iface.Type+import GHC.Types.Name ( getOccFS, getOccString )+import GHC.Driver.Ppr ( showSDoc )+import GHC.Types.Var ( VarBndr(..), visArg, invisArg, TypeOrConstraint(..) )++import System.FilePath.Posix ((</>), (<.>))++import qualified Data.Array as A+++{-# INLINE hypSrcDir #-}+hypSrcDir :: FilePath+hypSrcDir = "src"++{-# INLINE hypSrcModuleFile #-}+hypSrcModuleFile :: Module -> FilePath+hypSrcModuleFile m = moduleNameString (moduleName m) <.> "html"++hypSrcModuleFile' :: ModuleName -> FilePath+hypSrcModuleFile' mdl = spliceURL'+ Nothing (Just mdl) Nothing Nothing moduleFormat++hypSrcModuleUrl :: Module -> String+hypSrcModuleUrl = hypSrcModuleFile++hypSrcModuleUrl' :: ModuleName -> String+hypSrcModuleUrl' = hypSrcModuleFile'++{-# INLINE hypSrcNameUrl #-}+hypSrcNameUrl :: Name -> String+hypSrcNameUrl = escapeStr . getOccString++{-# INLINE hypSrcLineUrl #-}+hypSrcLineUrl :: Int -> String+hypSrcLineUrl line = "line-" ++ show line++{-# INLINE hypSrcModuleNameUrl #-}+hypSrcModuleNameUrl :: Module -> Name -> String+hypSrcModuleNameUrl mdl name = hypSrcModuleUrl mdl ++ "#" ++ hypSrcNameUrl name++{-# INLINE hypSrcModuleLineUrl #-}+hypSrcModuleLineUrl :: Module -> Int -> String+hypSrcModuleLineUrl mdl line = hypSrcModuleUrl mdl ++ "#" ++ hypSrcLineUrl line++hypSrcModuleUrlFormat :: String+hypSrcModuleUrlFormat = hypSrcDir </> moduleFormat++hypSrcModuleNameUrlFormat :: String+hypSrcModuleNameUrlFormat = hypSrcModuleUrlFormat ++ "#" ++ nameFormat++hypSrcModuleLineUrlFormat :: String+hypSrcModuleLineUrlFormat = hypSrcModuleUrlFormat ++ "#" ++ lineFormat++moduleFormat :: String+moduleFormat = "%{MODULE}.html"++nameFormat :: String+nameFormat = "%{NAME}"++lineFormat :: String+lineFormat = "line-%{LINE}"+++-- * HIE file processing++-- This belongs in GHC.Iface.Ext.Utils...++-- | Pretty-printed type, ready to be turned into HTML by @xhtml@+type PrintedType = String++-- | Expand the flattened HIE AST into one where the types printed out and+-- ready for end-users to look at.+--+-- Using just primitives found in GHC's HIE utilities, we could write this as+-- follows:+--+-- > 'recoverFullIfaceTypes' dflags hieTypes hieAst+-- > = 'fmap' (\ti -> 'showSDoc' df .+-- > 'pprIfaceType' $+-- > 'recoverFullType' ti hieTypes)+-- > hieAst+--+-- However, this is very inefficient (both in time and space) because the+-- multiple calls to 'recoverFullType' don't share intermediate results. This+-- function fixes that.+recoverFullIfaceTypes+ :: DynFlags+ -> A.Array TypeIndex HieTypeFlat -- ^ flat types+ -> HieAST TypeIndex -- ^ flattened AST+ -> HieAST PrintedType -- ^ full AST+recoverFullIfaceTypes df flattened ast = fmap (printed A.!) ast+ where++ -- Splitting this out into its own array is also important: we don't want+ -- to pretty print the same type many times+ printed :: A.Array TypeIndex PrintedType+ printed = fmap (showSDoc df . pprIfaceType) unflattened++ -- The recursion in 'unflattened' is crucial - it's what gives us sharing+ -- between the IfaceType's produced+ unflattened :: A.Array TypeIndex IfaceType+ unflattened = fmap (\flatTy -> go (fmap (unflattened A.!) flatTy)) flattened++ -- Unfold an 'HieType' whose subterms have already been unfolded+ go :: HieType IfaceType -> IfaceType+ go (HTyVarTy n) = IfaceTyVar (getOccFS n)+ go (HAppTy a b) = IfaceAppTy a (hieToIfaceArgs b)+ go (HLitTy l) = IfaceLitTy l+ go (HForAllTy ((n,k),af) t) = let b = (getOccFS n, k)+ in IfaceForAllTy (Bndr (IfaceTvBndr b) af) t+ go (HFunTy w a b) = IfaceFunTy (visArg TypeLike) w a b -- t1 -> t2+ go (HQualTy con b) = IfaceFunTy (invisArg TypeLike) many_ty con b -- c => t+ go (HCastTy a) = a+ go HCoercionTy = IfaceTyVar "<coercion type>"+ go (HTyConApp a xs) = IfaceTyConApp a (hieToIfaceArgs xs)++ -- This isn't fully faithful - we can't produce the 'Inferred' case+ hieToIfaceArgs :: HieArgs IfaceType -> IfaceAppArgs+ hieToIfaceArgs (HieArgs args) = go' args+ where+ go' [] = IA_Nil+ go' ((True ,x):xs) = IA_Arg x Required $ go' xs+ go' ((False,x):xs) = IA_Arg x Specified $ go' xs
@@ -0,0 +1,1464 @@+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeFamilies #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.LaTeX+-- Copyright : (c) Simon Marlow 2010,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.LaTeX (+ ppLaTeX,+) where++import Documentation.Haddock.Markup+import Haddock.Doc (combineDocumentation)+import Haddock.Types+import Haddock.Utils+import Haddock.GhcUtils+import GHC.Utils.Ppr hiding (Doc, quote)+import qualified GHC.Utils.Ppr as Pretty++import GHC hiding (fromMaybeContext )+import GHC.Types.Name.Occurrence+import GHC.Types.Name ( nameOccName )+import GHC.Types.Name.Reader ( rdrNameOcc )+import GHC.Core.Type ( Specificity(..) )+import GHC.Data.FastString ( unpackFS )++import qualified Data.Map as Map+import System.Directory+import System.FilePath+import Data.Char+import Control.Monad+import Data.Maybe+import Data.List ( sort )+import Data.List.NonEmpty ( NonEmpty (..) )+import Data.Foldable ( toList )+import Prelude hiding ((<>))++{- SAMPLE OUTPUT++\haddockmoduleheading{\texttt{Data.List}}+\hrulefill+{\haddockverb\begin{verbatim}+module Data.List (+ (++), head, last, tail, init, null, length, map, reverse,+ ) where\end{verbatim}}+\hrulefill++\section{Basic functions}+\begin{haddockdesc}+\item[\begin{tabular}{@{}l}+head\ ::\ {\char 91}a{\char 93}\ ->\ a+\end{tabular}]\haddockbegindoc+Extract the first element of a list, which must be non-empty.+\par++\end{haddockdesc}+\begin{haddockdesc}+\item[\begin{tabular}{@{}l}+last\ ::\ {\char 91}a{\char 93}\ ->\ a+\end{tabular}]\haddockbegindoc+Extract the last element of a list, which must be finite and non-empty.+\par++\end{haddockdesc}+-}+++{- TODO+ * don't forget fixity!!+-}++ppLaTeX :: String -- Title+ -> Maybe String -- Package name+ -> [Interface]+ -> FilePath -- destination directory+ -> Maybe (Doc GHC.RdrName) -- prologue text, maybe+ -> Maybe String -- style file+ -> FilePath+ -> IO ()++ppLaTeX title packageStr visible_ifaces odir prologue maybe_style libdir+ = do+ createDirectoryIfMissing True odir+ when (isNothing maybe_style) $+ copyFile (libdir </> "latex" </> haddockSty) (odir </> haddockSty)+ ppLaTeXTop title packageStr odir prologue maybe_style visible_ifaces+ mapM_ (ppLaTeXModule title odir) visible_ifaces+++haddockSty :: FilePath+haddockSty = "haddock.sty"+++type LaTeX = Pretty.Doc++-- | Default way of rendering a 'LaTeX'. The width is 90 by default (since 100+-- often overflows the line).+latex2String :: LaTeX -> String+latex2String = fullRender (PageMode True) 90 1 txtPrinter ""++ppLaTeXTop+ :: String+ -> Maybe String+ -> FilePath+ -> Maybe (Doc GHC.RdrName)+ -> Maybe String+ -> [Interface]+ -> IO ()++ppLaTeXTop doctitle packageStr odir prologue maybe_style ifaces = do++ let tex = vcat [+ text "\\documentclass{book}",+ text "\\usepackage" <> braces (maybe (text "haddock") text maybe_style),+ text "\\begin{document}",+ text "\\begin{titlepage}",+ text "\\begin{haddocktitle}",+ text doctitle,+ text "\\end{haddocktitle}",+ case prologue of+ Nothing -> empty+ Just d -> vcat [text "\\begin{haddockprologue}",+ rdrDocToLaTeX d,+ text "\\end{haddockprologue}"],+ text "\\end{titlepage}",+ text "\\tableofcontents",+ vcat [ text "\\input" <> braces (text mdl) | mdl <- mods ],+ text "\\end{document}"+ ]++ mods = sort (map (moduleBasename.ifaceMod) ifaces)++ filename = odir </> (fromMaybe "haddock" packageStr <.> "tex")++ writeUtf8File filename (show tex)+++ppLaTeXModule :: String -> FilePath -> Interface -> IO ()+ppLaTeXModule _title odir iface = do+ createDirectoryIfMissing True odir+ let+ mdl = ifaceMod iface+ mdl_str = moduleString mdl++ exports = ifaceRnExportItems iface++ tex = vcat [+ text "\\haddockmoduleheading" <> braces (text mdl_str),+ text "\\label{module:" <> text mdl_str <> char '}',+ text "\\haddockbeginheader",+ verb $ vcat [+ text "module" <+> text mdl_str <+> lparen,+ text " " <> fsep (punctuate (char ',') $+ map exportListItem $+ filter forSummary exports),+ text " ) where"+ ],+ text "\\haddockendheader" $$ text "",+ description,+ body+ ]++ description+ = (fromMaybe empty . documentationToLaTeX . ifaceRnDoc) iface++ body = processExports exports+ --+ writeUtf8File (odir </> moduleLaTeXFile mdl) (fullRender (PageMode True) 80 1 txtPrinter "" tex)++-- | Prints out an entry in a module export list.+exportListItem :: ExportItem DocNameI -> LaTeX+exportListItem+ ( ExportDecl+ ( RnExportD+ { rnExpDExpD =+ ( ExportD+ { expDDecl = decl+ , expDSubDocs = subdocs+ }+ )+ }+ )+ )+ = let (leader, names) = declNames decl+ in sep (punctuate comma [ leader <+> ppDocBinder name | name <- names ]) <>+ case subdocs of+ [] -> empty+ _ -> parens (sep (punctuate comma (map (ppDocBinder . fst) subdocs)))+exportListItem (ExportNoDecl y [])+ = ppDocBinder y+exportListItem (ExportNoDecl y subs)+ = ppDocBinder y <> parens (sep (punctuate comma (map ppDocBinder subs)))+exportListItem (ExportModule mdl)+ = text "module" <+> text (moduleString mdl)+exportListItem _+ = error "exportListItem"+++-- Deal with a group of undocumented exports together, to avoid lots+-- of blank vertical space between them.+processExports :: [ExportItem DocNameI] -> LaTeX+processExports [] = empty+processExports (decl : es)+ | Just sig <- isSimpleSig decl+ = multiDecl [ ppTypeSig (map getName names) typ False+ | (names,typ) <- sig:sigs ] $$+ processExports es'+ where (sigs, es') = spanWith isSimpleSig es+processExports (ExportModule mdl : es)+ = declWithDoc (vcat [ text "module" <+> text (moduleString m) | m <- mdl:mdls ]) Nothing $$+ processExports es'+ where (mdls, es') = spanWith isExportModule es+processExports (e : es) =+ processExport e $$ processExports es+++isSimpleSig :: ExportItem DocNameI -> Maybe ([DocName], HsSigType DocNameI)+isSimpleSig+ ( ExportDecl+ ( RnExportD+ { rnExpDExpD =+ ExportD+ { expDDecl = L _ (SigD _ (TypeSig _ lnames t))+ , expDMbDoc = (Documentation Nothing Nothing, argDocs)+ }+ }+ )+ )+ | Map.null argDocs = Just (map unLoc lnames, unLoc (dropWildCards t))+isSimpleSig _ = Nothing+++isExportModule :: ExportItem DocNameI -> Maybe Module+isExportModule (ExportModule m) = Just m+isExportModule _ = Nothing+++processExport :: ExportItem DocNameI -> LaTeX+processExport (ExportGroup lev _id0 doc)+ = ppDocGroup lev (docToLaTeX doc)+processExport (ExportDecl (RnExportD (ExportD decl pats doc subdocs insts fixities _splice) _))+ = ppDecl decl pats doc insts subdocs fixities+processExport (ExportNoDecl y [])+ = ppDocName y+processExport (ExportNoDecl y subs)+ = ppDocName y <> parens (sep (punctuate comma (map ppDocName subs)))+processExport (ExportModule mdl)+ = declWithDoc (text "module" <+> text (moduleString mdl)) Nothing+processExport (ExportDoc doc)+ = docToLaTeX $ _doc doc+++ppDocGroup :: Int -> LaTeX -> LaTeX+ppDocGroup lev doc = sec lev <> braces doc+ where sec 1 = text "\\section"+ sec 2 = text "\\subsection"+ sec 3 = text "\\subsubsection"+ sec _ = text "\\paragraph"+++-- | Given a declaration, extract out the names being declared+declNames :: LHsDecl DocNameI+ -> ( LaTeX -- to print before each name in an export list+ , [DocName] -- names being declared+ )+declNames (L _ decl) = case decl of+ TyClD _ d -> (empty, [tcdNameI d])+ SigD _ (TypeSig _ lnames _ ) -> (empty, map unLoc lnames)+ SigD _ (PatSynSig _ lnames _) -> (text "pattern", map unLoc lnames)+ ForD _ (ForeignImport _ (L _ n) _ _) -> (empty, [n])+ ForD _ (ForeignExport _ (L _ n) _ _) -> (empty, [n])+ _ -> error "declaration not supported by declNames"+++forSummary :: (ExportItem DocNameI) -> Bool+forSummary (ExportGroup _ _ _) = False+forSummary (ExportDoc _) = False+forSummary _ = True+++moduleLaTeXFile :: Module -> FilePath+moduleLaTeXFile mdl = moduleBasename mdl ++ ".tex"+++moduleBasename :: Module -> FilePath+moduleBasename mdl = map (\c -> if c == '.' then '-' else c)+ (moduleNameString (moduleName mdl))+++-------------------------------------------------------------------------------+-- * Decls+-------------------------------------------------------------------------------++-- | Pretty print a declaration+ppDecl :: LHsDecl DocNameI -- ^ decl to print+ -> [(HsDecl DocNameI, DocForDecl DocName)] -- ^ all pattern decls+ -> DocForDecl DocName -- ^ documentation for decl+ -> [DocInstance DocNameI] -- ^ all instances+ -> [(DocName, DocForDecl DocName)] -- ^ all subdocs+ -> [(DocName, Fixity)] -- ^ all fixities+ -> LaTeX++ppDecl decl pats (doc, fnArgsDoc) instances subdocs _fxts = case unLoc decl of+ TyClD _ d@FamDecl {} -> ppFamDecl False doc instances d unicode+ TyClD _ d@DataDecl {} -> ppDataDecl pats instances subdocs (Just doc) d unicode+ TyClD _ d@SynDecl {} -> ppTySyn (doc, fnArgsDoc) d unicode+ TyClD _ d@ClassDecl{} -> ppClassDecl instances doc subdocs d unicode+ SigD _ (TypeSig _ lnames ty) -> ppFunSig Nothing (doc, fnArgsDoc) (map unLoc lnames) (dropWildCards ty) unicode+ SigD _ (PatSynSig _ lnames ty) -> ppLPatSig (doc, fnArgsDoc) (map unLoc lnames) ty unicode+ ForD _ d -> ppFor (doc, fnArgsDoc) d unicode+ InstD _ _ -> empty+ DerivD _ _ -> empty+ _ -> error "declaration not supported by ppDecl"+ where+ unicode = False+++ppFor :: DocForDecl DocName -> ForeignDecl DocNameI -> Bool -> LaTeX+ppFor doc (ForeignImport _ (L _ name) typ _) unicode =+ ppFunSig Nothing doc [name] typ unicode+ppFor _ _ _ = error "ppFor error in Haddock.Backends.LaTeX"+-- error "foreign declarations are currently not supported by --latex"+++-------------------------------------------------------------------------------+-- * Type families+-------------------------------------------------------------------------------++-- | Pretty-print a data\/type family declaration+ppFamDecl :: Bool -- ^ is the family associated?+ -> Documentation DocName -- ^ this decl's docs+ -> [DocInstance DocNameI] -- ^ relevant instances+ -> TyClDecl DocNameI -- ^ family to print+ -> Bool -- ^ unicode+ -> LaTeX+ppFamDecl associated doc instances decl unicode =+ declWithDoc (ppFamHeader (tcdFam decl) unicode associated <+> whereBit)+ (if null body then Nothing else Just (vcat body))+ $$ instancesBit+ where+ body = catMaybes [familyEqns, documentationToLaTeX doc]++ whereBit = case fdInfo (tcdFam decl) of+ ClosedTypeFamily _ -> keyword "where"+ _ -> empty++ familyEqns+ | FamilyDecl { fdInfo = ClosedTypeFamily (Just eqns) } <- tcdFam decl+ , not (null eqns)+ = Just (text "\\haddockbeginargs" $$+ vcat [ decltt (ppFamDeclEqn eqn) <+> nl | L _ eqn <- eqns ] $$+ text "\\end{tabulary}\\par")+ | otherwise = Nothing++ -- Individual equations of a closed type family+ ppFamDeclEqn :: TyFamInstEqn DocNameI -> LaTeX+ ppFamDeclEqn (FamEqn { feqn_tycon = L _ n+ , feqn_rhs = rhs+ , feqn_pats = ts })+ = hsep [ ppAppNameTypeArgs n ts unicode+ , equals+ , ppType unicode (unLoc rhs)+ ]++ instancesBit = ppDocInstances unicode instances++-- | Print the LHS of a type\/data family declaration.+ppFamHeader :: FamilyDecl DocNameI -- ^ family header to print+ -> Bool -- ^ unicode+ -> Bool -- ^ is the family associated?+ -> LaTeX+ppFamHeader (FamilyDecl { fdLName = L _ name+ , fdTyVars = tvs+ , fdInfo = info+ , fdResultSig = L _ result+ , fdInjectivityAnn = injectivity })+ unicode associated =+ famly leader <+> famName <+> famSig <+> injAnn+ where+ leader = case info of+ OpenTypeFamily -> keyword "type"+ ClosedTypeFamily _ -> keyword "type"+ DataFamily -> keyword "data"++ famly | associated = id+ | otherwise = (<+> keyword "family")++ famName = ppAppDocNameTyVarBndrs unicode name (hsq_explicit tvs)++ famSig = case result of+ NoSig _ -> empty+ KindSig _ kind -> dcolon unicode <+> ppLKind unicode kind+ TyVarSig _ (L _ bndr) -> equals <+> ppHsTyVarBndr unicode bndr++ injAnn = case injectivity of+ Nothing -> empty+ Just (L _ (InjectivityAnn _ lhs rhs)) -> hsep ( decltt (text "|")+ : ppLDocName lhs+ : arrow unicode+ : map ppLDocName rhs)+ Just _ -> empty++++-------------------------------------------------------------------------------+-- * Type Synonyms+-------------------------------------------------------------------------------+++-- we skip type patterns for now+ppTySyn :: DocForDecl DocName -> TyClDecl DocNameI -> Bool -> LaTeX++ppTySyn doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars+ , tcdRhs = ltype }) unicode+ = ppTypeOrFunSig (mkHsImplicitSigTypeI ltype) doc (full, hdr, char '=') unicode+ where+ hdr = hsep (keyword "type"+ : ppDocBinder name+ : map ppSymName (tyvarNames ltyvars))+ full = hdr <+> char '=' <+> ppLType unicode ltype++ppTySyn _ _ _ = error "declaration not supported by ppTySyn"+++-------------------------------------------------------------------------------+-- * Function signatures+-------------------------------------------------------------------------------+++ppFunSig+ :: Maybe LaTeX -- ^ a prefix to put right before the signature+ -> DocForDecl DocName -- ^ documentation+ -> [DocName] -- ^ pattern names in the pattern signature+ -> LHsSigType DocNameI -- ^ type of the pattern synonym+ -> Bool -- ^ unicode+ -> LaTeX+ppFunSig leader doc docnames (L _ typ) unicode =+ ppTypeOrFunSig typ doc+ ( lead $ ppTypeSig names typ False+ , lead $ hsep . punctuate comma $ map ppSymName names+ , dcolon unicode+ )+ unicode+ where+ names = map getName docnames+ lead = maybe id (<+>) leader++-- | Pretty-print a pattern synonym+ppLPatSig :: DocForDecl DocName -- ^ documentation+ -> [DocName] -- ^ pattern names in the pattern signature+ -> LHsSigType DocNameI -- ^ type of the pattern synonym+ -> Bool -- ^ unicode+ -> LaTeX+ppLPatSig doc docnames ty unicode+ = ppFunSig (Just (keyword "pattern")) doc docnames ty unicode++-- | Pretty-print a type, adding documentation to the whole type and its+-- arguments as needed.+ppTypeOrFunSig :: HsSigType DocNameI+ -> DocForDecl DocName -- ^ documentation+ -> ( LaTeX -- first-line (no-argument docs only)+ , LaTeX -- first-line (argument docs only)+ , LaTeX -- type prefix (argument docs only)+ )+ -> Bool -- ^ unicode+ -> LaTeX+ppTypeOrFunSig typ (doc, argDocs) (pref1, pref2, sep0) unicode+ | Map.null argDocs = declWithDoc pref1 (documentationToLaTeX doc)+ | otherwise = declWithDoc pref2 $ Just $+ text "\\haddockbeginargs" $$+ vcat (map (uncurry (<->)) (ppSubSigLike unicode typ argDocs [] sep0)) $$+ text "\\end{tabulary}\\par" $$+ fromMaybe empty (documentationToLaTeX doc)++-- | This splits up a type signature along @->@ and adds docs (when they exist)+-- to the arguments. The output is a list of (leader/seperator, argument and+-- its doc)+ppSubSigLike :: Bool -- ^ unicode+ -> HsSigType DocNameI -- ^ type signature+ -> FnArgsDoc DocName -- ^ docs to add+ -> [(DocName, DocForDecl DocName)] -- ^ all subdocs (useful when we have `HsRecTy`)+ -> LaTeX -- ^ seperator (beginning of first line)+ -> [(LaTeX, LaTeX)] -- ^ arguments (leader/sep, type)+ppSubSigLike unicode typ argDocs subdocs leader = do_sig_args 0 leader typ+ where+ do_sig_args :: Int -> LaTeX -> HsSigType DocNameI -> [(LaTeX, LaTeX)]+ do_sig_args n leader (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) =+ case outer_bndrs of+ HsOuterExplicit{hso_bndrs = bndrs} ->+ [ ( decltt leader+ , decltt (ppHsForAllTelescope (mkHsForAllInvisTeleI bndrs) unicode)+ <+> ppLType unicode ltype+ ) ]+ HsOuterImplicit{} -> do_largs n leader ltype++ do_largs :: Int -> LaTeX -> LHsType DocNameI -> [(LaTeX, LaTeX)]+ do_largs n leader (L _ t) = do_args n leader t++ arg_doc n = rDoc . fmap _doc $ Map.lookup n argDocs++ do_args :: Int -> LaTeX -> HsType DocNameI -> [(LaTeX, LaTeX)]+ do_args _n leader (HsForAllTy _ tele ltype)+ = [ ( decltt leader+ , decltt (ppHsForAllTelescope tele unicode)+ <+> ppLType unicode ltype+ ) ]+ do_args n leader (HsQualTy _ lctxt ltype)+ = ( decltt leader+ , decltt (ppLContextNoArrow lctxt unicode) <+> nl+ ) : do_largs n (darrow unicode) ltype++ do_args n leader (HsFunTy _ _w (L _ (HsRecTy _ fields)) r)+ = [ (decltt ldr, latex <+> nl)+ | (L _ field, ldr) <- zip fields (leader <+> gadtOpen : repeat gadtComma)+ , let latex = ppSideBySideField subdocs unicode field+ ]+ ++ do_largs (n+1) (gadtEnd <+> arrow unicode) r+ do_args n leader (HsFunTy _ _w lt r)+ = (decltt leader, decltt (ppLFunLhType unicode lt) <-> arg_doc n <+> nl)+ : do_largs (n+1) (arrow unicode) r+ do_args n leader t+ = [ (decltt leader, decltt (ppType unicode t) <-> arg_doc n <+> nl) ]++ -- FIXME: this should be done more elegantly+ --+ -- We need 'gadtComma' and 'gadtEnd' to line up with the `{` from+ -- 'gadtOpen', so we add 3 spaces to cover for `-> `/`:: ` (3 in unicode+ -- mode since `->` and `::` are rendered as single characters.+ gadtComma = hcat (replicate (if unicode then 3 else 4) (char ' ')) <> char ','+ gadtEnd = hcat (replicate (if unicode then 3 else 4) (char ' ')) <> char '}'+ gadtOpen = char '{'+++ppTypeSig :: [Name] -> HsSigType DocNameI -> Bool -> LaTeX+ppTypeSig nms ty unicode =+ hsep (punctuate comma $ map ppSymName nms)+ <+> dcolon unicode+ <+> ppSigType unicode ty++ppHsOuterTyVarBndrs :: HsOuterTyVarBndrs flag DocNameI -> Bool -> LaTeX+ppHsOuterTyVarBndrs (HsOuterImplicit{}) _ = empty+ppHsOuterTyVarBndrs (HsOuterExplicit{hso_bndrs = bndrs}) unicode =+ hsep (forallSymbol unicode : ppTyVars bndrs) <> dot++ppHsForAllTelescope :: HsForAllTelescope DocNameI -> Bool -> LaTeX+ppHsForAllTelescope tele unicode = case tele of+ HsForAllVis { hsf_vis_bndrs = bndrs } ->+ hsep (forallSymbol unicode : ppTyVars bndrs) <> text "\\" <> arrow unicode+ HsForAllInvis { hsf_invis_bndrs = bndrs } ->+ hsep (forallSymbol unicode : ppTyVars bndrs) <> dot+++ppTyVars :: [LHsTyVarBndr flag DocNameI] -> [LaTeX]+ppTyVars = map (ppSymName . getName . hsLTyVarNameI)+++tyvarNames :: LHsQTyVars DocNameI -> [Name]+tyvarNames = map (getName . hsLTyVarNameI) . hsQTvExplicit+++declWithDoc :: LaTeX -> Maybe LaTeX -> LaTeX+declWithDoc decl doc =+ text "\\begin{haddockdesc}" $$+ text "\\item[\\begin{tabular}{@{}l}" $$+ text (latexMonoFilter (latex2String decl)) $$+ text "\\end{tabular}]" $$+ maybe empty (\x -> text "{\\haddockbegindoc" $$ x <> text "}") doc $$+ text "\\end{haddockdesc}"+++-- in a group of decls, we don't put them all in the same tabular,+-- because that would prevent the group being broken over a page+-- boundary (breaks Foreign.C.Error for example).+multiDecl :: [LaTeX] -> LaTeX+multiDecl decls =+ text "\\begin{haddockdesc}" $$+ vcat [+ text "\\item[\\begin{tabular}{@{}l}" $$+ text (latexMonoFilter (latex2String decl)) $$+ text "\\end{tabular}]"+ | decl <- decls ] $$+ text "\\end{haddockdesc}"+++-------------------------------------------------------------------------------+-- * Rendering Doc+-------------------------------------------------------------------------------+++maybeDoc :: Maybe (Doc DocName) -> LaTeX+maybeDoc = maybe empty docToLaTeX+++-- for table cells, we strip paragraphs out to avoid extra vertical space+-- and don't add a quote environment.+rDoc :: Maybe (Doc DocName) -> LaTeX+rDoc = maybeDoc . fmap latexStripTrailingWhitespace+++-------------------------------------------------------------------------------+-- * Class declarations+-------------------------------------------------------------------------------+++ppClassHdr :: Bool -> Maybe (LocatedC [LHsType DocNameI]) -> DocName+ -> LHsQTyVars DocNameI -> [LHsFunDep DocNameI]+ -> Bool -> LaTeX+ppClassHdr summ lctxt n tvs fds unicode =+ keyword "class"+ <+> (if not (null $ fromMaybeContext lctxt) then ppLContext lctxt unicode else empty)+ <+> ppAppDocNameNames summ n (tyvarNames tvs)+ <+> ppFds fds unicode++-- ppFds :: [Located ([LocatedA DocName], [LocatedA DocName])] -> Bool -> LaTeX+ppFds :: [LHsFunDep DocNameI] -> Bool -> LaTeX+ppFds fds unicode =+ if null fds then empty else+ char '|' <+> hsep (punctuate comma (map (fundep . unLoc) fds))+ where+ fundep (FunDep _ vars1 vars2)+ = hsep (map (ppDocName . unLoc) vars1) <+> arrow unicode <+>+ hsep (map (ppDocName . unLoc) vars2)+ fundep (XFunDep _) = error "ppFds"+++-- TODO: associated type defaults, docs on default methods+ppClassDecl :: [DocInstance DocNameI]+ -> Documentation DocName -> [(DocName, DocForDecl DocName)]+ -> TyClDecl DocNameI -> Bool -> LaTeX+ppClassDecl instances doc subdocs+ (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, tcdTyVars = ltyvars, tcdFDs = lfds+ , tcdSigs = lsigs, tcdATs = ats, tcdATDefs = at_defs }) unicode+ = declWithDoc classheader (if null body then Nothing else Just (vcat body)) $$+ instancesBit+ where+ classheader+ | null lsigs = hdr unicode+ | otherwise = hdr unicode <+> keyword "where"++ hdr = ppClassHdr False lctxt (unLoc lname) ltyvars lfds++ body = catMaybes [documentationToLaTeX doc, body_]++ body_+ | null lsigs, null ats, null at_defs = Nothing+ | null ats, null at_defs = Just methodTable+ | otherwise = Just (atTable $$ methodTable)++ atTable =+ text "\\haddockpremethods{}" <> emph (text "Associated Types") $$+ vcat [ ppFamDecl True (fst doc) [] (FamDecl noExtField decl) True+ | L _ decl <- ats+ , let name = unLoc . fdLName $ decl+ doc = lookupAnySubdoc name subdocs+ ]+++ methodTable =+ text "\\haddockpremethods{}" <> emph (text "Methods") $$+ vcat [ ppFunSig leader doc names typ unicode+ | L _ (ClassOpSig _ is_def lnames typ) <- lsigs+ , let doc | is_def = noDocForDecl+ | otherwise = lookupAnySubdoc (head names) subdocs+ names = map unLoc lnames+ leader = if is_def then Just (keyword "default") else Nothing+ ]+ -- N.B. taking just the first name is ok. Signatures with multiple+ -- names are expanded so that each name gets its own signature.++ instancesBit = ppDocInstances unicode instances++ppClassDecl _ _ _ _ _ = error "declaration type not supported by ppShortClassDecl"++ppDocInstances :: Bool -> [DocInstance DocNameI] -> LaTeX+ppDocInstances _unicode [] = empty+ppDocInstances unicode (i : rest)+ | Just ihead <- isUndocdInstance i+ = declWithDoc (vcat (map (ppInstDecl unicode) (ihead:is))) Nothing $$+ ppDocInstances unicode rest'+ | otherwise+ = ppDocInstance unicode i $$ ppDocInstances unicode rest+ where+ (is, rest') = spanWith isUndocdInstance rest++isUndocdInstance :: DocInstance a -> Maybe (InstHead a)+isUndocdInstance (i,Nothing,_,_) = Just i+isUndocdInstance (i,Just (MetaDoc _ DocEmpty),_,_) = Just i+isUndocdInstance _ = Nothing++-- | Print a possibly commented instance. The instance header is printed inside+-- an 'argBox'. The comment is printed to the right of the box in normal comment+-- style.+ppDocInstance :: Bool -> DocInstance DocNameI -> LaTeX+ppDocInstance unicode (instHead, doc, _, _) =+ declWithDoc (ppInstDecl unicode instHead) (fmap docToLaTeX $ fmap _doc doc)+++ppInstDecl :: Bool -> InstHead DocNameI -> LaTeX+ppInstDecl unicode (InstHead {..}) = case ihdInstType of+ ClassInst ctx _ _ _ -> keyword "instance" <+> ppContextNoLocs ctx unicode <+> typ+ TypeInst rhs -> keyword "type" <+> keyword "instance" <+> typ <+> tibody rhs+ DataInst dd ->+ let cons = dd_cons (tcdDataDefn dd)+ pref = case cons of { NewTypeCon _ -> keyword "newtype"; DataTypeCons _ _ -> keyword "data" }+ in pref <+> keyword "instance" <+> typ+ where+ typ = ppAppNameTypes ihdClsName ihdTypes unicode+ tibody = maybe empty (\t -> equals <+> ppType unicode t)++lookupAnySubdoc :: (Eq name1) =>+ name1 -> [(name1, DocForDecl name2)] -> DocForDecl name2+lookupAnySubdoc n subdocs = case lookup n subdocs of+ Nothing -> noDocForDecl+ Just docs -> docs+++-------------------------------------------------------------------------------+-- * Data & newtype declarations+-------------------------------------------------------------------------------++-- | Pretty-print a data declaration+ppDataDecl :: [(HsDecl DocNameI, DocForDecl DocName)] -- ^ relevant patterns+ -> [DocInstance DocNameI] -- ^ relevant instances+ -> [(DocName, DocForDecl DocName)] -- ^ relevant decl docs+ -> Maybe (Documentation DocName) -- ^ this decl's docs+ -> TyClDecl DocNameI -- ^ data decl to print+ -> Bool -- ^ unicode+ -> LaTeX+ppDataDecl pats instances subdocs doc dataDecl unicode =+ declWithDoc (ppDataHeader dataDecl unicode <+> whereBit)+ (if null body then Nothing else Just (vcat body))+ $$ instancesBit++ where+ cons = dd_cons (tcdDataDefn dataDecl)++ body = catMaybes [doc >>= documentationToLaTeX, constrBit,patternBit]++ (whereBit, leaders)+ | null cons+ , null pats = (empty,[])+ | null cons = (text "where", repeat empty)+ | otherwise = case toList cons of+ L _ ConDeclGADT{} : _ -> (text "where", repeat empty)+ _ -> (empty, (decltt (text "=") : repeat (decltt (text "|"))))++ constrBit+ | null cons = Nothing+ | otherwise = Just $+ text "\\enspace" <+> emph (text "Constructors") <> text "\\par" $$+ text "\\haddockbeginconstrs" $$+ vcat (zipWith (ppSideBySideConstr subdocs unicode) leaders (toList cons)) $$+ text "\\end{tabulary}\\par"++ patternBit+ | null pats = Nothing+ | otherwise = Just $+ text "\\enspace" <+> emph (text "Bundled Patterns") <> text "\\par" $$+ text "\\haddockbeginconstrs" $$+ vcat [ empty <-> ppSideBySidePat lnames typ d unicode+ | (SigD _ (PatSynSig _ lnames typ), d) <- pats+ ] $$+ text "\\end{tabulary}\\par"++ instancesBit = ppDocInstances unicode instances+++-- ppConstrHdr is for (non-GADT) existentials constructors' syntax+ppConstrHdr+ :: Bool -- ^ print explicit foralls+ -> [LHsTyVarBndr Specificity DocNameI] -- ^ type variables+ -> HsContext DocNameI -- ^ context+ -> Bool -- ^ unicode+ -> LaTeX+ppConstrHdr forall_ tvs ctxt unicode = ppForall <> ppCtxt+ where+ ppForall+ | null tvs || not forall_ = empty+ | otherwise = ppHsForAllTelescope (mkHsForAllInvisTeleI tvs) unicode++ ppCtxt+ | null ctxt = empty+ | otherwise = ppContextNoArrow ctxt unicode <+> darrow unicode <> space+++-- | Pretty-print a constructor+ppSideBySideConstr :: [(DocName, DocForDecl DocName)] -- ^ all decl docs+ -> Bool -- ^ unicode+ -> LaTeX -- ^ prefix to decl+ -> LConDecl DocNameI -- ^ constructor decl+ -> LaTeX+ppSideBySideConstr subdocs unicode leader (L _ con) =+ leader <-> decltt decl <-> rDoc mbDoc <+> nl+ $$ fieldPart+ where+ -- Find the name of a constructors in the decl (`getConName` always returns+ -- a non-empty list)+ L _ aConName :| _ = getConNamesI con++ occ = toList $ nameOccName . getName . unLoc <$> getConNamesI con++ ppOcc = cat (punctuate comma (map ppBinder occ))+ ppOccInfix = cat (punctuate comma (map ppBinderInfix occ))++ -- Extract out the map of of docs corresponding to the constructors arguments+ argDocs = maybe Map.empty snd (lookup aConName subdocs)+ hasArgDocs = not $ Map.null argDocs++ -- First line of the constructor (no doc, no fields, single-line)+ decl = case con of+ ConDeclH98{ con_args = det+ , con_ex_tvs = tyVars+ , con_forall = forall_+ , con_mb_cxt = cxt+ } -> let context = fromMaybeContext cxt+ header_ = ppConstrHdr forall_ tyVars context unicode+ in case det of+ -- Prefix constructor, e.g. 'Just a'+ PrefixCon _ args+ | hasArgDocs -> header_ <+> ppOcc+ | otherwise -> hsep [ header_+ , ppOcc+ , hsep (map (ppLParendType unicode . hsScaledThing) args)+ ]++ -- Record constructor, e.g. 'Identity { runIdentity :: a }'+ RecCon _ -> header_ <+> ppOcc++ -- Infix constructor, e.g. 'a :| [a]'+ InfixCon arg1 arg2+ | hasArgDocs -> header_ <+> ppOcc+ | otherwise -> hsep [ header_+ , ppLParendType unicode (hsScaledThing arg1)+ , ppOccInfix+ , ppLParendType unicode (hsScaledThing arg2)+ ]++ ConDeclGADT{}+ | hasArgDocs || not (isEmpty fieldPart) -> ppOcc+ | otherwise -> hsep [ ppOcc+ , dcolon unicode+ -- ++AZ++ make this prepend "{..}" when it is a record style GADT+ , ppLSigType unicode (getGADTConType con)+ ]++ fieldPart = case con of+ ConDeclGADT{con_g_args = con_args'} -> case con_args' of+ -- GADT record declarations+ RecConGADT _ _ -> doConstrArgsWithDocs []+ -- GADT prefix data constructors+ PrefixConGADT args | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing args)+ _ -> empty++ ConDeclH98{con_args = con_args'} -> case con_args' of+ -- H98 record declarations+ RecCon (L _ fields) -> doRecordFields fields+ -- H98 prefix data constructors+ PrefixCon _ args | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing args)+ -- H98 infix data constructor+ InfixCon arg1 arg2 | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing [arg1,arg2])+ _ -> empty++ doRecordFields fields =+ vcat [ empty <-> tt (text begin) <+> ppSideBySideField subdocs unicode field <+> nl+ | (begin, L _ field) <- zip ("\\qquad \\{" : repeat "\\qquad ,") fields+ ]+ $$+ empty <-> tt (text "\\qquad \\}") <+> nl++ doConstrArgsWithDocs args = vcat $ map (\l -> empty <-> text "\\qquad" <+> l) $ case con of+ ConDeclH98{} ->+ [ decltt (ppLParendType unicode arg) <-> rDoc (fmap _doc mdoc) <+> nl+ | (i, arg) <- zip [0..] args+ , let mdoc = Map.lookup i argDocs+ ]+ ConDeclGADT{} ->+ [ l <+> text "\\enspace" <+> r+ | (l,r) <- ppSubSigLike unicode (unLoc (getGADTConType con)) argDocs subdocs (dcolon unicode)+ ]+++ -- don't use "con_doc con", in case it's reconstructed from a .hi file,+ -- or also because we want Haddock to do the doc-parsing, not GHC.+ mbDoc = case getConNamesI con of+ cn:|_ -> lookup (unLoc cn) subdocs >>=+ fmap _doc . combineDocumentation . fst+++-- | Pretty-print a record field+ppSideBySideField :: [(DocName, DocForDecl DocName)] -> Bool -> ConDeclField DocNameI -> LaTeX+ppSideBySideField subdocs unicode (ConDeclField _ names ltype _) =+ decltt (cat (punctuate comma (map (ppBinder . rdrNameOcc . unLoc . foLabel . unLoc) names))+ <+> dcolon unicode <+> ppLType unicode ltype) <-> rDoc mbDoc+ where+ -- don't use cd_fld_doc for same reason we don't use con_doc above+ -- Where there is more than one name, they all have the same documentation+ mbDoc = lookup (foExt $ unLoc $ head names) subdocs >>= fmap _doc . combineDocumentation . fst+++-- | Pretty-print a bundled pattern synonym+ppSideBySidePat :: [LocatedN DocName] -- ^ pattern name(s)+ -> LHsSigType DocNameI -- ^ type of pattern(s)+ -> DocForDecl DocName -- ^ doc map+ -> Bool -- ^ unicode+ -> LaTeX+ppSideBySidePat lnames typ (doc, argDocs) unicode =+ decltt decl <-> rDoc mDoc <+> nl+ $$ fieldPart+ where+ hasArgDocs = not $ Map.null argDocs+ ppOcc = hsep (punctuate comma (map (ppDocBinder . unLoc) lnames))++ decl | hasArgDocs = keyword "pattern" <+> ppOcc+ | otherwise = hsep [ keyword "pattern"+ , ppOcc+ , dcolon unicode+ , ppLSigType unicode typ+ ]++ fieldPart+ | not hasArgDocs = empty+ | otherwise = vcat+ [ empty <-> text "\\qquad" <+> l <+> text "\\enspace" <+> r+ | (l,r) <- ppSubSigLike unicode (unLoc typ) argDocs [] (dcolon unicode)+ ]++ mDoc = fmap _doc $ combineDocumentation doc+++-- | Print the LHS of a data\/newtype declaration.+-- Currently doesn't handle 'data instance' decls or kind signatures+ppDataHeader :: TyClDecl DocNameI -> Bool -> LaTeX+ppDataHeader (DataDecl { tcdLName = L _ name, tcdTyVars = tyvars+ , tcdDataDefn = HsDataDefn { dd_cons = cons, dd_ctxt = ctxt } }) unicode+ = -- newtype or data+ (case cons of+ { NewTypeCon _ -> keyword "newtype"+ ; DataTypeCons False _ -> keyword "data"+ ; DataTypeCons True _ -> keyword "type" <+> keyword "data"+ }) <+>+ -- context+ ppLContext ctxt unicode <+>+ -- T a b c ..., or a :+: b+ ppAppDocNameNames False name (tyvarNames tyvars)+ppDataHeader _ _ = error "ppDataHeader: illegal argument"+++--------------------------------------------------------------------------------+-- * Type applications+--------------------------------------------------------------------------------++ppAppDocNameTyVarBndrs :: RenderableBndrFlag flag =>+ Bool -> DocName -> [LHsTyVarBndr flag DocNameI] -> LaTeX+ppAppDocNameTyVarBndrs unicode n vs =+ ppTypeApp n vs ppDN (ppHsTyVarBndr unicode . unLoc)+ where+ ppDN = ppBinder . nameOccName . getName+++-- | Print an application of a DocName to its list of HsTypes+ppAppNameTypes :: DocName -> [HsType DocNameI] -> Bool -> LaTeX+ppAppNameTypes n ts unicode = ppTypeApp n ts ppDocName (ppParendType unicode)++ppAppNameTypeArgs :: DocName -> [LHsTypeArg DocNameI] -> Bool -> LaTeX+ppAppNameTypeArgs n args@(HsValArg _:HsValArg _:_) unicode+ = ppTypeApp n args ppDocName (ppLHsTypeArg unicode)+ppAppNameTypeArgs n args unicode+ = ppDocName n <+> hsep (map (ppLHsTypeArg unicode) args)++-- | Print an application of a DocName and a list of Names+ppAppDocNameNames :: Bool -> DocName -> [Name] -> LaTeX+ppAppDocNameNames _summ n ns =+ ppTypeApp n ns (ppBinder . nameOccName . getName) ppSymName+++-- | General printing of type applications+ppTypeApp :: DocName -> [a] -> (DocName -> LaTeX) -> (a -> LaTeX) -> LaTeX+ppTypeApp n (t1:t2:rest) ppDN ppT+ | operator, not . null $ rest = parens opApp <+> hsep (map ppT rest)+ | operator = opApp+ where+ operator = isNameSym . getName $ n+ opApp = ppT t1 <+> ppDN n <+> ppT t2++ppTypeApp n ts ppDN ppT = ppDN n <+> hsep (map ppT ts)++-------------------------------------------------------------------------------+-- * Contexts+-------------------------------------------------------------------------------+++ppLContext :: Maybe (LHsContext DocNameI) -> Bool -> LaTeX+ppLContext Nothing _ = empty+ppLContext (Just ctxt) unicode = ppContext (unLoc ctxt) unicode++ppLContextNoArrow :: LHsContext DocNameI -> Bool -> LaTeX+ppLContextNoArrow ctxt unicode = ppContextNoArrow (unLoc ctxt) unicode++ppContextNoLocsMaybe :: [HsType DocNameI] -> Bool -> Maybe LaTeX+ppContextNoLocsMaybe [] _ = Nothing+ppContextNoLocsMaybe cxt unicode = Just $ pp_hs_context cxt unicode++ppContextNoArrow :: HsContext DocNameI -> Bool -> LaTeX+ppContextNoArrow cxt unicode = fromMaybe empty $+ ppContextNoLocsMaybe (map unLoc cxt) unicode+++ppContextNoLocs :: [HsType DocNameI] -> Bool -> LaTeX+ppContextNoLocs cxt unicode = maybe empty (<+> darrow unicode) $+ ppContextNoLocsMaybe cxt unicode+++ppContext :: HsContext DocNameI -> Bool -> LaTeX+ppContext cxt unicode = ppContextNoLocs (map unLoc cxt) unicode+++pp_hs_context :: [HsType DocNameI] -> Bool -> LaTeX+pp_hs_context [] _ = empty+pp_hs_context [p] unicode = ppCtxType unicode p+pp_hs_context cxt unicode = parenList (map (ppType unicode) cxt)+++-------------------------------------------------------------------------------+-- * Types and contexts+-------------------------------------------------------------------------------+++ppBang :: HsSrcBang -> LaTeX+ppBang (HsSrcBang _ _ SrcStrict) = char '!'+ppBang (HsSrcBang _ _ SrcLazy) = char '~'+ppBang _ = empty+++tupleParens :: HsTupleSort -> [LaTeX] -> LaTeX+tupleParens HsUnboxedTuple = ubxParenList+tupleParens _ = parenList+++sumParens :: [LaTeX] -> LaTeX+sumParens = ubxparens . hsep . punctuate (text " |")+++-------------------------------------------------------------------------------+-- * Rendering of HsType+--+-- Stolen from Html and tweaked for LaTeX generation+-------------------------------------------------------------------------------++ppLType, ppLParendType, ppLFunLhType :: Bool -> LHsType DocNameI -> LaTeX+ppLType unicode y = ppType unicode (unLoc y)+ppLParendType unicode y = ppParendType unicode (unLoc y)+ppLFunLhType unicode y = ppFunLhType unicode (unLoc y)++ppLSigType :: Bool -> LHsSigType DocNameI -> LaTeX+ppLSigType unicode y = ppSigType unicode (unLoc y)++ppType, ppParendType, ppFunLhType, ppCtxType :: Bool -> HsType DocNameI -> LaTeX+ppType unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode+ppParendType unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode+ppFunLhType unicode ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode+ppCtxType unicode ty = ppr_mono_ty (reparenTypePrec PREC_CTX ty) unicode++ppSigType :: Bool -> HsSigType DocNameI -> LaTeX+ppSigType unicode sig_ty = ppr_sig_ty (reparenSigType sig_ty) unicode++ppLHsTypeArg :: Bool -> LHsTypeArg DocNameI -> LaTeX+ppLHsTypeArg unicode (HsValArg ty) = ppLParendType unicode ty+ppLHsTypeArg unicode (HsTypeArg _ ki) = atSign unicode <>+ ppLParendType unicode ki+ppLHsTypeArg _ (HsArgPar _) = text ""++class RenderableBndrFlag flag where+ ppHsTyVarBndr :: Bool -> HsTyVarBndr flag DocNameI -> LaTeX++instance RenderableBndrFlag () where+ ppHsTyVarBndr _ (UserTyVar _ _ (L _ name)) = ppDocName name+ ppHsTyVarBndr unicode (KindedTyVar _ _ (L _ name) kind) =+ parens (ppDocName name) <+> dcolon unicode <+> ppLKind unicode kind++instance RenderableBndrFlag Specificity where+ ppHsTyVarBndr _ (UserTyVar _ SpecifiedSpec (L _ name)) = ppDocName name+ ppHsTyVarBndr _ (UserTyVar _ InferredSpec (L _ name)) = braces $ ppDocName name+ ppHsTyVarBndr unicode (KindedTyVar _ SpecifiedSpec (L _ name) kind) =+ parens (ppDocName name) <+> dcolon unicode <+> ppLKind unicode kind+ ppHsTyVarBndr unicode (KindedTyVar _ InferredSpec (L _ name) kind) =+ braces (ppDocName name) <+> dcolon unicode <+> ppLKind unicode kind++ppLKind :: Bool -> LHsKind DocNameI -> LaTeX+ppLKind unicode y = ppKind unicode (unLoc y)++ppKind :: Bool -> HsKind DocNameI -> LaTeX+ppKind unicode ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode++-- Drop top-level for-all type variables in user style+-- since they are implicit in Haskell++ppr_sig_ty :: HsSigType DocNameI -> Bool -> LaTeX+ppr_sig_ty (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) unicode+ = sep [ ppHsOuterTyVarBndrs outer_bndrs unicode+ , ppr_mono_lty ltype unicode ]++ppr_mono_lty :: LHsType DocNameI -> Bool -> LaTeX+ppr_mono_lty ty unicode = ppr_mono_ty (unLoc ty) unicode+++ppr_mono_ty :: HsType DocNameI -> Bool -> LaTeX+ppr_mono_ty (HsForAllTy _ tele ty) unicode+ = sep [ ppHsForAllTelescope tele unicode+ , ppr_mono_lty ty unicode ]+ppr_mono_ty (HsQualTy _ ctxt ty) unicode+ = sep [ ppLContext (Just ctxt) unicode+ , ppr_mono_lty ty unicode ]+ppr_mono_ty (HsFunTy _ mult ty1 ty2) u+ = sep [ ppr_mono_lty ty1 u+ , arr <+> ppr_mono_lty ty2 u ]+ where arr = case mult of+ HsLinearArrow _ -> lollipop u+ HsUnrestrictedArrow _ -> arrow u+ HsExplicitMult _ m _ -> multAnnotation <> ppr_mono_lty m u <+> arrow u++ppr_mono_ty (HsBangTy _ b ty) u = ppBang b <> ppLParendType u ty+ppr_mono_ty (HsTyVar _ NotPromoted (L _ name)) _ = ppDocName name+ppr_mono_ty (HsTyVar _ IsPromoted (L _ name)) _ = char '\'' <> ppDocName name+ppr_mono_ty (HsTupleTy _ con tys) u = tupleParens con (map (ppLType u) tys)+ppr_mono_ty (HsSumTy _ tys) u = sumParens (map (ppLType u) tys)+ppr_mono_ty (HsKindSig _ ty kind) u = parens (ppr_mono_lty ty u <+> dcolon u <+> ppLKind u kind)+ppr_mono_ty (HsListTy _ ty) u = brackets (ppr_mono_lty ty u)+ppr_mono_ty (HsIParamTy _ (L _ n) ty) u = ppIPName n <+> dcolon u <+> ppr_mono_lty ty u+ppr_mono_ty (HsSpliceTy v _) _ = dataConCantHappen v+ppr_mono_ty (HsRecTy {}) _ = text "{..}"+ppr_mono_ty (XHsType {}) _ = error "ppr_mono_ty HsCoreTy"+ppr_mono_ty (HsExplicitListTy _ IsPromoted tys) u = Pretty.quote $ brackets $ hsep $ punctuate comma $ map (ppLType u) tys+ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u = brackets $ hsep $ punctuate comma $ map (ppLType u) tys+ppr_mono_ty (HsExplicitTupleTy _ tys) u = Pretty.quote $ parenList $ map (ppLType u) tys++ppr_mono_ty (HsAppTy _ fun_ty arg_ty) unicode+ = hsep [ppr_mono_lty fun_ty unicode, ppr_mono_lty arg_ty unicode]++ppr_mono_ty (HsAppKindTy _ fun_ty arg_ki) unicode+ = hsep [ppr_mono_lty fun_ty unicode, atSign unicode <> ppr_mono_lty arg_ki unicode]++ppr_mono_ty (HsOpTy _ prom ty1 op ty2) unicode+ = ppr_mono_lty ty1 unicode <+> ppr_op_prom <+> ppr_mono_lty ty2 unicode+ where+ ppr_op_prom | isPromoted prom+ = char '\'' <> ppr_op+ | otherwise+ = ppr_op+ ppr_op | isSymOcc (getOccName op) = ppLDocName op+ | otherwise = char '`' <> ppLDocName op <> char '`'++ppr_mono_ty (HsParTy _ ty) unicode+ = parens (ppr_mono_lty ty unicode)+-- = ppr_mono_lty ty unicode++ppr_mono_ty (HsDocTy _ ty _) unicode+ = ppr_mono_lty ty unicode++ppr_mono_ty (HsWildCardTy _) _ = char '_'++ppr_mono_ty (HsTyLit _ t) u = ppr_tylit t u+ppr_mono_ty (HsStarTy _ isUni) unicode = starSymbol (isUni || unicode)+++ppr_tylit :: HsTyLit DocNameI -> Bool -> LaTeX+ppr_tylit (HsNumTy _ n) _ = integer n+ppr_tylit (HsStrTy _ s) _ = text (show s)+ppr_tylit (HsCharTy _ c) _ = text (show c)+ -- XXX: Ok in verbatim, but not otherwise+ -- XXX: Do something with Unicode parameter?+++-------------------------------------------------------------------------------+-- * Names+-------------------------------------------------------------------------------+++ppBinder :: OccName -> LaTeX+ppBinder n+ | isSymOcc n = parens $ ppOccName n+ | otherwise = ppOccName n++ppBinderInfix :: OccName -> LaTeX+ppBinderInfix n+ | isSymOcc n = ppOccName n+ | otherwise = cat [ char '`', ppOccName n, char '`' ]++ppSymName :: Name -> LaTeX+ppSymName name+ | isNameSym name = parens $ ppName name+ | otherwise = ppName name+++ppIPName :: HsIPName -> LaTeX+ppIPName = text . ('?':) . unpackFS . hsIPNameFS++ppOccName :: OccName -> LaTeX+ppOccName = text . occNameString+++ppDocName :: DocName -> LaTeX+ppDocName = ppOccName . nameOccName . getName++ppLDocName :: GenLocated l DocName -> LaTeX+ppLDocName (L _ d) = ppDocName d+++ppDocBinder :: DocName -> LaTeX+ppDocBinder = ppBinder . nameOccName . getName+++ppName :: Name -> LaTeX+ppName = ppOccName . nameOccName+++latexFilter :: String -> String+latexFilter = foldr latexMunge ""+++latexMonoFilter :: String -> String+latexMonoFilter = foldr latexMonoMunge ""+++latexMunge :: Char -> String -> String+latexMunge '#' s = "{\\char '43}" ++ s+latexMunge '$' s = "{\\char '44}" ++ s+latexMunge '%' s = "{\\char '45}" ++ s+latexMunge '&' s = "{\\char '46}" ++ s+latexMunge '~' s = "{\\char '176}" ++ s+latexMunge '_' s = "{\\char '137}" ++ s+latexMunge '^' s = "{\\char '136}" ++ s+latexMunge '\\' s = "{\\char '134}" ++ s+latexMunge '{' s = "{\\char '173}" ++ s+latexMunge '}' s = "{\\char '175}" ++ s+latexMunge '[' s = "{\\char 91}" ++ s+latexMunge ']' s = "{\\char 93}" ++ s+latexMunge c s = c : s+++latexMonoMunge :: Char -> String -> String+latexMonoMunge ' ' (' ':s) = "\\ \\ " ++ s+latexMonoMunge ' ' ('\\':' ':s) = "\\ \\ " ++ s+latexMonoMunge '\n' s = '\\' : '\\' : s+latexMonoMunge c s = latexMunge c s+++-------------------------------------------------------------------------------+-- * Doc Markup+-------------------------------------------------------------------------------+++latexMarkup :: HasOccName a => DocMarkup (Wrap a) (StringContext -> LaTeX -> LaTeX)+latexMarkup = Markup+ { markupParagraph = \p v -> blockElem (p v (text "\\par"))+ , markupEmpty = \_ -> id+ , markupString = \s v -> inlineElem (text (fixString v s))+ , markupAppend = \l r v -> l v . r v+ , markupIdentifier = \i v -> inlineElem (markupId v (fmap occName i))+ , markupIdentifierUnchecked = \i v -> inlineElem (markupId v (fmap snd i))+ , markupModule =+ \(ModLink m mLabel) v ->+ case mLabel of+ Just lbl -> inlineElem . tt $ lbl v empty+ Nothing -> inlineElem (let (mdl,_ref) = break (=='#') m+ in (tt (text mdl)))+ , markupWarning = \p v -> p v+ , markupEmphasis = \p v -> inlineElem (emph (p v empty))+ , markupBold = \p v -> inlineElem (bold (p v empty))+ , markupMonospaced = \p v -> inlineElem (markupMonospace p v)+ , markupUnorderedList = \p v -> blockElem (itemizedList (map (\p' -> p' v empty) p))+ , markupPic = \p _ -> inlineElem (markupPic p)+ , markupMathInline = \p _ -> inlineElem (markupMathInline p)+ , markupMathDisplay = \p _ -> blockElem (markupMathDisplay p)+ , markupOrderedList = \p v -> blockElem (enumeratedList (map (\(_, p') -> p' v empty) p))+ , markupDefList = \l v -> blockElem (descriptionList (map (\(a,b) -> (a v empty, b v empty)) l))+ , markupCodeBlock = \p _ -> blockElem (quote (verb (p Verb empty)))+ , markupHyperlink = \(Hyperlink u l) v -> inlineElem (markupLink u (fmap (\x -> x v empty) l))+ , markupAName = \_ _ -> id -- TODO+ , markupProperty = \p _ -> blockElem (quote (verb (text p)))+ , markupExample = \e _ -> blockElem (quote (verb (text $ unlines $ map exampleToString e)))+ , markupHeader = \(Header l h) p -> blockElem (header l (h p empty))+ , markupTable = \(Table h b) p -> blockElem (table h b p)+ }+ where+ blockElem :: LaTeX -> LaTeX -> LaTeX+ blockElem = ($$)++ inlineElem :: LaTeX -> LaTeX -> LaTeX+ inlineElem = (<>)++ header 1 d = text "\\section*" <> braces d+ header 2 d = text "\\subsection*" <> braces d+ header l d+ | l > 0 && l <= 6 = text "\\subsubsection*" <> braces d+ header l _ = error $ "impossible header level in LaTeX generation: " ++ show l++ table _ _ _ = text "{TODO: Table}"++ fixString Plain s = latexFilter s+ fixString Verb s = s+ fixString Mono s = latexMonoFilter s++ markupMonospace p Verb = p Verb empty+ markupMonospace p _ = tt (p Mono empty)++ markupLink url mLabel = case mLabel of+ Just label -> text "\\href" <> braces (text url) <> braces label+ Nothing -> text "\\url" <> braces (text url)++ -- Is there a better way of doing this? Just a space is an arbitrary choice.+ markupPic (Picture uri title) = parens (imageText title)+ where+ imageText Nothing = beg+ imageText (Just t) = beg <> text " " <> text t++ beg = text "image: " <> text uri++ markupMathInline mathjax = text "\\(" <> text mathjax <> text "\\)"++ markupMathDisplay mathjax = text "\\[" <> text mathjax <> text "\\]"++ markupId v wrappedOcc =+ case v of+ Verb -> text i+ Mono -> text "\\haddockid" <> braces (text . latexMonoFilter $ i)+ Plain -> text "\\haddockid" <> braces (text . latexFilter $ i)+ where i = showWrapped occNameString wrappedOcc++docToLaTeX :: Doc DocName -> LaTeX+docToLaTeX doc = markup latexMarkup doc Plain empty++documentationToLaTeX :: Documentation DocName -> Maybe LaTeX+documentationToLaTeX = fmap docToLaTeX . fmap _doc . combineDocumentation+++rdrDocToLaTeX :: Doc RdrName -> LaTeX+rdrDocToLaTeX doc = markup latexMarkup doc Plain empty+++data StringContext+ = Plain -- ^ all special characters have to be escape+ | Mono -- ^ on top of special characters, escape space characters+ | Verb -- ^ don't escape anything+++latexStripTrailingWhitespace :: Doc a -> Doc a+latexStripTrailingWhitespace (DocString s)+ | null s' = DocEmpty+ | otherwise = DocString s+ where s' = reverse (dropWhile isSpace (reverse s))+latexStripTrailingWhitespace (DocAppend l r)+ | DocEmpty <- r' = latexStripTrailingWhitespace l+ | otherwise = DocAppend l r'+ where+ r' = latexStripTrailingWhitespace r+latexStripTrailingWhitespace (DocParagraph p) =+ latexStripTrailingWhitespace p+latexStripTrailingWhitespace other = other+++-------------------------------------------------------------------------------+-- * LaTeX utils+-------------------------------------------------------------------------------+++itemizedList :: [LaTeX] -> LaTeX+itemizedList items =+ text "\\vbox{\\begin{itemize}" $$+ vcat (map (text "\\item" $$) items) $$+ text "\\end{itemize}}"+++enumeratedList :: [LaTeX] -> LaTeX+enumeratedList items =+ text "\\vbox{\\begin{enumerate}" $$+ vcat (map (text "\\item " $$) items) $$+ text "\\end{enumerate}}"+++descriptionList :: [(LaTeX,LaTeX)] -> LaTeX+descriptionList items =+ text "\\vbox{\\begin{description}" $$+ vcat (map (\(a,b) -> text "\\item" <> brackets a <> text "\\hfill \\par" $$ b) items) $$+ text "\\end{description}}"+++tt :: LaTeX -> LaTeX+tt ltx = text "\\haddocktt" <> braces ltx+++decltt :: LaTeX -> LaTeX+decltt ltx = text "\\haddockdecltt" <> braces (text filtered)+ where filtered = latexMonoFilter (latex2String ltx)++emph :: LaTeX -> LaTeX+emph ltx = text "\\emph" <> braces ltx++bold :: LaTeX -> LaTeX+bold ltx = text "\\textbf" <> braces ltx++-- TODO: @verbatim@ is too much since+--+-- * Haddock supports markup _inside_ of code blocks. Right now, the LaTeX+-- representing that markup gets printed verbatim+-- * Verbatim environments are not supported everywhere (example: not nested+-- inside a @tabulary@ environment)+verb :: LaTeX -> LaTeX+verb doc = text "{\\haddockverb\\begin{verbatim}" $$ doc <> text "\\end{verbatim}}"+ -- NB. swallow a trailing \n in the verbatim text by appending the+ -- \end{verbatim} directly, otherwise we get spurious blank lines at the+ -- end of code blocks.+++quote :: LaTeX -> LaTeX+quote doc = text "\\begin{quote}" $$ doc $$ text "\\end{quote}"+++dcolon, arrow, lollipop, darrow, forallSymbol, starSymbol, atSign :: Bool -> LaTeX+dcolon unicode = text (if unicode then "∷" else "::")+arrow unicode = text (if unicode then "→" else "->")+lollipop unicode = text (if unicode then "⊸" else "%1 ->")+darrow unicode = text (if unicode then "⇒" else "=>")+forallSymbol unicode = text (if unicode then "∀" else "forall")+starSymbol unicode = text (if unicode then "★" else "*")+atSign unicode = text (if unicode then "@" else "@")++multAnnotation :: LaTeX+multAnnotation = text "%"++dot :: LaTeX+dot = char '.'+++parenList :: [LaTeX] -> LaTeX+parenList = parens . hsep . punctuate comma+++ubxParenList :: [LaTeX] -> LaTeX+ubxParenList = ubxparens . hsep . punctuate comma+++ubxparens :: LaTeX -> LaTeX+ubxparens h = text "(#" <+> h <+> text "#)"+++nl :: LaTeX+nl = text "\\\\"+++keyword :: String -> LaTeX+keyword = text+++infixr 4 <-> -- combining table cells+(<->) :: LaTeX -> LaTeX -> LaTeX+a <-> b = a <+> char '&' <+> b
@@ -0,0 +1,914 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+{-# LANGUAGE CPP #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE BangPatterns #-}++module Haddock.Backends.Xhtml (+ ppHtml, copyHtmlBits,+ ppHtmlIndex, ppHtmlContents,+ ppJsonIndex+) where+++import Prelude hiding (div)++import Haddock.Backends.Xhtml.Decl+import Haddock.Backends.Xhtml.DocMarkup+import Haddock.Backends.Xhtml.Layout+import Haddock.Backends.Xhtml.Names+import Haddock.Backends.Xhtml.Themes+import Haddock.Backends.Xhtml.Types+import Haddock.Backends.Xhtml.Utils+import Haddock.InterfaceFile (PackageInfo (..), PackageInterfaces (..), ppPackageInfo)+import Haddock.ModuleTree+import Haddock.Options (Visibility (..))+import Haddock.Types+import Haddock.Version+import Haddock.Utils+import Haddock.Utils.Json+import Text.XHtml hiding ( name, title, p, quote )+import qualified Text.XHtml as XHtml+import Haddock.GhcUtils++import Control.Monad ( when, unless )+import qualified Data.ByteString.Builder as Builder+import Control.DeepSeq (force)+import Data.Bifunctor ( bimap )+import Data.Char ( toUpper, isSpace )+import Data.Either ( partitionEithers )+import Data.Foldable ( traverse_, foldl')+import Data.List ( sortBy, isPrefixOf, intersperse )+import Data.Maybe+import System.Directory+import System.FilePath hiding ( (</>) )+import qualified System.IO as IO+import qualified System.FilePath as FilePath+import Data.Map.Strict (Map)+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set hiding ( Set )+import Data.Ord ( comparing )++import GHC hiding ( NoLink, moduleInfo,LexicalFixity(..), anchor )+import GHC.Types.Name+import GHC.Unit.State++--------------------------------------------------------------------------------+-- * Generating HTML documentation+--------------------------------------------------------------------------------++ppHtml :: UnitState+ -> String -- ^ Title+ -> Maybe String -- ^ Package+ -> [Interface]+ -> [InstalledInterface] -- ^ Reexported interfaces+ -> FilePath -- ^ Destination directory+ -> Maybe (MDoc GHC.RdrName) -- ^ Prologue text, maybe+ -> Themes -- ^ Themes+ -> Maybe String -- ^ The mathjax URL (--mathjax)+ -> SourceURLs -- ^ The source URL (--source)+ -> WikiURLs -- ^ The wiki URL (--wiki)+ -> BaseURL -- ^ The base URL (--base-url)+ -> Maybe String -- ^ The contents URL (--use-contents)+ -> Maybe String -- ^ The index URL (--use-index)+ -> Bool -- ^ Whether to use unicode in output (--use-unicode)+ -> Maybe String -- ^ Package name+ -> PackageInfo -- ^ Package info+ -> QualOption -- ^ How to qualify names+ -> Bool -- ^ Output pretty html (newlines and indenting)+ -> Bool -- ^ Also write Quickjump index+ -> IO ()++ppHtml state doctitle maybe_package ifaces reexported_ifaces odir prologue+ themes maybe_mathjax_url maybe_source_url maybe_wiki_url+ maybe_base_url maybe_contents_url maybe_index_url unicode+ pkg packageInfo qual debug withQuickjump = do+ let+ visible_ifaces = filter visible ifaces+ visible i = OptHide `notElem` ifaceOptions i++ when (isNothing maybe_contents_url) $+ ppHtmlContents state odir doctitle maybe_package+ themes maybe_mathjax_url maybe_index_url maybe_source_url maybe_wiki_url+ withQuickjump+ [PackageInterfaces+ { piPackageInfo = packageInfo+ , piVisibility = Visible+ , piInstalledInterfaces = map toInstalledIface visible_ifaces+ ++ reexported_ifaces+ }]+ False -- we don't want to display the packages in a single-package contents+ prologue debug pkg (makeContentsQual qual)++ when (isNothing maybe_index_url) $ do+ ppHtmlIndex odir doctitle maybe_package+ themes maybe_mathjax_url maybe_contents_url maybe_source_url maybe_wiki_url+ withQuickjump+ (map toInstalledIface visible_ifaces ++ reexported_ifaces) debug++ when withQuickjump $+ ppJsonIndex odir maybe_source_url maybe_wiki_url unicode pkg qual+ visible_ifaces []++ mapM_ (ppHtmlModule odir doctitle themes+ maybe_mathjax_url maybe_source_url maybe_wiki_url maybe_base_url+ maybe_contents_url maybe_index_url withQuickjump+ unicode pkg qual debug) visible_ifaces+++copyHtmlBits :: FilePath -> FilePath -> Themes -> Bool -> IO ()+copyHtmlBits odir libdir themes withQuickjump = do+ let+ libhtmldir = joinPath [libdir, "html"]+ copyCssFile f = copyFile f (combine odir (takeFileName f))+ copyLibFile f = copyFile (joinPath [libhtmldir, f]) (joinPath [odir, f])+ mapM_ copyCssFile (cssFiles themes)+ copyLibFile haddockJsFile+ copyCssFile (joinPath [libhtmldir, quickJumpCssFile])+ when withQuickjump (copyLibFile jsQuickJumpFile)+ return ()+++headHtml :: String -> Themes -> Maybe String -> Maybe String -> Html+headHtml docTitle themes mathjax_url base_url =+ header ! (maybe [] (\url -> [identifier "head", strAttr "data-base-url" url ]) base_url)+ <<+ [ meta ! [ httpequiv "Content-Type", content "text/html; charset=UTF-8"]+ , meta ! [ XHtml.name "viewport", content "width=device-width, initial-scale=1"]+ , thetitle << docTitle+ , styleSheet base_url themes+ , thelink ! [ rel "stylesheet"+ , thetype "text/css"+ , href (withBaseURL base_url quickJumpCssFile) ]+ << noHtml+ , thelink ! [ rel "stylesheet", thetype "text/css", href fontUrl] << noHtml+ , script ! [ src (withBaseURL base_url haddockJsFile)+ , emptyAttr "async"+ , thetype "text/javascript" ]+ << noHtml+ , script ! [thetype "text/x-mathjax-config"] << primHtml mjConf+ , script ! [src mjUrl, thetype "text/javascript"] << noHtml+ ]+ where+ fontUrl = "https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700"+ mjUrl = fromMaybe "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" mathjax_url+ mjConf = unwords [ "MathJax.Hub.Config({"+ , "tex2jax: {"+ , "processClass: \"mathjax\","+ , "ignoreClass: \".*\""+ , "}"+ , "});" ]++quickJumpButtonLi :: Bool -- ^ With Quick Jump?+ -> Maybe Html+-- The TypeScript should replace this <li> element, given its id. However, in+-- case it does not, the element is given content here too.+quickJumpButtonLi True = Just $ li ! [identifier "quick-jump-button"]+ << anchor ! [href "#"] << "Quick Jump"++quickJumpButtonLi False = Nothing++srcButton :: SourceURLs -> Maybe Interface -> Maybe Html+srcButton (Just src_base_url, _, _, _) Nothing =+ Just (anchor ! [href src_base_url] << "Source")+srcButton (_, Just src_module_url, _, _) (Just iface) =+ let url = spliceURL (Just $ ifaceOrigFilename iface)+ (Just $ ifaceMod iface) Nothing Nothing src_module_url+ in Just (anchor ! [href url] << "Source")+srcButton _ _ =+ Nothing+++wikiButton :: WikiURLs -> Maybe Module -> Maybe Html+wikiButton (Just wiki_base_url, _, _) Nothing =+ Just (anchor ! [href wiki_base_url] << "User Comments")++wikiButton (_, Just wiki_module_url, _) (Just mdl) =+ let url = spliceURL Nothing (Just mdl) Nothing Nothing wiki_module_url+ in Just (anchor ! [href url] << "User Comments")++wikiButton _ _ =+ Nothing+++contentsButton :: Maybe String -> Maybe Html+contentsButton maybe_contents_url+ = Just (anchor ! [href url] << "Contents")+ where url = fromMaybe contentsHtmlFile maybe_contents_url+++indexButton :: Maybe String -> Maybe Html+indexButton maybe_index_url+ = Just (anchor ! [href url] << "Index")+ where url = fromMaybe indexHtmlFile maybe_index_url+++bodyHtml :: String -> Maybe Interface+ -> SourceURLs -> WikiURLs+ -> Maybe String -> Maybe String+ -> Bool -- ^ With Quick Jump?+ -> Html -> Html+bodyHtml doctitle iface+ maybe_source_url maybe_wiki_url+ maybe_contents_url maybe_index_url+ withQuickjump+ pageContent =+ body << [+ divPackageHeader << [+ nonEmptySectionName << doctitle,+ ulist ! [theclass "links", identifier "page-menu"]+ << catMaybes (quickJumpButtonLi withQuickjump : otherButtonLis)+ ],+ divContent << pageContent,+ divFooter << paragraph << (+ "Produced by " ++++ (anchor ! [href projectUrl] << toHtml projectName) ++++ (" version " ++ projectVersion)+ )+ ]+ where+ otherButtonLis = (fmap . fmap) (li <<)+ [ srcButton maybe_source_url iface+ , wikiButton maybe_wiki_url (ifaceMod <$> iface)+ , contentsButton maybe_contents_url+ , indexButton maybe_index_url+ ]++moduleInfo :: Interface -> Html+moduleInfo iface =+ let+ info = ifaceInfo iface++ doOneEntry :: (String, HaddockModInfo GHC.Name -> Maybe String) -> Maybe HtmlTable+ doOneEntry (fieldName, field) =+ field info >>= \a -> return (th << fieldName <-> td << a)++ entries :: [HtmlTable]+ entries = maybeToList copyrightsTable ++ mapMaybe doOneEntry [+ ("License",hmi_license),+ ("Maintainer",hmi_maintainer),+ ("Stability",hmi_stability),+ ("Portability",hmi_portability),+ ("Safe Haskell",hmi_safety),+ ("Language", lg)+ ] ++ extsForm+ where+ lg inf = fmap show (hmi_language inf)++ multilineRow :: String -> [String] -> HtmlTable+ multilineRow title xs = (th ! [valign "top"]) << title <-> td << (toLines xs)+ where toLines = mconcat . intersperse br . map toHtml++ copyrightsTable :: Maybe HtmlTable+ copyrightsTable = fmap (multilineRow "Copyright" . split) (hmi_copyright info)+ where split = map (trim . filter (/= ',')) . lines++ extsForm+ | OptShowExtensions `elem` ifaceOptions iface =+ let fs = map (dropOpt . show) (hmi_extensions info)+ in case map stringToHtml fs of+ [] -> []+ [x] -> extField x -- don't use a list for a single extension+ xs -> extField $ unordList xs ! [theclass "extension-list"]+ | otherwise = []+ where+ extField x = return $ th << "Extensions" <-> td << x+ dropOpt x = if "Opt_" `isPrefixOf` x then drop 4 x else x+ in+ case entries of+ [] -> noHtml+ _ -> table ! [theclass "info"] << aboves entries+++--------------------------------------------------------------------------------+-- * Generate the module contents+--------------------------------------------------------------------------------+++ppHtmlContents+ :: UnitState+ -> FilePath+ -> String+ -> Maybe String+ -> Themes+ -> Maybe String+ -> Maybe String+ -> SourceURLs+ -> WikiURLs+ -> Bool -- ^ With Quick Jump?+ -> [PackageInterfaces] -> Bool -> Maybe (MDoc GHC.RdrName)+ -> Bool+ -> Maybe Package -- ^ Current package+ -> Qualification -- ^ How to qualify names+ -> IO ()+ppHtmlContents state odir doctitle _maybe_package+ themes mathjax_url maybe_index_url+ maybe_source_url maybe_wiki_url withQuickjump+ packages showPkgs prologue debug pkg qual = do+ let trees =+ [ ( piPackageInfo pinfo+ , mkModuleTree state showPkgs+ [(instMod iface, toInstalledDescription iface)+ | iface <- piInstalledInterfaces pinfo+ , not (instIsSig iface)+ ]+ )+ | pinfo <- packages+ ]+ sig_trees =+ [ ( piPackageInfo pinfo+ , mkModuleTree state showPkgs+ [(instMod iface, toInstalledDescription iface)+ | iface <- piInstalledInterfaces pinfo+ , instIsSig iface+ ]+ )+ | pinfo <- packages+ ]+ html =+ headHtml doctitle themes mathjax_url Nothing ++++ bodyHtml doctitle Nothing+ maybe_source_url maybe_wiki_url+ Nothing maybe_index_url withQuickjump << [+ ppPrologue pkg qual doctitle prologue,+ ppSignatureTrees pkg qual sig_trees,+ ppModuleTrees pkg qual trees+ ]+ createDirectoryIfMissing True odir+ writeUtf8File (joinPath [odir, contentsHtmlFile]) (renderToString debug html)+ where+ -- Extract a module's short description.+ toInstalledDescription :: InstalledInterface -> Maybe (MDoc Name)+ toInstalledDescription = fmap mkMeta . hmi_description . instInfo+++ppPrologue :: Maybe Package -> Qualification -> String -> Maybe (MDoc GHC.RdrName) -> Html+ppPrologue _ _ _ Nothing = noHtml+ppPrologue pkg qual title (Just doc) =+ divDescription << (h1 << title +++ docElement thediv (rdrDocToHtml pkg qual doc))++ppSignatureTrees :: Maybe Package -> Qualification -> [(PackageInfo, [ModuleTree])] -> Html+ppSignatureTrees _ _ tss | all (null . snd) tss = mempty+ppSignatureTrees pkg qual [(info, ts)] =+ divPackageList << (sectionName << "Signatures" +++ ppSignatureTree pkg qual "n" info ts)+ppSignatureTrees pkg qual tss =+ divModuleList <<+ (sectionName << "Signatures"+ +++ concatHtml [ ppSignatureTree pkg qual("n."++show i++".") info ts+ | (i, (info, ts)) <- zip [(1::Int)..] tss+ ])++ppSignatureTree :: Maybe Package -> Qualification -> String -> PackageInfo -> [ModuleTree] -> Html+ppSignatureTree _ _ _ _ [] = mempty+ppSignatureTree pkg qual p info ts =+ divModuleList << (sectionName << ppPackageInfo info +++ mkNodeList pkg qual [] p ts)++ppModuleTrees :: Maybe Package -> Qualification -> [(PackageInfo, [ModuleTree])] -> Html+ppModuleTrees _ _ tss | all (null . snd) tss = mempty+ppModuleTrees pkg qual [(info, ts)] =+ divModuleList << (sectionName << "Modules" +++ ppModuleTree pkg qual "n" info ts)+ppModuleTrees pkg qual tss =+ divPackageList <<+ (sectionName << "Packages"+ +++ concatHtml [ppModuleTree pkg qual ("n."++show i++".") info ts+ | (i, (info, ts)) <- zip [(1::Int)..] tss+ ])++ppModuleTree :: Maybe Package -> Qualification -> String -> PackageInfo -> [ModuleTree] -> Html+ppModuleTree _ _ _ _ [] = mempty+ppModuleTree pkg qual p info ts =+ divModuleList << (sectionName << ppPackageInfo info +++ mkNodeList pkg qual [] p ts)+++mkNodeList :: Maybe Package -> Qualification -> [String] -> String -> [ModuleTree] -> Html+mkNodeList pkg qual ss p ts = case ts of+ [] -> noHtml+ _ -> unordList (zipWith (mkNode pkg qual ss) ps ts)+ where+ ps = [ p ++ '.' : show i | i <- [(1::Int)..]]+++mkNode :: Maybe Package -> Qualification -> [String] -> String -> ModuleTree -> Html+mkNode pkg qual ss p (Node s leaf _pkg srcPkg short ts) =+ htmlModule <+> shortDescr +++ htmlPkg +++ subtree+ where+ modAttrs = case (ts, leaf) of+ (_:_, Nothing) -> collapseControl p "module"+ (_, _ ) -> [theclass "module"]++ cBtn = case (ts, leaf) of+ (_:_, Just _) -> thespan ! collapseControl p "" << spaceHtml+ ([] , Just _) -> thespan ! [theclass "noexpander"] << spaceHtml+ (_, _ ) -> noHtml+ -- We only need an explicit collapser button when the module name+ -- is also a leaf, and so is a link to a module page. Indeed, the+ -- spaceHtml is a minor hack and does upset the layout a fraction.++ htmlModule = thespan ! modAttrs << (cBtn ++++ case leaf of+ Just m -> ppModule m+ Nothing -> toHtml s+ )++ shortDescr = maybe noHtml (origDocToHtml pkg qual) short+ htmlPkg = maybe noHtml (thespan ! [theclass "package"] <<) srcPkg++ subtree =+ if null ts then noHtml else+ collapseDetails p DetailsOpen (+ thesummary ! [ theclass "hide-when-js-enabled" ] << "Submodules" ++++ mkNodeList pkg qual (s:ss) p ts+ )++--------------------------------------------------------------------------------+-- * Generate the index+--------------------------------------------------------------------------------++data JsonIndexEntry = JsonIndexEntry {+ jieHtmlFragment :: String,+ jieName :: String,+ jieModule :: String,+ jieLink :: String+ }+ deriving Show++instance ToJSON JsonIndexEntry where+ toJSON JsonIndexEntry+ { jieHtmlFragment+ , jieName+ , jieModule+ , jieLink } =+ Object+ [ "display_html" .= String jieHtmlFragment+ , "name" .= String jieName+ , "module" .= String jieModule+ , "link" .= String jieLink+ ]++instance FromJSON JsonIndexEntry where+ parseJSON = withObject "JsonIndexEntry" $ \v ->+ JsonIndexEntry+ <$> v .: "display_html"+ <*> v .: "name"+ <*> v .: "module"+ <*> v .: "link"++ppJsonIndex :: FilePath+ -> SourceURLs -- ^ The source URL (--source)+ -> WikiURLs -- ^ The wiki URL (--wiki)+ -> Bool+ -> Maybe Package+ -> QualOption+ -> [Interface]+ -> [FilePath] -- ^ file paths to interface files+ -- (--read-interface)+ -> IO ()+ppJsonIndex odir maybe_source_url maybe_wiki_url unicode pkg qual_opt ifaces installedIfacesPaths = do+ createDirectoryIfMissing True odir+ (errors, installedIndexes) <-+ partitionEithers+ <$> traverse+ (\ifaceFile -> do+ let indexFile = takeDirectory ifaceFile+ FilePath.</> "doc-index.json"+ a <- doesFileExist indexFile+ if a then+ bimap (indexFile,) (map (fixLink ifaceFile))+ <$> eitherDecodeFile @[JsonIndexEntry] indexFile+ else+ return (Right [])+ )+ installedIfacesPaths+ traverse_ (\(indexFile, err) -> putStrLn $ "haddock: Coudn't parse " ++ indexFile ++ ": " ++ err)+ errors+ IO.withBinaryFile (joinPath [odir, indexJsonFile]) IO.WriteMode $ \h ->+ Builder.hPutBuilder+ h (encodeToBuilder (encodeIndexes (concat installedIndexes)))+ where+ encodeIndexes :: [JsonIndexEntry] -> Value+ encodeIndexes installedIndexes =+ toJSON+ (concatMap fromInterface ifaces+ ++ installedIndexes)++ fromInterface :: Interface -> [JsonIndexEntry]+ fromInterface iface =+ mkIndex mdl qual `mapMaybe` ifaceRnExportItems iface+ where+ aliases = ifaceModuleAliases iface+ qual = makeModuleQual qual_opt aliases mdl+ mdl = ifaceMod iface++ mkIndex :: Module -> Qualification -> ExportItem DocNameI -> Maybe JsonIndexEntry+ mkIndex mdl qual item+ | Just item_html <- processExport True links_info unicode pkg qual item+ = Just JsonIndexEntry+ { jieHtmlFragment = showHtmlFragment item_html+ , jieName = unwords (map getOccString names)+ , jieModule = moduleString mdl+ , jieLink = fromMaybe "" (listToMaybe (map (nameLink mdl) names))+ }+ | otherwise = Nothing+ where+ names = exportName item ++ exportSubs item++ exportSubs :: ExportItem DocNameI -> [IdP DocNameI]+ exportSubs (ExportDecl (RnExportD { rnExpDExpD = ExportD { expDSubDocs } })) = map fst expDSubDocs+ exportSubs _ = []++ exportName :: ExportItem DocNameI -> [IdP DocNameI]+ exportName (ExportDecl (RnExportD { rnExpDExpD = ExportD { expDDecl } })) = getMainDeclBinderI (unLoc expDDecl)+ exportName ExportNoDecl { expItemName } = [expItemName]+ exportName _ = []++ nameLink :: NamedThing name => Module -> name -> String+ nameLink mdl = moduleNameUrl' (moduleName mdl) . nameOccName . getName++ links_info = (maybe_source_url, maybe_wiki_url)++ -- update link using relative path to output directory+ fixLink :: FilePath+ -> JsonIndexEntry -> JsonIndexEntry+ fixLink ifaceFile jie =+ jie { jieLink = makeRelative odir (takeDirectory ifaceFile)+ FilePath.</> jieLink jie }++ppHtmlIndex :: FilePath+ -> String+ -> Maybe String+ -> Themes+ -> Maybe String+ -> Maybe String+ -> SourceURLs+ -> WikiURLs+ -> Bool -- ^ With Quick Jump?+ -> [InstalledInterface]+ -> Bool+ -> IO ()+ppHtmlIndex odir doctitle _maybe_package themes+ maybe_mathjax_url maybe_contents_url maybe_source_url maybe_wiki_url withQuickjump ifaces debug = do+ let html = indexPage split_indices Nothing+ (if split_indices then [] else index)++ createDirectoryIfMissing True odir++ when split_indices $ do+ mapM_ (do_sub_index index) initialChars+ -- Let's add a single large index as well for those who don't know exactly what they're looking for:+ let mergedhtml = indexPage False Nothing index+ writeUtf8File (joinPath [odir, subIndexHtmlFile merged_name]) (renderToString debug mergedhtml)++ writeUtf8File (joinPath [odir, indexHtmlFile]) (renderToString debug html)++ where+ indexPage showLetters ch items =+ headHtml (doctitle ++ " (" ++ indexName ch ++ ")") themes maybe_mathjax_url Nothing ++++ bodyHtml doctitle Nothing+ maybe_source_url maybe_wiki_url+ maybe_contents_url Nothing withQuickjump << [+ if showLetters then indexInitialLetterLinks else noHtml,+ if null items then noHtml else+ divIndex << [sectionName << indexName ch, buildIndex items]+ ]++ indexName ch = "Index" ++ maybe "" (\c -> " - " ++ [c]) ch+ merged_name = "All"++ buildIndex items = table << aboves (map indexElt items)++ -- an arbitrary heuristic:+ -- too large, and a single-page will be slow to load+ -- too small, and we'll have lots of letter-indexes with only one+ -- or two members in them, which seems inefficient or+ -- unnecessarily hard to use.+ split_indices = length index > 150++ indexInitialLetterLinks =+ divAlphabet <<+ unordList (map (\str -> anchor ! [href (subIndexHtmlFile str)] << str) $+ [ [c] | c <- initialChars+ , any ((==c) . toUpper . head . fst) index ] +++ [merged_name])++ -- todo: what about names/operators that start with Unicode+ -- characters?+ -- Exports beginning with '_' can be listed near the end,+ -- presumably they're not as important... but would be listed+ -- with non-split index!+ initialChars = [ 'A'..'Z' ] ++ ":!#$%&*+./<=>?@\\^|-~" ++ "_"++ do_sub_index this_ix c+ = unless (null index_part) $+ writeUtf8File (joinPath [odir, subIndexHtmlFile [c]]) (renderToString debug html)+ where+ html = indexPage True (Just c) index_part+ index_part = [(n,stuff) | (n,stuff) <- this_ix, toUpper (head n) == c]+++ index :: [(String, Map GHC.Name [(Module,Bool)])]+ index = sortBy cmp (Map.toAscList full_index)+ where cmp (n1,_) (n2,_) = comparing (map toUpper) n1 n2++ -- for each name (a plain string), we have a number of original HsNames that+ -- it can refer to, and for each of those we have a list of modules+ -- that export that entity. Each of the modules exports the entity+ -- in a visible or invisible way (hence the Bool).+ full_index :: Map String (Map GHC.Name [(Module,Bool)])+ full_index = foldl' f Map.empty ifaces+ where+ f :: Map String (Map Name [(Module, Bool)])+ -> InstalledInterface+ -> Map String (Map Name [(Module, Bool)])+ f !idx iface =+ Map.unionWith+ (Map.unionWith (\a b -> let !x = force $ a ++ b in x))+ idx+ (getIfaceIndex iface)+++ getIfaceIndex :: InstalledInterface -> Map String (Map Name [(Module, Bool)])+ getIfaceIndex iface =+ foldl' f Map.empty (instExports iface)+ where+ f :: Map String (Map Name [(Module, Bool)])+ -> Name+ -> Map String (Map Name [(Module, Bool)])+ f !idx name =+ let !vis = name `Set.member` visible+ in+ Map.insertWith+ (Map.unionWith (++))+ (getOccString name)+ (Map.singleton name [(mdl, vis)])+ idx++ mdl = instMod iface+ visible = Set.fromList (instVisibleExports iface)++ indexElt :: (String, Map GHC.Name [(Module,Bool)]) -> HtmlTable+ indexElt (str, entities) =+ case Map.toAscList entities of+ [(nm,entries)] ->+ td ! [ theclass "src" ] << toHtml str <->+ indexLinks nm entries+ many_entities ->+ td ! [ theclass "src" ] << toHtml str <-> td << spaceHtml </>+ aboves (zipWith (curry doAnnotatedEntity) [1..] many_entities)++ doAnnotatedEntity :: (Integer, (Name, [(Module, Bool)])) -> HtmlTable+ doAnnotatedEntity (j,(nm,entries))+ = td ! [ theclass "alt" ] <<+ toHtml (show j) <+> parens (ppAnnot (nameOccName nm)) <->+ indexLinks nm entries++ ppAnnot n | not (isValOcc n) = toHtml "Type/Class"+ | isDataOcc n = toHtml "Data Constructor"+ | otherwise = toHtml "Function"++ indexLinks nm entries =+ td ! [ theclass "module" ] <<+ hsep (punctuate comma+ [ if visible then+ linkId mdl (Just nm) << toHtml (moduleString mdl)+ else+ toHtml (moduleString mdl)+ | (mdl, visible) <- entries ])+++--------------------------------------------------------------------------------+-- * Generate the HTML page for a module+--------------------------------------------------------------------------------+++ppHtmlModule+ :: FilePath -> String -> Themes+ -> Maybe String -> SourceURLs -> WikiURLs -> BaseURL+ -> Maybe String -> Maybe String+ -> Bool -- ^ With Quick Jump?+ -> Bool -> Maybe Package -> QualOption+ -> Bool -> Interface -> IO ()+ppHtmlModule odir doctitle themes+ maybe_mathjax_url maybe_source_url maybe_wiki_url maybe_base_url+ maybe_contents_url maybe_index_url withQuickjump+ unicode pkg qual debug iface = do+ let+ mdl = ifaceMod iface+ aliases = ifaceModuleAliases iface+ mdl_str = moduleString mdl+ mdl_str_annot = mdl_str ++ if ifaceIsSig iface+ then " (signature)"+ else ""+ mdl_str_linked+ | ifaceIsSig iface+ = mdl_str +++ " (signature" ++++ sup << ("[" +++ anchor ! [href signatureDocURL] << "?" +++ "]" ) ++++ ")"+ | otherwise+ = toHtml mdl_str+ real_qual = makeModuleQual qual aliases mdl+ html =+ headHtml mdl_str_annot themes maybe_mathjax_url maybe_base_url ++++ bodyHtml doctitle (Just iface)+ maybe_source_url maybe_wiki_url+ maybe_contents_url maybe_index_url withQuickjump << [+ divModuleHeader << (moduleInfo iface +++ (sectionName << mdl_str_linked)),+ ifaceToHtml maybe_source_url maybe_wiki_url iface unicode pkg real_qual+ ]++ createDirectoryIfMissing True odir+ writeUtf8File (joinPath [odir, moduleHtmlFile mdl]) (renderToString debug html)++signatureDocURL :: String+signatureDocURL = "https://wiki.haskell.org/Module_signature"+++ifaceToHtml :: SourceURLs -> WikiURLs -> Interface -> Bool -> Maybe Package -> Qualification -> Html+ifaceToHtml maybe_source_url maybe_wiki_url iface unicode pkg qual+ = ppModuleContents pkg qual exports (not . null $ ifaceRnOrphanInstances iface) ++++ description ++++ synopsis ++++ divInterface (maybe_doc_hdr +++ bdy +++ orphans)+ where+ exports = numberSectionHeadings (ifaceRnExportItems iface)++ -- todo: if something has only sub-docs, or fn-args-docs, should+ -- it be measured here and thus prevent omitting the synopsis?+ has_doc+ ( ExportDecl+ ( RnExportD+ { rnExpDExpD =+ ExportD+ { expDMbDoc =+ ( Documentation mDoc mWarn, _ )+ }+ }+ )+ ) = isJust mDoc || isJust mWarn+ has_doc (ExportNoDecl _ _) = False+ has_doc (ExportModule _) = False+ has_doc _ = True++ no_doc_at_all = not (any has_doc exports)++ description | isNoHtml doc = doc+ | otherwise = divDescription $ sectionName << "Description" +++ doc+ where doc = docSection Nothing pkg qual (ifaceRnDoc iface)++ -- omit the synopsis if there are no documentation annotations at all+ synopsis+ | no_doc_at_all = noHtml+ | otherwise+ = divSynopsis $+ collapseDetails "syn" DetailsClosed (+ thesummary << "Synopsis" ++++ shortDeclList (+ mapMaybe (processExport True linksInfo unicode pkg qual) exports+ ) ! collapseToggle "syn" ""+ )++ -- if the documentation doesn't begin with a section header, then+ -- add one ("Documentation").+ maybe_doc_hdr+ = case exports of+ [] -> noHtml+ ExportGroup {} : _ -> noHtml+ _ -> h1 << "Documentation"++ bdy =+ foldr (+++) noHtml $+ mapMaybe (processExport False linksInfo unicode pkg qual) exports++ orphans =+ ppOrphanInstances linksInfo (ifaceRnOrphanInstances iface) False unicode pkg qual++ linksInfo = (maybe_source_url, maybe_wiki_url)+++ppModuleContents :: Maybe Package -- ^ This package+ -> Qualification+ -> [ExportItem DocNameI]+ -> Bool -- ^ Orphans sections+ -> Html+ppModuleContents pkg qual exports orphan+ | null sections && not orphan = noHtml+ | otherwise = contentsDiv+ where+ contentsDiv = divTableOfContents << (divContentsList << (+ (sectionName << "Contents") ! [ strAttr "onclick" "window.scrollTo(0,0)" ] ++++ unordList (sections ++ orphanSection)))++ (sections, _leftovers{-should be []-}) = process 0 exports+ orphanSection+ | orphan = [ linkedAnchor "section.orphans" << "Orphan instances" ]+ | otherwise = []++ process :: Int -> [ExportItem DocNameI] -> ([Html],[ExportItem DocNameI])+ process _ [] = ([], [])+ process n items@(ExportGroup lev id0 doc : rest)+ | lev <= n = ( [], items )+ | otherwise = ( html:secs, rest2 )+ where+ html = linkedAnchor (groupId id0)+ << docToHtmlNoAnchors (Just id0) pkg qual (mkMeta doc) +++ mk_subsections ssecs+ (ssecs, rest1) = process lev rest+ (secs, rest2) = process n rest1+ process n (_ : rest) = process n rest++ mk_subsections [] = noHtml+ mk_subsections ss = unordList ss++-- we need to assign a unique id to each section heading so we can hyperlink+-- them from the contents:+numberSectionHeadings :: [ExportItem DocNameI] -> [ExportItem DocNameI]+numberSectionHeadings = go 1+ where go :: Int -> [ExportItem DocNameI] -> [ExportItem DocNameI]+ go _ [] = []+ go n (ExportGroup lev _ doc : es)+ = case collectAnchors doc of+ [] -> ExportGroup lev (show n) doc : go (n+1) es+ (a:_) -> ExportGroup lev a doc : go (n+1) es+ go n (other:es)+ = other : go n es++ collectAnchors :: DocH (Wrap (ModuleName, OccName)) (Wrap DocName) -> [String]+ collectAnchors (DocAppend a b) = collectAnchors a ++ collectAnchors b+ collectAnchors (DocAName a) = [a]+ collectAnchors _ = []++processExport :: Bool -> LinksInfo -> Bool -> Maybe Package -> Qualification+ -> ExportItem DocNameI -> Maybe Html+processExport _ _ _ _ _+ ( ExportDecl+ ( RnExportD+ { rnExpDExpD =+ ExportD+ { expDDecl = L _ (InstD {})+ }+ }+ )+ )+ = Nothing -- Hide empty instances+processExport summary links unicode pkg qual+ ( ExportDecl+ ( RnExportD+ { rnExpDExpD =+ ExportD decl pats doc subdocs insts fixities splice+ }+ )+ )+ = processDecl summary $ ppDecl summary links decl pats doc insts fixities subdocs splice unicode pkg qual+processExport summary _ _ pkg qual (ExportGroup lev id0 doc)+ = nothingIf summary $ groupHeading lev id0 << docToHtmlNoAnchors (Just id0) pkg qual (mkMeta doc)+processExport summary _ _ _ qual (ExportNoDecl y [])+ = processDeclOneLiner summary $ ppDocName qual Prefix True y+processExport summary _ _ _ qual (ExportNoDecl y subs)+ = processDeclOneLiner summary $+ ppDocName qual Prefix True y+ +++ parenList (map (ppDocName qual Prefix True) subs)+processExport summary _ _ pkg qual (ExportDoc doc)+ = nothingIf summary $ docSection_ Nothing pkg qual doc+processExport summary _ _ _ _ (ExportModule mdl)+ = processDeclOneLiner summary $ toHtml "module" <+> ppModule mdl+++nothingIf :: Bool -> a -> Maybe a+nothingIf True _ = Nothing+nothingIf False a = Just a+++processDecl :: Bool -> Html -> Maybe Html+processDecl True = Just+processDecl False = Just . divTopDecl++trim :: String -> String+trim = f . f+ where f = reverse . dropWhile isSpace++processDeclOneLiner :: Bool -> Html -> Maybe Html+processDeclOneLiner True = Just+processDeclOneLiner False = Just . divTopDecl . declElem++groupHeading :: Int -> String -> Html -> Html+groupHeading lev id0 = linkedAnchor grpId . groupTag lev ! [identifier grpId]+ where grpId = groupId id0++groupTag :: Int -> Html -> Html+groupTag lev+ | lev == 1 = h1+ | lev == 2 = h2+ | lev == 3 = h3+ | otherwise = h4
@@ -0,0 +1,1312 @@+{-# LANGUAGE TransformListComp #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE LambdaCase #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Decl+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Decl (+ ppDecl,+ ppOrphanInstances,+) where++import Haddock.Backends.Xhtml.DocMarkup+import Haddock.Backends.Xhtml.Layout+import Haddock.Backends.Xhtml.Names+import Haddock.Backends.Xhtml.Types+import Haddock.Backends.Xhtml.Utils+import Haddock.GhcUtils+import Haddock.Types+import Haddock.Doc (combineDocumentation)++import Data.Foldable ( toList )+import Data.List ( intersperse, sort )+import Data.List.NonEmpty ( NonEmpty (..) )+import qualified Data.Map as Map+import Data.Maybe+import Text.XHtml hiding ( name, title, p, quote )++import GHC.Core.Type ( Specificity(..) )+import GHC hiding (LexicalFixity(..), fromMaybeContext)+import GHC.Exts hiding (toList)+import GHC.Types.Name+import GHC.Data.BooleanFormula+import GHC.Types.Name.Reader ( rdrNameOcc )++-- | Pretty print a declaration+ppDecl :: Bool -- ^ print summary info only+ -> LinksInfo -- ^ link information+ -> LHsDecl DocNameI -- ^ declaration to print+ -> [(HsDecl DocNameI, DocForDecl DocName)] -- ^ relevant pattern synonyms+ -> DocForDecl DocName -- ^ documentation for this decl+ -> [DocInstance DocNameI] -- ^ relevant instances+ -> [(DocName, Fixity)] -- ^ relevant fixities+ -> [(DocName, DocForDecl DocName)] -- ^ documentation for all decls+ -> Splice+ -> Unicode -- ^ unicode output+ -> Maybe Package+ -> Qualification+ -> Html+ppDecl summ links (L loc decl) pats (mbDoc, fnArgsDoc) instances fixities subdocs splice unicode pkg qual = case decl of+ TyClD _ (FamDecl _ d) -> ppFamDecl summ False links instances fixities (locA loc) mbDoc d splice unicode pkg qual+ TyClD _ d@(DataDecl {}) -> ppDataDecl summ links instances fixities subdocs (locA loc) mbDoc d pats splice unicode pkg qual+ TyClD _ d@(SynDecl {}) -> ppTySyn summ links fixities (locA loc) (mbDoc, fnArgsDoc) d splice unicode pkg qual+ TyClD _ d@(ClassDecl {}) -> ppClassDecl summ links instances fixities (locA loc) mbDoc subdocs d splice unicode pkg qual+ SigD _ (TypeSig _ lnames lty) -> ppLFunSig summ links (locA loc) (mbDoc, fnArgsDoc) lnames+ (dropWildCards lty) fixities splice unicode pkg qual+ SigD _ (PatSynSig _ lnames lty) -> ppLPatSig summ links (locA loc) (mbDoc, fnArgsDoc) lnames+ lty fixities splice unicode pkg qual+ ForD _ d -> ppFor summ links (locA loc) (mbDoc, fnArgsDoc) d fixities splice unicode pkg qual+ InstD _ _ -> noHtml+ DerivD _ _ -> noHtml+ _ -> error "declaration not supported by ppDecl"+++ppLFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName ->+ [LocatedN DocName] -> LHsSigType DocNameI -> [(DocName, Fixity)] ->+ Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppLFunSig summary links loc doc lnames lty fixities splice unicode pkg qual =+ ppFunSig summary links loc noHtml doc (map unLoc lnames) lty fixities+ splice unicode pkg qual++ppFunSig :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName ->+ [DocName] -> LHsSigType DocNameI -> [(DocName, Fixity)] ->+ Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppFunSig summary links loc leader doc docnames typ fixities splice unicode pkg qual =+ ppSigLike summary links loc leader doc docnames fixities (unLoc typ, pp_typ)+ splice unicode pkg qual HideEmptyContexts+ where+ pp_typ = ppLSigType unicode qual HideEmptyContexts typ++-- | Pretty print a pattern synonym+ppLPatSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName+ -> [LocatedN DocName] -- ^ names of patterns in declaration+ -> LHsSigType DocNameI -- ^ type of patterns in declaration+ -> [(DocName, Fixity)]+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppLPatSig summary links loc doc lnames typ fixities splice unicode pkg qual =+ ppSigLike summary links loc (keyword "pattern") doc (map unLoc lnames) fixities+ (unLoc typ, pp_typ) splice unicode pkg qual (patSigContext typ)+ where+ pp_typ = ppPatSigType unicode qual typ+++ppSigLike :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName ->+ [DocName] -> [(DocName, Fixity)] -> (HsSigType DocNameI, Html) ->+ Splice -> Unicode -> Maybe Package -> Qualification -> HideEmptyContexts -> Html+ppSigLike summary links loc leader doc docnames fixities (typ, pp_typ)+ splice unicode pkg qual emptyCtxts =+ ppTypeOrFunSig summary links loc docnames typ doc+ ( addFixities $ leader <+> ppTypeSig summary occnames pp_typ unicode+ , (leader <+>) . addFixities . concatHtml . punctuate comma $ map (ppBinder False) occnames+ , dcolon unicode+ )+ splice unicode pkg qual emptyCtxts+ where+ occnames = map (nameOccName . getName) docnames+ addFixities html+ | summary = html+ | otherwise = html <+> ppFixities fixities qual+++ppTypeOrFunSig :: Bool -> LinksInfo -> SrcSpan -> [DocName] -> HsSigType DocNameI+ -> DocForDecl DocName -> (Html, Html, Html)+ -> Splice -> Unicode -> Maybe Package -> Qualification+ -> HideEmptyContexts -> Html+ppTypeOrFunSig summary links loc docnames typ (doc, argDocs) (pref1, pref2, sep)+ splice unicode pkg qual emptyCtxts+ | summary = pref1+ | Map.null argDocs = topDeclElem links loc splice docnames pref1 +++ docSection curname pkg qual doc+ | otherwise = topDeclElem links loc splice docnames pref2+ +++ subArguments pkg qual (ppSubSigLike unicode qual typ argDocs [] sep emptyCtxts)+ +++ docSection curname pkg qual doc+ where+ curname = getName <$> listToMaybe docnames+++-- | This splits up a type signature along @->@ and adds docs (when they exist)+-- to the arguments.+--+-- If one passes in a list of the available subdocs, any top-level `HsRecTy`+-- found will be expanded out into their fields.+ppSubSigLike :: Unicode -> Qualification+ -> HsSigType DocNameI -- ^ type signature+ -> FnArgsDoc DocName -- ^ docs to add+ -> [(DocName, DocForDecl DocName)] -- ^ all subdocs (useful when+ -- we expand an `HsRecTy`)+ -> Html -> HideEmptyContexts -> [SubDecl]+ppSubSigLike unicode qual typ argDocs subdocs sep emptyCtxts = do_sig_args 0 sep typ+ where+ do_sig_args :: Int -> Html -> HsSigType DocNameI -> [SubDecl]+ do_sig_args n leader (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) =+ case outer_bndrs of+ HsOuterExplicit{hso_bndrs = bndrs} -> do_largs n (leader' bndrs) ltype+ HsOuterImplicit{} -> do_largs n leader ltype+ where+ leader' bndrs = leader <+> ppForAllPart unicode qual (mkHsForAllInvisTeleI bndrs)++ argDoc n = Map.lookup n argDocs++ do_largs :: Int -> Html -> LHsType DocNameI -> [SubDecl]+ do_largs n leader (L _ t) = do_args n leader t++ do_args :: Int -> Html -> HsType DocNameI -> [SubDecl]+ do_args n leader (HsForAllTy _ tele ltype)+ = do_largs n leader' ltype+ where+ leader' = leader <+> ppForAllPart unicode qual tele++ do_args n leader (HsQualTy _ lctxt ltype)+ | null (unLoc lctxt)+ = do_largs n leader ltype+ | otherwise+ = (leader <+> ppLContextNoArrow lctxt unicode qual emptyCtxts, Nothing, [])+ : do_largs n (darrow unicode) ltype++ do_args n leader (HsFunTy _ _w (L _ (HsRecTy _ fields)) r)+ = [ (ldr <+> html, mdoc, subs)+ | (L _ field, ldr) <- zip fields (leader <+> gadtOpen : repeat gadtComma)+ , let (html, mdoc, subs) = ppSideBySideField subdocs unicode qual field+ ]+ ++ do_largs (n+1) (gadtEnd <+> arrow unicode) r++ do_args n leader (HsFunTy _ _w lt r)+ = (leader <+> ppLFunLhType unicode qual emptyCtxts lt, argDoc n, [])+ : do_largs (n+1) (arrow unicode) r++ do_args n leader t+ = [(leader <+> ppType unicode qual emptyCtxts t, argDoc n, [])]+++ -- FIXME: this should be done more elegantly+ --+ -- We need 'gadtComma' and 'gadtEnd' to line up with the `{` from+ -- 'gadtOpen', so we add 3 spaces to cover for `-> `/`:: ` (3 in unicode+ -- mode since `->` and `::` are rendered as single characters.+ gadtComma = concatHtml (replicate (if unicode then 2 else 3) spaceHtml) <> toHtml ","+ gadtEnd = concatHtml (replicate (if unicode then 2 else 3) spaceHtml) <> toHtml "}"+ gadtOpen = toHtml "{"+++ppFixities :: [(DocName, Fixity)] -> Qualification -> Html+ppFixities [] _ = noHtml+ppFixities fs qual = foldr1 (+++) (map ppFix uniq_fs) +++ rightEdge+ where+ ppFix (ns, p, d) = thespan ! [theclass "fixity"] <<+ (toHtml d <+> toHtml (show p) <+> ppNames ns)++ ppDir InfixR = "infixr"+ ppDir InfixL = "infixl"+ ppDir InfixN = "infix"++ ppNames = case fs of+ _:[] -> const noHtml -- Don't display names for fixities on single names+ _ -> concatHtml . intersperse (stringToHtml ", ") . map (ppDocName qual Infix False)++ uniq_fs = [ (n, the p, the d') | (n, Fixity _ p d) <- fs+ , let d' = ppDir d+ , then group by Down (p,d') using groupWith ]++ rightEdge = thespan ! [theclass "rightedge"] << noHtml+++-- | Pretty-print type variables.+ppTyVars :: RenderableBndrFlag flag =>+ Unicode -> Qualification -> [LHsTyVarBndr flag DocNameI] -> [Html]+ppTyVars unicode qual tvs = map (ppHsTyVarBndr unicode qual . unLoc) tvs+++ppFor :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName+ -> ForeignDecl DocNameI -> [(DocName, Fixity)]+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppFor summary links loc doc (ForeignImport _ (L _ name) typ _) fixities+ splice unicode pkg qual+ = ppFunSig summary links loc noHtml doc [name] typ fixities splice unicode pkg qual+ppFor _ _ _ _ _ _ _ _ _ _ = error "ppFor"+++-- we skip type patterns for now+ppTySyn :: Bool -> LinksInfo -> [(DocName, Fixity)] -> SrcSpan+ -> DocForDecl DocName -> TyClDecl DocNameI+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppTySyn summary links fixities loc doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars+ , tcdRhs = ltype })+ splice unicode pkg qual+ = ppTypeOrFunSig summary links loc [name] sig_type doc+ (full <+> fixs, hdr <+> fixs, spaceHtml +++ equals)+ splice unicode pkg qual ShowEmptyToplevelContexts+ where+ sig_type = mkHsImplicitSigTypeI ltype+ hdr = hsep ([keyword "type", ppBinder summary occ]+ ++ ppTyVars unicode qual (hsQTvExplicit ltyvars))+ full = hdr <+> equals <+> ppPatSigType unicode qual (noLocA sig_type)+ occ = nameOccName . getName $ name+ fixs+ | summary = noHtml+ | otherwise = ppFixities fixities qual+ppTySyn _ _ _ _ _ _ _ _ _ _ = error "declaration not supported by ppTySyn"+++ppTypeSig :: Bool -> [OccName] -> Html -> Unicode -> Html+ppTypeSig summary nms pp_ty unicode =+ concatHtml htmlNames <+> dcolon unicode <+> pp_ty+ where+ htmlNames = intersperse (stringToHtml ", ") $ map (ppBinder summary) nms++ppSimpleSig :: LinksInfo -> Splice -> Unicode -> Qualification -> HideEmptyContexts -> SrcSpan+ -> [DocName] -> HsSigType DocNameI+ -> Html+ppSimpleSig links splice unicode qual emptyCtxts loc names typ =+ topDeclElem' names $ ppTypeSig True occNames ppTyp unicode+ where+ topDeclElem' = topDeclElem links loc splice+ ppTyp = ppSigType unicode qual emptyCtxts typ+ occNames = map getOccName names+++--------------------------------------------------------------------------------+-- * Type families+--------------------------------------------------------------------------------+++-- | Print a data\/type family declaration+ppFamDecl :: Bool -- ^ is a summary+ -> Bool -- ^ is an associated type+ -> LinksInfo+ -> [DocInstance DocNameI] -- ^ relevant instances+ -> [(DocName, Fixity)] -- ^ relevant fixities+ -> SrcSpan+ -> Documentation DocName -- ^ this decl's documentation+ -> FamilyDecl DocNameI -- ^ this decl+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppFamDecl summary associated links instances fixities loc doc decl splice unicode pkg qual+ | summary = ppFamHeader True associated decl unicode qual+ | otherwise = header_ +++ docSection curname pkg qual doc +++ instancesBit++ where+ docname = unLoc $ fdLName decl+ curname = Just $ getName docname++ header_ = topDeclElem links loc splice [docname] $+ ppFamHeader summary associated decl unicode qual <+> ppFixities fixities qual++ instancesBit+ | FamilyDecl { fdInfo = ClosedTypeFamily mb_eqns } <- decl+ , not summary+ = subEquations pkg qual $ map (ppFamDeclEqn . unLoc) $ fromMaybe [] mb_eqns++ | otherwise+ = ppInstances links (OriginFamily docname) instances splice unicode pkg qual++ -- Individual equation of a closed type family+ ppFamDeclEqn :: TyFamInstEqn DocNameI -> SubDecl+ ppFamDeclEqn (FamEqn { feqn_tycon = L _ n+ , feqn_rhs = rhs+ , feqn_pats = ts })+ = ( ppAppNameTypeArgs n ts unicode qual+ <+> equals <+> ppType unicode qual HideEmptyContexts (unLoc rhs)+ , Nothing+ , []+ )+++-- | Print a pseudo family declaration+ppPseudoFamDecl :: LinksInfo -> Splice+ -> PseudoFamilyDecl DocNameI -- ^ this decl+ -> Unicode -> Qualification -> Html+ppPseudoFamDecl links splice+ (PseudoFamilyDecl { pfdInfo = info+ , pfdKindSig = L _ kindSig+ , pfdTyVars = tvs+ , pfdLName = L loc name })+ unicode qual =+ topDeclElem links (locA loc) splice [name] leader+ where+ leader = hsep [ ppFamilyLeader True info+ , ppAppNameTypes name (map unLoc tvs) unicode qual+ , ppResultSig kindSig unicode qual+ ]++-- | Print the LHS of a type\/data family declaration+ppFamHeader :: Bool -- ^ is a summary+ -> Bool -- ^ is an associated type+ -> FamilyDecl DocNameI -- ^ family declaration+ -> Unicode -> Qualification -> Html+ppFamHeader summary associated (FamilyDecl { fdInfo = info+ , fdResultSig = L _ result+ , fdInjectivityAnn = injectivity+ , fdLName = L _ name+ , fdTyVars = tvs })+ unicode qual =+ hsep [ ppFamilyLeader associated info+ , ppAppDocNameTyVarBndrs summary unicode qual name (hsq_explicit tvs)+ , ppResultSig result unicode qual+ , injAnn+ , whereBit+ ]+ where+ whereBit = case info of+ ClosedTypeFamily _ -> keyword "where ..."+ _ -> noHtml++ injAnn = case injectivity of+ Nothing -> noHtml+ Just (L _ (InjectivityAnn _ lhs rhs)) -> hsep ( keyword "|"+ : ppLDocName qual Raw lhs+ : arrow unicode+ : map (ppLDocName qual Raw) rhs)+ Just _ -> error "ppFamHeader:XInjectivityAnn"++-- | Print the keywords that begin the family declaration+ppFamilyLeader :: Bool -> FamilyInfo DocNameI -> Html+ppFamilyLeader assoc info = keyword (typ ++ if assoc then "" else " family")+ where+ typ = case info of+ OpenTypeFamily -> "type"+ ClosedTypeFamily _ -> "type"+ DataFamily -> "data"++-- | Print the signature attached to a family+ppResultSig :: FamilyResultSig DocNameI -> Unicode -> Qualification -> Html+ppResultSig result unicode qual = case result of+ NoSig _ -> noHtml+ KindSig _ kind -> dcolon unicode <+> ppLKind unicode qual kind+ TyVarSig _ (L _ bndr) -> equals <+> ppHsTyVarBndr unicode qual bndr+++--------------------------------------------------------------------------------+-- * Associated Types+--------------------------------------------------------------------------------+++ppAssocType :: Bool -> LinksInfo -> DocForDecl DocName -> LFamilyDecl DocNameI+ -> [(DocName, Fixity)] -> Splice -> Unicode -> Maybe Package+ -> Qualification -> Html+ppAssocType summ links doc (L loc decl) fixities splice unicode pkg qual =+ ppFamDecl summ True links [] fixities loc (fst doc) decl splice unicode pkg qual+++--------------------------------------------------------------------------------+-- * Type applications+--------------------------------------------------------------------------------++ppAppDocNameTyVarBndrs :: RenderableBndrFlag flag =>+ Bool -> Unicode -> Qualification -> DocName -> [LHsTyVarBndr flag DocNameI] -> Html+ppAppDocNameTyVarBndrs summ unicode qual n vs =+ ppTypeApp n vs ppDN (ppHsTyVarBndr unicode qual . unLoc)+ where+ ppDN notation = ppBinderFixity notation summ . nameOccName . getName+ ppBinderFixity Infix = ppBinderInfix+ ppBinderFixity _ = ppBinder++-- | Print an application of a 'DocName' to its list of 'HsType's+ppAppNameTypes :: DocName -> [HsType DocNameI] -> Unicode -> Qualification -> Html+ppAppNameTypes n ts unicode qual =+ ppTypeApp n ts (\p -> ppDocName qual p True) (ppParendType unicode qual HideEmptyContexts)++ppAppNameTypeArgs :: DocName -> [LHsTypeArg DocNameI] -> Unicode -> Qualification -> Html+ppAppNameTypeArgs n args@(HsValArg _:HsValArg _:_) u q+ = ppTypeApp n args (\p -> ppDocName q p True) (ppLHsTypeArg u q HideEmptyContexts)+ppAppNameTypeArgs n args u q+ = (ppDocName q Prefix True n) <+> hsep (map (ppLHsTypeArg u q HideEmptyContexts) args)++-- | General printing of type applications+ppTypeApp :: DocName -> [a] -> (Notation -> DocName -> Html) -> (a -> Html) -> Html+ppTypeApp n (t1:t2:rest) ppDN ppT+ | operator, not . null $ rest = parens opApp <+> hsep (map ppT rest)+ | operator = opApp+ where+ operator = isNameSym . getName $ n+ opApp = ppT t1 <+> ppDN Infix n <+> ppT t2++ppTypeApp n ts ppDN ppT = ppDN Prefix n <+> hsep (map ppT ts)++-------------------------------------------------------------------------------+-- * Contexts+-------------------------------------------------------------------------------+++ppLContext :: Maybe (LHsContext DocNameI) -> Unicode+ -> Qualification -> HideEmptyContexts -> Html+ppLContext Nothing u q h = ppContext [] u q h+ppLContext (Just c) u q h = ppContext (unLoc c) u q h++ppLContextNoArrow :: LHsContext DocNameI -> Unicode+ -> Qualification -> HideEmptyContexts -> Html+ppLContextNoArrow c u q h = ppContextNoArrow (unLoc c) u q h++ppContextNoArrow :: HsContext DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppContextNoArrow cxt unicode qual emptyCtxts = fromMaybe noHtml $+ ppContextNoLocsMaybe (map unLoc cxt) unicode qual emptyCtxts+++ppContextNoLocs :: [HsType DocNameI] -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppContextNoLocs cxt unicode qual emptyCtxts = maybe noHtml (<+> darrow unicode) $+ ppContextNoLocsMaybe cxt unicode qual emptyCtxts+++ppContextNoLocsMaybe :: [HsType DocNameI] -> Unicode -> Qualification -> HideEmptyContexts -> Maybe Html+ppContextNoLocsMaybe [] _ _ emptyCtxts =+ case emptyCtxts of+ HideEmptyContexts -> Nothing+ ShowEmptyToplevelContexts -> Just (toHtml "()")+ppContextNoLocsMaybe cxt unicode qual _ = Just $ ppHsContext cxt unicode qual++ppContext :: HsContext DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppContext cxt unicode qual emptyCtxts = ppContextNoLocs (map unLoc cxt) unicode qual emptyCtxts+++ppHsContext :: [HsType DocNameI] -> Unicode -> Qualification -> Html+ppHsContext [] _ _ = noHtml+ppHsContext [p] unicode qual = ppCtxType unicode qual p+ppHsContext cxt unicode qual = parenList (map (ppType unicode qual HideEmptyContexts) cxt)+++-------------------------------------------------------------------------------+-- * Class declarations+-------------------------------------------------------------------------------+++ppClassHdr :: Bool -> Maybe (LocatedC [LHsType DocNameI]) -> DocName+ -> LHsQTyVars DocNameI -> [LHsFunDep DocNameI]+ -> Unicode -> Qualification -> Html+ppClassHdr summ lctxt n tvs fds unicode qual =+ keyword "class"+ <+> (if not (null $ fromMaybeContext lctxt) then ppLContext lctxt unicode qual HideEmptyContexts else noHtml)+ <+> ppAppDocNameTyVarBndrs summ unicode qual n (hsQTvExplicit tvs)+ <+> ppFds fds unicode qual+++ppFds :: [LHsFunDep DocNameI] -> Unicode -> Qualification -> Html+ppFds fds unicode qual =+ if null fds then noHtml else+ char '|' <+> hsep (punctuate comma (map (fundep . unLoc) fds))+ where+ fundep (FunDep _ vars1 vars2) = ppVars vars1 <+> arrow unicode <+> ppVars vars2+ fundep (XFunDep _) = error "ppFds"+ ppVars = hsep . map ((ppDocName qual Prefix True) . unLoc)++ppShortClassDecl :: Bool -> LinksInfo -> TyClDecl DocNameI -> SrcSpan+ -> [(DocName, DocForDecl DocName)]+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppShortClassDecl summary links (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, tcdTyVars = tvs+ , tcdFDs = fds, tcdSigs = sigs, tcdATs = ats }) loc+ subdocs splice unicode pkg qual =+ if not (any isUserLSig sigs) && null ats+ then (if summary then id else topDeclElem links loc splice [nm]) hdr+ else (if summary then id else topDeclElem links loc splice [nm]) (hdr <+> keyword "where")+ +++ shortSubDecls False+ (+ [ ppAssocType summary links doc at [] splice unicode pkg qual | at <- ats+ , let doc = lookupAnySubdoc (unL $ fdLName $ unL at) subdocs ] ++++ -- ToDo: add associated type defaults++ [ ppFunSig summary links loc noHtml doc names typ+ [] splice unicode pkg qual+ | L _ (ClassOpSig _ False lnames typ) <- sigs+ , let doc = lookupAnySubdoc (head names) subdocs+ names = map unLoc lnames ]+ -- FIXME: is taking just the first name ok? Is it possible that+ -- there are different subdocs for different names in a single+ -- type signature?+ )+ where+ hdr = ppClassHdr summary lctxt (unLoc lname) tvs fds unicode qual+ nm = unLoc lname+ppShortClassDecl _ _ _ _ _ _ _ _ _ = error "declaration type not supported by ppShortClassDecl"++++ppClassDecl :: Bool -> LinksInfo -> [DocInstance DocNameI] -> [(DocName, Fixity)]+ -> SrcSpan -> Documentation DocName+ -> [(DocName, DocForDecl DocName)] -> TyClDecl DocNameI+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppClassDecl summary links instances fixities loc d subdocs+ decl@(ClassDecl { tcdCtxt = lctxt, tcdLName = lname, tcdTyVars = ltyvars+ , tcdFDs = lfds, tcdSigs = lsigs, tcdATs = ats, tcdATDefs = atsDefs })+ splice unicode pkg qual+ | summary = ppShortClassDecl summary links decl loc subdocs splice unicode pkg qual+ | otherwise = classheader +++ docSection curname pkg qual d+ +++ minimalBit +++ atBit +++ methodBit +++ instancesBit+ where+ curname = Just $ getName nm++ sigs = map unLoc lsigs++ classheader+ | any isUserLSig lsigs = topDeclElem links loc splice [nm] (hdr unicode qual <+> keyword "where" <+> fixs)+ | otherwise = topDeclElem links loc splice [nm] (hdr unicode qual <+> fixs)++ -- Only the fixity relevant to the class header+ fixs = ppFixities [ f | f@(n,_) <- fixities, n == unLoc lname ] qual++ nm = tcdNameI decl++ hdr = ppClassHdr summary lctxt (unLoc lname) ltyvars lfds++ -- Associated types+ atBit = subAssociatedTypes+ [ ppAssocType summary links doc at subfixs splice unicode pkg qual+ <+>+ subDefaults (maybeToList defTys)+ | at <- ats+ , let name = unLoc . fdLName $ unLoc at+ doc = lookupAnySubdoc name subdocs+ subfixs = filter ((== name) . fst) fixities+ defTys = (declElem . ppDefaultAssocTy name) <$> lookupDAT name+ ]++ -- Default associated types+ ppDefaultAssocTy n (vs,rhs) = hsep+ [ keyword "type", ppAppNameTypeArgs n vs unicode qual, equals+ , ppType unicode qual HideEmptyContexts (unLoc rhs)+ ]++ lookupDAT name = Map.lookup (getName name) defaultAssocTys+ defaultAssocTys = Map.fromList+ [ (getName name, (vs, typ))+ | L _ (TyFamInstDecl _ (FamEqn { feqn_rhs = typ+ , feqn_tycon = L _ name+ , feqn_pats = vs })) <- atsDefs+ ]++ -- Methods+ methodBit = subMethods+ [ ppFunSig summary links loc noHtml doc [name] typ+ subfixs splice unicode pkg qual+ <+>+ subDefaults (maybeToList defSigs)+ | ClassOpSig _ False lnames typ <- sigs+ , name <- map unLoc lnames+ , let doc = lookupAnySubdoc name subdocs+ subfixs = filter ((== name) . fst) fixities+ defSigs = ppDefaultFunSig name <$> lookupDM name+ ]+ -- N.B. taking just the first name is ok. Signatures with multiple names+ -- are expanded so that each name gets its own signature.++ -- Default methods+ ppDefaultFunSig n (t, d') = ppFunSig summary links loc (keyword "default")+ d' [n] t [] splice unicode pkg qual++ lookupDM name = Map.lookup (getOccString name) defaultMethods+ defaultMethods = Map.fromList+ [ (nameStr, (typ, doc))+ | ClassOpSig _ True lnames typ <- sigs+ , name <- map unLoc lnames+ , let doc = noDocForDecl -- TODO: get docs for method defaults+ nameStr = getOccString name+ ]++ -- Minimal complete definition+ minimalBit = case [ s | MinimalSig _ (L _ s) <- sigs ] of+ -- Miminal complete definition = every shown method+ And xs : _ | sort [getName n | L _ (Var (L _ n)) <- xs] ==+ sort [getName n | ClassOpSig _ _ ns _ <- sigs, L _ n <- ns]+ -> noHtml++ -- Minimal complete definition = the only shown method+ Var (L _ n) : _ | [getName n] ==+ [getName n' | L _ (ClassOpSig _ _ ns _) <- lsigs, L _ n' <- ns]+ -> noHtml++ -- Minimal complete definition = nothing+ And [] : _ -> subMinimal $ toHtml "Nothing"++ m : _ -> subMinimal $ ppMinimal False m+ _ -> noHtml++ ppMinimal _ (Var (L _ n)) = ppDocName qual Prefix True n+ ppMinimal _ (And fs) = foldr1 (\a b -> a+++", "+++b) $ map (ppMinimal True . unLoc) fs+ ppMinimal p (Or fs) = wrap $ foldr1 (\a b -> a+++" | "+++b) $ map (ppMinimal False . unLoc) fs+ where wrap | p = parens | otherwise = id+ ppMinimal p (Parens x) = ppMinimal p (unLoc x)++ -- Instances+ instancesBit = ppInstances links (OriginClass nm) instances+ splice unicode pkg qual++ppClassDecl _ _ _ _ _ _ _ _ _ _ _ _ = error "declaration type not supported by ppShortClassDecl"+++ppInstances :: LinksInfo+ -> InstOrigin DocName -> [DocInstance DocNameI]+ -> Splice -> Unicode -> Maybe Package -> Qualification+ -> Html+ppInstances links origin instances splice unicode pkg qual+ = subInstances pkg qual instName links True (zipWith instDecl [1..] instances)+ -- force Splice = True to use line URLs+ where+ instName = getOccString origin+ instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)+ instDecl no (inst, mdoc, loc, mdl) =+ ((ppInstHead links splice unicode qual mdoc origin False no inst mdl), mdl, loc)+++ppOrphanInstances :: LinksInfo+ -> [DocInstance DocNameI]+ -> Splice -> Unicode -> Maybe Package -> Qualification+ -> Html+ppOrphanInstances links instances splice unicode pkg qual+ = subOrphanInstances pkg qual links True (zipWith instDecl [1..] instances)+ where+ instOrigin :: InstHead name -> InstOrigin (IdP name)+ instOrigin inst = OriginClass (ihdClsName inst)++ instDecl :: Int -> DocInstance DocNameI -> (SubDecl, Maybe Module, Located DocName)+ instDecl no (inst, mdoc, loc, mdl) =+ ((ppInstHead links splice unicode qual mdoc (instOrigin inst) True no inst Nothing), mdl, loc)+++ppInstHead :: LinksInfo -> Splice -> Unicode -> Qualification+ -> Maybe (MDoc DocName)+ -> InstOrigin DocName+ -> Bool -- ^ Is instance orphan+ -> Int -- ^ Normal+ -> InstHead DocNameI+ -> Maybe Module+ -> SubDecl+ppInstHead links splice unicode qual mdoc origin orphan no ihd@(InstHead {..}) mdl =+ case ihdInstType of+ ClassInst { .. } ->+ ( subInstHead iid $ ppContextNoLocs clsiCtx unicode qual HideEmptyContexts <+> typ+ , mdoc+ , [subInstDetails iid ats sigs mname]+ )+ where+ sigs = ppInstanceSigs links splice unicode qual clsiSigs+ ats = ppInstanceAssocTys links splice unicode qual clsiAssocTys+ TypeInst rhs ->+ ( subInstHead iid ptype+ , mdoc+ , [subFamInstDetails iid prhs mname]+ )+ where+ ptype = keyword "type" <+> typ+ prhs = ptype <+> maybe noHtml+ (\t -> equals <+> ppType unicode qual HideEmptyContexts t) rhs+ DataInst dd ->+ ( subInstHead iid pdata+ , mdoc+ , [subFamInstDetails iid pdecl mname])+ where+ cons = dd_cons (tcdDataDefn dd)+ pref = case cons of { NewTypeCon _ -> keyword "newtype"; DataTypeCons _ _ -> keyword "data" }+ pdata = pref <+> typ+ pdecl = pdata <+> ppShortDataDecl False True dd [] unicode qual+ where+ mname = maybe noHtml (\m -> toHtml "Defined in" <+> ppModule m) mdl+ iid = instanceId origin no orphan ihd+ typ = ppAppNameTypes ihdClsName ihdTypes unicode qual+++ppInstanceAssocTys :: LinksInfo -> Splice -> Unicode -> Qualification+ -> [PseudoFamilyDecl DocNameI]+ -> [Html]+ppInstanceAssocTys links splice unicode qual =+ map (\pseudo -> ppPseudoFamDecl links splice pseudo unicode qual)+++ppInstanceSigs :: LinksInfo -> Splice -> Unicode -> Qualification+ -> [Sig DocNameI]+ -> [Html]+ppInstanceSigs links splice unicode qual sigs = do+ TypeSig _ lnames typ <- sigs+ let names = map unLoc lnames+ L _ rtyp = dropWildCards typ+ -- Instance methods signatures are synified and thus don't have a useful+ -- SrcSpan value. Use the methods name location instead.+ return $ ppSimpleSig links splice unicode qual HideEmptyContexts (getLocA $ head lnames) names rtyp+++lookupAnySubdoc :: Eq id1 => id1 -> [(id1, DocForDecl id2)] -> DocForDecl id2+lookupAnySubdoc n = fromMaybe noDocForDecl . lookup n+++instanceId :: InstOrigin DocName -> Int -> Bool -> InstHead DocNameI -> String+instanceId origin no orphan ihd = concat $+ [ "o:" | orphan ] +++ [ qual origin+ , ":" ++ getOccString origin+ , ":" ++ getOccString (ihdClsName ihd)+ , ":" ++ show no+ ]+ where+ qual (OriginClass _) = "ic"+ qual (OriginData _) = "id"+ qual (OriginFamily _) = "if"+++-------------------------------------------------------------------------------+-- * Data & newtype declarations+-------------------------------------------------------------------------------+++-- TODO: print contexts+ppShortDataDecl :: Bool -> Bool -> TyClDecl DocNameI+ -> [(HsDecl DocNameI, DocForDecl DocName)]+ -> Unicode -> Qualification -> Html+ppShortDataDecl summary dataInst dataDecl pats unicode qual++ | [] <- toList cons+ , [] <- pats = dataHeader++ | [lcon] <- toList cons, [] <- pats, isH98,+ (cHead,cBody,cFoot) <- ppShortConstrParts summary dataInst (unLoc lcon) unicode qual+ = (dataHeader <+> equals <+> cHead) +++ cBody +++ cFoot++ | [] <- pats, isH98 = dataHeader+ +++ shortSubDecls dataInst (zipWith doConstr ('=':repeat '|') (toList cons) ++ pats1)++ | otherwise = (dataHeader <+> keyword "where")+ +++ shortSubDecls dataInst (map doGADTConstr (toList cons) ++ pats1)++ where+ dataHeader+ | dataInst = noHtml+ | otherwise = ppDataHeader summary dataDecl unicode qual+ doConstr c con = toHtml [c] <+> ppShortConstr summary (unLoc con) unicode qual+ doGADTConstr con = ppShortConstr summary (unLoc con) unicode qual++ cons = dd_cons (tcdDataDefn dataDecl)+ isH98 = flip any (unLoc <$> cons) $ \ case+ ConDeclH98 {} -> True+ ConDeclGADT{} -> False++ pats1 = [ hsep [ keyword "pattern"+ , hsep $ punctuate comma $ map (ppBinder summary . getOccName) lnames+ , dcolon unicode+ , ppPatSigType unicode qual typ+ ]+ | (SigD _ (PatSynSig _ lnames typ),_) <- pats+ ]+++-- | Pretty-print a data declaration+ppDataDecl :: Bool -> LinksInfo+ -> [DocInstance DocNameI] -- ^ relevant instances+ -> [(DocName, Fixity)] -- ^ relevant fixities+ -> [(DocName, DocForDecl DocName)] -- ^ all decl documentation+ -> SrcSpan+ -> Documentation DocName -- ^ this decl's documentation+ -> TyClDecl DocNameI -- ^ this decl+ -> [(HsDecl DocNameI, DocForDecl DocName)] -- ^ relevant patterns+ -> Splice -> Unicode -> Maybe Package -> Qualification -> Html+ppDataDecl summary links instances fixities subdocs loc doc dataDecl pats+ splice unicode pkg qual++ | summary = ppShortDataDecl summary False dataDecl pats unicode qual+ | otherwise = header_ +++ docSection curname pkg qual doc +++ constrBit +++ patternBit +++ instancesBit++ where+ docname = tcdNameI dataDecl+ curname = Just $ getName docname+ cons = dd_cons (tcdDataDefn dataDecl)+ isH98 = flip any (unLoc <$> cons) $ \ case+ ConDeclH98 {} -> True+ ConDeclGADT{} -> False++ header_ = topDeclElem links loc splice [docname] $+ ppDataHeader summary dataDecl unicode qual <+> whereBit <+> fix++ fix = ppFixities (filter (\(n,_) -> n == docname) fixities) qual++ whereBit+ | null cons+ , null pats = noHtml+ | isH98 = noHtml+ | otherwise = keyword "where"++ constrBit = subConstructors pkg qual+ [ ppSideBySideConstr subdocs subfixs unicode pkg qual c+ | c <- toList cons+ , let subfixs = filter (\(n,_) -> any (\cn -> cn == n)+ (unL <$> getConNamesI (unLoc c))) fixities+ ]++ patternBit = subPatterns pkg qual+ [ ppSideBySidePat subfixs unicode qual lnames typ d+ | (SigD _ (PatSynSig _ lnames typ), d) <- pats+ , let subfixs = filter (\(n,_) -> any (\cn -> cn == n)+ (map unLoc lnames)) fixities+ ]++ instancesBit = ppInstances links (OriginData docname) instances+ splice unicode pkg qual+++ppShortConstr :: Bool -> ConDecl DocNameI -> Unicode -> Qualification -> Html+ppShortConstr summary con unicode qual = cHead <+> cBody <+> cFoot+ where+ (cHead,cBody,cFoot) = ppShortConstrParts summary False con unicode qual+++-- returns three pieces: header, body, footer so that header & footer can be+-- incorporated into the declaration+ppShortConstrParts :: Bool -> Bool -> ConDecl DocNameI -> Unicode -> Qualification -> (Html, Html, Html)+ppShortConstrParts summary dataInst con unicode qual+ = case con of+ ConDeclH98{ con_args = det+ , con_ex_tvs = tyVars+ , con_forall = forall_+ , con_mb_cxt = cxt+ } -> let context = fromMaybeContext cxt+ header_ = ppConstrHdr forall_ tyVars context unicode qual+ in case det of++ -- Prefix constructor, e.g. 'Just a'+ PrefixCon _ args ->+ ( header_ <+> hsep (ppOcc : map (ppLParendType unicode qual HideEmptyContexts . hsScaledThing) args)+ , noHtml+ , noHtml+ )++ -- Record constructor, e.g. 'Identity { runIdentity :: a }'+ RecCon (L _ fields) ->+ ( header_ +++ ppOcc <+> char '{'+ , shortSubDecls dataInst [ ppShortField summary unicode qual field+ | L _ field <- fields+ ]+ , char '}'+ )++ -- Infix constructor, e.g. 'a :| [a]'+ InfixCon arg1 arg2 ->+ ( header_ <+> hsep [ ppLParendType unicode qual HideEmptyContexts (hsScaledThing arg1)+ , ppOccInfix+ , ppLParendType unicode qual HideEmptyContexts (hsScaledThing arg2)+ ]+ , noHtml+ , noHtml+ )++ -- GADT constructor, e.g. 'Foo :: Int -> Foo'+ ConDeclGADT {} ->+ ( hsep [ ppOcc, dcolon unicode, ppLSigType unicode qual HideEmptyContexts (getGADTConType con) ]+ , noHtml+ , noHtml+ )++ where+ occ = toList $ nameOccName . getName . unL <$> getConNamesI con+ ppOcc = hsep (punctuate comma (map (ppBinder summary) occ))+ ppOccInfix = hsep (punctuate comma (map (ppBinderInfix summary) occ))+++-- | Pretty print an expanded constructor+ppSideBySideConstr :: [(DocName, DocForDecl DocName)] -> [(DocName, Fixity)]+ -> Unicode -> Maybe Package -> Qualification+ -> LConDecl DocNameI -- ^ constructor declaration to print+ -> SubDecl+ppSideBySideConstr subdocs fixities unicode pkg qual (L _ con)+ = ( decl -- Constructor header (name, fixity)+ , mbDoc -- Docs on the whole constructor+ , fieldPart -- Information on the fields (or arguments, if they have docs)+ )+ where+ -- Find the name of a constructors in the decl (`getConName` always returns a non-empty list)+ L _ aConName :| _ = getConNamesI con++ fixity = ppFixities fixities qual+ occ = toList $ nameOccName . getName . unL <$> getConNamesI con++ ppOcc = hsep (punctuate comma (map (ppBinder False) occ))+ ppOccInfix = hsep (punctuate comma (map (ppBinderInfix False) occ))++ -- Extract out the map of of docs corresponding to the constructors arguments+ argDocs = maybe Map.empty snd (lookup aConName subdocs)+ hasArgDocs = not $ Map.null argDocs++ decl = case con of+ ConDeclH98{ con_args = det+ , con_ex_tvs = tyVars+ , con_forall = forall_+ , con_mb_cxt = cxt+ } -> let context = fromMaybeContext cxt+ header_ = ppConstrHdr forall_ tyVars context unicode qual+ in case det of+ -- Prefix constructor, e.g. 'Just a'+ PrefixCon _ args+ | hasArgDocs -> header_ <+> ppOcc <+> fixity+ | otherwise -> hsep [ header_ <+> ppOcc+ , hsep (map (ppLParendType unicode qual HideEmptyContexts . hsScaledThing) args)+ , fixity+ ]++ -- Record constructor, e.g. 'Identity { runIdentity :: a }'+ RecCon _ -> header_ <+> ppOcc <+> fixity++ -- Infix constructor, e.g. 'a :| [a]'+ InfixCon arg1 arg2+ | hasArgDocs -> header_ <+> ppOcc <+> fixity+ | otherwise -> hsep [ header_ <+> ppLParendType unicode qual HideEmptyContexts (hsScaledThing arg1)+ , ppOccInfix+ , ppLParendType unicode qual HideEmptyContexts (hsScaledThing arg2)+ , fixity+ ]++ -- GADT constructor, e.g. 'Foo :: Int -> Foo'+ ConDeclGADT{}+ | hasArgDocs || not (null fieldPart) -> ppOcc <+> fixity+ | otherwise -> hsep [ ppOcc+ , dcolon unicode+ -- ++AZ++ make this prepend "{..}" when it is a record style GADT+ , ppLSigType unicode qual HideEmptyContexts (getGADTConType con)+ , fixity+ ]++ fieldPart = case con of+ ConDeclGADT{con_g_args = con_args'} -> case con_args' of+ -- GADT record declarations+ RecConGADT _ _ -> [ doConstrArgsWithDocs [] ]+ -- GADT prefix data constructors+ PrefixConGADT args | hasArgDocs -> [ doConstrArgsWithDocs args ]+ _ -> []++ ConDeclH98{con_args = con_args'} -> case con_args' of+ -- H98 record declarations+ RecCon (L _ fields) -> [ doRecordFields fields ]+ -- H98 prefix data constructors+ PrefixCon _ args | hasArgDocs -> [ doConstrArgsWithDocs args ]+ -- H98 infix data constructor+ InfixCon arg1 arg2 | hasArgDocs -> [ doConstrArgsWithDocs [arg1,arg2] ]+ _ -> []++ doRecordFields fields = subFields pkg qual+ (map (ppSideBySideField subdocs unicode qual) (map unLoc fields))++ doConstrArgsWithDocs args = subFields pkg qual $ case con of+ ConDeclH98{} ->+ [ (ppLParendType unicode qual HideEmptyContexts arg, mdoc, [])+ | (i, arg) <- zip [0..] (map hsScaledThing args)+ , let mdoc = Map.lookup i argDocs+ ]+ ConDeclGADT{} ->+ ppSubSigLike unicode qual (unLoc (getGADTConType con))+ argDocs subdocs (dcolon unicode) HideEmptyContexts++ -- don't use "con_doc con", in case it's reconstructed from a .hi file,+ -- or also because we want Haddock to do the doc-parsing, not GHC.+ mbDoc = lookup aConName subdocs >>=+ combineDocumentation . fst+++-- ppConstrHdr is for (non-GADT) existentials constructors' syntax+ppConstrHdr+ :: Bool -- ^ print explicit foralls+ -> [LHsTyVarBndr Specificity DocNameI] -- ^ type variables+ -> HsContext DocNameI -- ^ context+ -> Unicode -> Qualification+ -> Html+ppConstrHdr forall_ tvs ctxt unicode qual = ppForall +++ ppCtxt+ where+ ppForall+ | null tvs || not forall_ = noHtml+ | otherwise = ppForAllPart unicode qual (HsForAllInvis noExtField tvs)++ ppCtxt+ | null ctxt = noHtml+ | otherwise = ppContextNoArrow ctxt unicode qual HideEmptyContexts+ <+> darrow unicode +++ toHtml " "+++-- | Pretty-print a record field+ppSideBySideField :: [(DocName, DocForDecl DocName)] -> Unicode -> Qualification+ -> ConDeclField DocNameI -> SubDecl+ppSideBySideField subdocs unicode qual (ConDeclField _ names ltype _) =+ ( hsep (punctuate comma [ ppBinder False (rdrNameOcc field)+ | L _ name <- names+ , let field = (unLoc . foLabel) name+ ])+ <+> dcolon unicode+ <+> ppLType unicode qual HideEmptyContexts ltype+ , mbDoc+ , []+ )+ where+ -- don't use cd_fld_doc for same reason we don't use con_doc above+ -- Where there is more than one name, they all have the same documentation+ mbDoc = lookup (foExt $ unLoc $ head names) subdocs >>= combineDocumentation . fst+++ppShortField :: Bool -> Unicode -> Qualification -> ConDeclField DocNameI -> Html+ppShortField summary unicode qual (ConDeclField _ names ltype _)+ = hsep (punctuate comma (map ((ppBinder summary) . rdrNameOcc . unLoc . foLabel . unLoc) names))+ <+> dcolon unicode <+> ppLType unicode qual HideEmptyContexts ltype+++-- | Pretty print an expanded pattern (for bundled patterns)+ppSideBySidePat :: [(DocName, Fixity)] -> Unicode -> Qualification+ -> [LocatedN DocName] -- ^ pattern name(s)+ -> LHsSigType DocNameI -- ^ type of pattern(s)+ -> DocForDecl DocName -- ^ doc map+ -> SubDecl+ppSideBySidePat fixities unicode qual lnames typ (doc, argDocs) =+ ( decl+ , combineDocumentation doc+ , fieldPart+ )+ where+ hasArgDocs = not $ Map.null argDocs+ fixity = ppFixities fixities qual+ ppOcc = hsep (punctuate comma (map (ppBinder False . getOccName) lnames))++ decl | hasArgDocs = keyword "pattern" <+> ppOcc <+> fixity+ | otherwise = hsep [ keyword "pattern"+ , ppOcc+ , dcolon unicode+ , ppPatSigType unicode qual typ+ , fixity+ ]++ fieldPart+ | not hasArgDocs = []+ | otherwise = [ subFields Nothing qual (ppSubSigLike unicode qual (unLoc typ)+ argDocs [] (dcolon unicode)+ emptyCtxt) ]++ emptyCtxt = patSigContext typ+++-- | Print the LHS of a data\/newtype declaration.+-- Currently doesn't handle 'data instance' decls or kind signatures+ppDataHeader :: Bool -> TyClDecl DocNameI -> Unicode -> Qualification -> Html+ppDataHeader summary (DataDecl { tcdDataDefn =+ HsDataDefn { dd_cons = cons+ , dd_ctxt = ctxt+ , dd_kindSig = ks }+ , tcdLName = L _ name+ , tcdTyVars = tvs })+ unicode qual+ = -- newtype or data+ (case cons of+ { NewTypeCon _ -> keyword "newtype"+ ; DataTypeCons False _ -> keyword "data"+ ; DataTypeCons True _ -> keyword "type" <+> keyword "data"+ })+ <+>+ -- context+ ppLContext ctxt unicode qual HideEmptyContexts <+>+ -- T a b c ..., or a :+: b+ ppAppDocNameTyVarBndrs summary unicode qual name (hsQTvExplicit tvs)+ <+> case ks of+ Nothing -> mempty+ Just (L _ x) -> dcolon unicode <+> ppKind unicode qual x++ppDataHeader _ _ _ _ = error "ppDataHeader: illegal argument"++--------------------------------------------------------------------------------+-- * Types and contexts+--------------------------------------------------------------------------------+++ppBang :: HsSrcBang -> Html+ppBang (HsSrcBang _ _ SrcStrict) = toHtml "!"+ppBang (HsSrcBang _ _ SrcLazy) = toHtml "~"+ppBang _ = noHtml+++tupleParens :: HsTupleSort -> [Html] -> Html+tupleParens HsUnboxedTuple = ubxParenList+tupleParens _ = parenList+++sumParens :: [Html] -> Html+sumParens = ubxSumList++--------------------------------------------------------------------------------+-- * Rendering of HsType+--------------------------------------------------------------------------------++ppLType, ppLParendType, ppLFunLhType :: Unicode -> Qualification -> HideEmptyContexts -> LHsType DocNameI -> Html+ppLType unicode qual emptyCtxts y = ppType unicode qual emptyCtxts (unLoc y)+ppLParendType unicode qual emptyCtxts y = ppParendType unicode qual emptyCtxts (unLoc y)+ppLFunLhType unicode qual emptyCtxts y = ppFunLhType unicode qual emptyCtxts (unLoc y)++ppLSigType :: Unicode -> Qualification -> HideEmptyContexts -> LHsSigType DocNameI -> Html+ppLSigType unicode qual emptyCtxts y = ppSigType unicode qual emptyCtxts (unLoc y)++ppCtxType :: Unicode -> Qualification -> HsType DocNameI -> Html+ppCtxType unicode qual ty = ppr_mono_ty (reparenTypePrec PREC_CTX ty) unicode qual HideEmptyContexts++ppType, ppParendType, ppFunLhType :: Unicode -> Qualification -> HideEmptyContexts -> HsType DocNameI -> Html+ppType unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode qual emptyCtxts+ppParendType unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_CON ty) unicode qual emptyCtxts+ppFunLhType unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode qual emptyCtxts++ppSigType :: Unicode -> Qualification -> HideEmptyContexts -> HsSigType DocNameI -> Html+ppSigType unicode qual emptyCtxts sig_ty = ppr_sig_ty (reparenSigType sig_ty) unicode qual emptyCtxts++ppLHsTypeArg :: Unicode -> Qualification -> HideEmptyContexts -> LHsTypeArg DocNameI -> Html+ppLHsTypeArg unicode qual emptyCtxts (HsValArg ty) = ppLParendType unicode qual emptyCtxts ty+ppLHsTypeArg unicode qual emptyCtxts (HsTypeArg _ ki) = atSign unicode <>+ ppLParendType unicode qual emptyCtxts ki+ppLHsTypeArg _ _ _ (HsArgPar _) = toHtml ""++class RenderableBndrFlag flag where+ ppHsTyVarBndr :: Unicode -> Qualification -> HsTyVarBndr flag DocNameI -> Html++instance RenderableBndrFlag () where+ ppHsTyVarBndr _ qual (UserTyVar _ _ (L _ name)) =+ ppDocName qual Raw False name+ ppHsTyVarBndr unicode qual (KindedTyVar _ _ name kind) =+ parens (ppDocName qual Raw False (unL name) <+> dcolon unicode <+>+ ppLKind unicode qual kind)++instance RenderableBndrFlag Specificity where+ ppHsTyVarBndr _ qual (UserTyVar _ SpecifiedSpec (L _ name)) =+ ppDocName qual Raw False name+ ppHsTyVarBndr _ qual (UserTyVar _ InferredSpec (L _ name)) =+ braces $ ppDocName qual Raw False name+ ppHsTyVarBndr unicode qual (KindedTyVar _ SpecifiedSpec name kind) =+ parens (ppDocName qual Raw False (unL name) <+> dcolon unicode <+>+ ppLKind unicode qual kind)+ ppHsTyVarBndr unicode qual (KindedTyVar _ InferredSpec name kind) =+ braces (ppDocName qual Raw False (unL name) <+> dcolon unicode <+>+ ppLKind unicode qual kind)++ppLKind :: Unicode -> Qualification -> LHsKind DocNameI -> Html+ppLKind unicode qual y = ppKind unicode qual (unLoc y)++ppKind :: Unicode -> Qualification -> HsKind DocNameI -> Html+ppKind unicode qual ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode qual HideEmptyContexts++patSigContext :: LHsSigType DocNameI -> HideEmptyContexts+patSigContext sig_typ | hasNonEmptyContext typ && isFirstContextEmpty typ = ShowEmptyToplevelContexts+ | otherwise = HideEmptyContexts+ where+ typ = sig_body (unLoc sig_typ)++ hasNonEmptyContext t =+ case unLoc t of+ HsForAllTy _ _ s -> hasNonEmptyContext s+ HsQualTy _ cxt s -> if null (unLoc cxt) then hasNonEmptyContext s else True+ HsFunTy _ _ _ s -> hasNonEmptyContext s+ _ -> False+ isFirstContextEmpty t =+ case unLoc t of+ HsForAllTy _ _ s -> isFirstContextEmpty s+ HsQualTy _ cxt _ -> null (unLoc cxt)+ HsFunTy _ _ _ s -> isFirstContextEmpty s+ _ -> False+++-- | Pretty-print a pattern signature (all this does over 'ppLType' is slot in+-- the right 'HideEmptyContext' value)+ppPatSigType :: Unicode -> Qualification -> LHsSigType DocNameI -> Html+ppPatSigType unicode qual typ =+ let emptyCtxts = patSigContext typ in ppLSigType unicode qual emptyCtxts typ++ppHsOuterTyVarBndrs :: RenderableBndrFlag flag+ => Unicode -> Qualification -> HsOuterTyVarBndrs flag DocNameI -> Html+ppHsOuterTyVarBndrs unicode qual outer_bndrs = case outer_bndrs of+ HsOuterImplicit{} -> noHtml+ HsOuterExplicit{hso_bndrs = bndrs} ->+ hsep (forallSymbol unicode : ppTyVars unicode qual bndrs) +++ dot++ppForAllPart :: Unicode -> Qualification -> HsForAllTelescope DocNameI -> Html+ppForAllPart unicode qual tele = case tele of+ HsForAllVis { hsf_vis_bndrs = bndrs } ->+ hsep (forallSymbol unicode : ppTyVars unicode qual bndrs) ++++ spaceHtml +++ arrow unicode+ HsForAllInvis { hsf_invis_bndrs = bndrs } ->+ hsep (forallSymbol unicode : ppTyVars unicode qual bndrs) +++ dot++ppr_sig_ty :: HsSigType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppr_sig_ty (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) unicode qual emptyCtxts+ = ppHsOuterTyVarBndrs unicode qual outer_bndrs <+> ppr_mono_lty ltype unicode qual emptyCtxts++ppr_mono_lty :: LHsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppr_mono_lty ty = ppr_mono_ty (unLoc ty)+++ppr_mono_ty :: HsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html+ppr_mono_ty (HsForAllTy _ tele ty) unicode qual emptyCtxts+ = ppForAllPart unicode qual tele <+> ppr_mono_lty ty unicode qual emptyCtxts++ppr_mono_ty (HsQualTy _ ctxt ty) unicode qual emptyCtxts+ = ppLContext (Just ctxt) unicode qual emptyCtxts <+> ppr_mono_lty ty unicode qual emptyCtxts++-- UnicodeSyntax alternatives+ppr_mono_ty (HsTyVar _ _ (L _ name)) True _ _+ | getOccString (getName name) == "(->)" = toHtml "(→)"++ppr_mono_ty (HsBangTy _ b ty) u q _ =+ ppBang b +++ ppLParendType u q HideEmptyContexts ty+ppr_mono_ty (HsTyVar _ prom (L _ name)) _ q _+ | isPromoted prom = promoQuote (ppDocName q Prefix True name)+ | otherwise = ppDocName q Prefix True name+ppr_mono_ty (HsStarTy _ isUni) u _ _ =+ toHtml (if u || isUni then "★" else "*")+ppr_mono_ty (HsFunTy _ mult ty1 ty2) u q e =+ hsep [ ppr_mono_lty ty1 u q HideEmptyContexts+ , arr <+> ppr_mono_lty ty2 u q e+ ]+ where arr = case mult of+ HsLinearArrow _ -> lollipop u+ HsUnrestrictedArrow _ -> arrow u+ HsExplicitMult _ m _ -> multAnnotation <> ppr_mono_lty m u q e <+> arrow u++ppr_mono_ty (HsTupleTy _ con tys) u q _ =+ tupleParens con (map (ppLType u q HideEmptyContexts) tys)+ppr_mono_ty (HsSumTy _ tys) u q _ =+ sumParens (map (ppLType u q HideEmptyContexts) tys)+ppr_mono_ty (HsKindSig _ ty kind) u q e =+ ppr_mono_lty ty u q e <+> dcolon u <+> ppLKind u q kind+ppr_mono_ty (HsListTy _ ty) u q _ = brackets (ppr_mono_lty ty u q HideEmptyContexts)+ppr_mono_ty (HsIParamTy _ (L _ n) ty) u q _ =+ ppIPName n <+> dcolon u <+> ppr_mono_lty ty u q HideEmptyContexts+ppr_mono_ty (HsSpliceTy v _) _ _ _ = dataConCantHappen v+ppr_mono_ty (HsRecTy {}) _ _ _ = toHtml "{..}"+ -- Can now legally occur in ConDeclGADT, the output here is to provide a+ -- placeholder in the signature, which is followed by the field+ -- declarations.+ppr_mono_ty (XHsType {}) _ _ _ = error "ppr_mono_ty HsCoreTy"+ppr_mono_ty (HsExplicitListTy _ IsPromoted tys) u q _ = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys+ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u q _ = brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys+ppr_mono_ty (HsExplicitTupleTy _ tys) u q _ = promoQuote $ parenList $ map (ppLType u q HideEmptyContexts) tys++ppr_mono_ty (HsAppTy _ fun_ty arg_ty) unicode qual _+ = hsep [ ppr_mono_lty fun_ty unicode qual HideEmptyContexts+ , ppr_mono_lty arg_ty unicode qual HideEmptyContexts ]++ppr_mono_ty (HsAppKindTy _ fun_ty arg_ki) unicode qual _+ = hsep [ppr_mono_lty fun_ty unicode qual HideEmptyContexts+ , atSign unicode <> ppr_mono_lty arg_ki unicode qual HideEmptyContexts]++ppr_mono_ty (HsOpTy _ prom ty1 op ty2) unicode qual _+ = ppr_mono_lty ty1 unicode qual HideEmptyContexts <+> ppr_op_prom <+> ppr_mono_lty ty2 unicode qual HideEmptyContexts+ where+ ppr_op_prom+ | isPromoted prom+ = promoQuote ppr_op+ | otherwise+ = ppr_op+ ppr_op = ppLDocName qual Infix op++ppr_mono_ty (HsParTy _ ty) unicode qual emptyCtxts+ = parens (ppr_mono_lty ty unicode qual emptyCtxts)+-- = parens (ppr_mono_lty ctxt_prec ty unicode qual emptyCtxts)++ppr_mono_ty (HsDocTy _ ty _) unicode qual emptyCtxts+ = ppr_mono_lty ty unicode qual emptyCtxts++ppr_mono_ty (HsWildCardTy _) _ _ _ = char '_'+ppr_mono_ty (HsTyLit _ n) _ _ _ = ppr_tylit n++ppr_tylit :: HsTyLit DocNameI -> Html+ppr_tylit (HsNumTy _ n) = toHtml (show n)+ppr_tylit (HsStrTy _ s) = toHtml (show s)+ppr_tylit (HsCharTy _ c) = toHtml (show c)
@@ -0,0 +1,284 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.DocMarkup+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.DocMarkup (+ docToHtml,+ rdrDocToHtml,+ origDocToHtml,+ docToHtmlNoAnchors,++ docElement, docSection, docSection_,+) where++import Data.List (intersperse)+import Documentation.Haddock.Markup+import Haddock.Backends.Xhtml.Names+import Haddock.Backends.Xhtml.Utils+import Haddock.Types+import Haddock.Utils+import Haddock.Doc (combineDocumentation, emptyMetaDoc,+ metaDocAppend, metaConcat)++import Text.XHtml hiding ( name, p, quote )+import Data.Maybe (fromMaybe)++import GHC hiding (anchor)+import GHC.Types.Name+++parHtmlMarkup :: Qualification -> Bool+ -> (Bool -> a -> Html) -> DocMarkup a Html+parHtmlMarkup qual insertAnchors ppId = Markup {+ markupEmpty = noHtml,+ markupString = toHtml,+ markupParagraph = paragraph,+ markupAppend = (+++),+ markupIdentifier = thecode . ppId insertAnchors,+ markupIdentifierUnchecked = thecode . ppUncheckedLink qual,+ markupModule = \(ModLink m lbl) ->+ let (mdl,ref) = break (=='#') m+ -- Accommodate for old style+ -- foo\#bar anchors+ mdl' = case reverse mdl of+ '\\':_ -> init mdl+ _ -> mdl+ in ppModuleRef lbl (mkModuleName mdl') ref,+ markupWarning = thediv ! [theclass "warning"],+ markupEmphasis = emphasize,+ markupBold = strong,+ markupMonospaced = thecode,+ markupUnorderedList = unordList,+ markupOrderedList = makeOrdList,+ markupDefList = defList,+ markupCodeBlock = pre,+ markupHyperlink = \(Hyperlink url mLabel)+ -> if insertAnchors+ then anchor ! [href url]+ << fromMaybe (toHtml url) mLabel+ else fromMaybe (toHtml url) mLabel,+ markupAName = \aname+ -> if insertAnchors+ then namedAnchor aname << ""+ else noHtml,+ markupPic = \(Picture uri t) -> image ! ([src uri] ++ fromMaybe [] (return . title <$> t)),+ markupMathInline = \mathjax -> thespan ! [theclass "mathjax"] << toHtml ("\\(" ++ mathjax ++ "\\)"),+ markupMathDisplay = \mathjax -> thespan ! [theclass "mathjax"] << toHtml ("\\[" ++ mathjax ++ "\\]"),+ markupProperty = pre . toHtml,+ markupExample = examplesToHtml,+ markupHeader = \(Header l t) -> makeHeader l t,+ markupTable = \(Table h r) -> makeTable h r+ }+ where+ makeHeader :: Int -> Html -> Html+ makeHeader 1 mkup = h1 mkup+ makeHeader 2 mkup = h2 mkup+ makeHeader 3 mkup = h3 mkup+ makeHeader 4 mkup = h4 mkup+ makeHeader 5 mkup = h5 mkup+ makeHeader 6 mkup = h6 mkup+ makeHeader l _ = error $ "Somehow got a header level `" ++ show l ++ "' in DocMarkup!"++ makeTable :: [TableRow Html] -> [TableRow Html] -> Html+ makeTable hs bs = table (concatHtml (hs' ++ bs'))+ where+ hs' | null hs = []+ | otherwise = [thead (concatHtml (map (makeTableRow th) hs))]++ bs' = [tbody (concatHtml (map (makeTableRow td) bs))]++ makeTableRow :: (Html -> Html) -> TableRow Html -> Html+ makeTableRow thr (TableRow cs) = tr (concatHtml (map (makeTableCell thr) cs))++ makeTableCell :: (Html -> Html) -> TableCell Html -> Html+ makeTableCell thr (TableCell i j c) = thr c ! (i' ++ j')+ where+ i' = if i == 1 then [] else [ colspan i ]+ j' = if j == 1 then [] else [ rowspan j ]++ examplesToHtml l = pre (concatHtml $ map exampleToHtml l) ! [theclass "screen"]++ exampleToHtml (Example expression result) = htmlExample+ where+ htmlExample = htmlPrompt +++ htmlExpression +++ toHtml (unlines result)+ htmlPrompt = (thecode . toHtml $ ">>> ") ! [theclass "prompt"]+ htmlExpression = (strong . thecode . toHtml $ expression ++ "\n") ! [theclass "userinput"]++ makeOrdList :: HTML a => [(Int, a)] -> Html+ makeOrdList items = olist << map (\(index, a) -> li ! [intAttr "value" index] << a) items++-- | We use this intermediate type to transform the input 'Doc' tree+-- in an arbitrary way before rendering, such as grouping some+-- elements. This is effectively a hack to prevent the 'Doc' type+-- from changing if it is possible to recover the layout information+-- we won't need after the fact.+data Hack a id =+ UntouchedDoc (MetaDoc a id)+ | CollapsingHeader (Header (DocH a id)) (MetaDoc a id) Int (Maybe String)+ | HackAppend (Hack a id) (Hack a id)+ deriving Eq++-- | Group things under bold 'DocHeader's together.+toHack :: Int -- ^ Counter for header IDs which serves to assign+ -- unique identifiers within the comment scope+ -> Maybe String+ -- ^ It is not enough to have unique identifier within the+ -- scope of the comment: if two different comments have the+ -- same ID for headers, the collapse/expand behaviour will act+ -- on them both. This serves to make each header a little bit+ -- more unique. As we can't export things with the same names,+ -- this should work more or less fine: it is in fact the+ -- implicit assumption the collapse/expand mechanism makes for+ -- things like ‘Instances’ boxes.+ -> [MetaDoc a id] -> Hack a id+toHack _ _ [] = UntouchedDoc emptyMetaDoc+toHack _ _ [x] = UntouchedDoc x+toHack n nm (MetaDoc { _doc = DocHeader (Header l (DocBold x)) }:xs) =+ let -- Header with dropped bold+ h = Header l x+ -- Predicate for takeWhile, grab everything including ‘smaller’+ -- headers+ p (MetaDoc { _doc = DocHeader (Header l' _) }) = l' > l+ p _ = True+ -- Stuff ‘under’ this header+ r = takeWhile p xs+ -- Everything else that didn't make it under+ r' = drop (length r) xs+ app y [] = y+ app y ys = HackAppend y (toHack (n + 1) nm ys)+ in case r of+ -- No content under this header+ [] -> CollapsingHeader h emptyMetaDoc n nm `app` r'+ -- We got something out, stitch it back together into one chunk+ y:ys -> CollapsingHeader h (foldl metaDocAppend y ys) n nm `app` r'+toHack n nm (x:xs) = HackAppend (UntouchedDoc x) (toHack n nm xs)++-- | Remove ‘top-level’ 'DocAppend's turning them into a flat list.+-- This lends itself much better to processing things in order user+-- might look at them, such as in 'toHack'.+flatten :: MetaDoc a id -> [MetaDoc a id]+flatten MetaDoc { _meta = m, _doc = DocAppend x y } =+ let f z = MetaDoc { _meta = m, _doc = z }+ in flatten (f x) ++ flatten (f y)+flatten x = [x]++-- | Generate the markup needed for collapse to happen. For+-- 'UntouchedDoc' and 'HackAppend' we do nothing more but+-- extract/append the underlying 'Doc' and convert it to 'Html'. For+-- 'CollapsingHeader', we attach extra info to the generated 'Html'+-- that allows us to expand/collapse the content.+hackMarkup :: DocMarkup id Html -> Maybe Package -> Hack (Wrap (ModuleName, OccName)) id -> Html+hackMarkup fmt' currPkg h' =+ let (html, ms) = hackMarkup' fmt' h'+ in html +++ renderMeta fmt' currPkg (metaConcat ms)+ where+ hackMarkup' :: DocMarkup id Html -> Hack (Wrap (ModuleName, OccName)) id+ -> (Html, [Meta])+ hackMarkup' fmt h = case h of+ UntouchedDoc d -> (markup fmt $ _doc d, [_meta d])+ CollapsingHeader (Header lvl titl) par n nm ->+ let id_ = makeAnchorId $ "ch:" ++ fromMaybe "noid:" nm ++ show n+ col' = collapseControl id_ "subheading"+ summary = thesummary ! [ theclass "hide-when-js-enabled" ] << "Expand"+ instTable contents = collapseDetails id_ DetailsClosed (summary +++ contents)+ lvs = zip [1 .. ] [h1, h2, h3, h4, h5, h6]+ getHeader = fromMaybe caption (lookup lvl lvs)+ subCaption = getHeader ! col' << markup fmt titl+ in ((subCaption +++) . instTable $ markup fmt (_doc par), [_meta par])+ HackAppend d d' -> let (x, m) = hackMarkup' fmt d+ (y, m') = hackMarkup' fmt d'+ in (markupAppend fmt x y, m ++ m')++renderMeta :: DocMarkup id Html -> Maybe Package -> Meta -> Html+renderMeta fmt currPkg (Meta { _version = Just x, _package = pkg }) =+ markupParagraph fmt . markupEmphasis fmt . toHtml $+ "Since: " ++ formatPkgMaybe pkg ++ formatVersion x+ where+ formatVersion v = concat . intersperse "." $ map show v+ formatPkgMaybe (Just p) | Just p /= currPkg = p ++ "-"+ formatPkgMaybe _ = ""+renderMeta _ _ _ = noHtml++-- | Goes through 'hackMarkup' to generate the 'Html' rather than+-- skipping straight to 'markup': this allows us to employ XHtml+-- specific hacks to the tree first.+markupHacked :: DocMarkup (Wrap id) Html+ -> Maybe Package -- this package+ -> Maybe String+ -> MDoc id+ -> Html+markupHacked fmt currPkg n = hackMarkup fmt currPkg . toHack 0 n . flatten++-- If the doc is a single paragraph, don't surround it with <P> (this causes+-- ugly extra whitespace with some browsers). FIXME: Does this still apply?+docToHtml :: Maybe String -- ^ Name of the thing this doc is for. See+ -- comments on 'toHack' for details.+ -> Maybe Package -- ^ Current package+ -> Qualification -> MDoc DocName -> Html+docToHtml n pkg qual = markupHacked fmt pkg n . cleanup+ where fmt = parHtmlMarkup qual True (ppWrappedDocName qual Raw)++-- | Same as 'docToHtml' but it doesn't insert the 'anchor' element+-- in links. This is used to generate the Contents box elements.+docToHtmlNoAnchors :: Maybe String -- ^ See 'toHack'+ -> Maybe Package -- ^ Current package+ -> Qualification -> MDoc DocName -> Html+docToHtmlNoAnchors n pkg qual = markupHacked fmt pkg n . cleanup+ where fmt = parHtmlMarkup qual False (ppWrappedDocName qual Raw)++origDocToHtml :: Maybe Package -> Qualification -> MDoc Name -> Html+origDocToHtml pkg qual = markupHacked fmt pkg Nothing . cleanup+ where fmt = parHtmlMarkup qual True (const (ppWrappedName Raw))+++rdrDocToHtml :: Maybe Package -> Qualification -> MDoc RdrName -> Html+rdrDocToHtml pkg qual = markupHacked fmt pkg Nothing . cleanup+ where fmt = parHtmlMarkup qual True (const (ppRdrName . unwrap))+++docElement :: (Html -> Html) -> Html -> Html+docElement el content_ =+ if isNoHtml content_+ then el ! [theclass "doc empty"] << spaceHtml+ else el ! [theclass "doc"] << content_+++docSection :: Maybe Name -- ^ Name of the thing this doc is for+ -> Maybe Package -- ^ Current package+ -> Qualification -> Documentation DocName -> Html+docSection n pkg qual =+ maybe noHtml (docSection_ n pkg qual) . combineDocumentation+++docSection_ :: Maybe Name -- ^ Name of the thing this doc is for+ -> Maybe Package -- ^ Current package+ -> Qualification -> MDoc DocName -> Html+docSection_ n pkg qual =+ (docElement thediv <<) . docToHtml (getOccString <$> n) pkg qual+++cleanup :: MDoc a -> MDoc a+cleanup = overDoc (markup fmtUnParagraphLists)+ where+ -- If there is a single paragraph, then surrounding it with <P>..</P>+ -- can add too much whitespace in some browsers (eg. IE). However if+ -- we have multiple paragraphs, then we want the extra whitespace to+ -- separate them. So we catch the single paragraph case and transform it+ -- here. We don't do this in code blocks as it eliminates line breaks.+ unParagraph :: Doc a -> Doc a+ unParagraph (DocParagraph d) = d+ unParagraph doc = doc++ fmtUnParagraphLists :: DocMarkup (Wrap a) (Doc a)+ fmtUnParagraphLists = idMarkup {+ markupUnorderedList = DocUnorderedList . map unParagraph,+ markupOrderedList = DocOrderedList . map (\(index, a) -> (index, unParagraph a))+ }
@@ -0,0 +1,319 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Layout+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Layout (+ miniBody,++ divPackageHeader, divContent, divModuleHeader, divFooter,+ divTableOfContents, divDescription, divSynopsis, divInterface,+ divIndex, divAlphabet, divPackageList, divModuleList, divContentsList,++ sectionName,+ nonEmptySectionName,++ shortDeclList,+ shortSubDecls,++ divTopDecl,++ SubDecl,+ subArguments,+ subAssociatedTypes,+ subConstructors,+ subPatterns,+ subEquations,+ subFields,+ subInstances, subOrphanInstances,+ subInstHead, subInstDetails, subFamInstDetails,+ subMethods,+ subDefaults,+ subMinimal,++ topDeclElem, declElem,+) where++import Haddock.Backends.Xhtml.DocMarkup+import Haddock.Backends.Xhtml.Types+import Haddock.Backends.Xhtml.Utils+import Haddock.Types+import Haddock.Utils (makeAnchorId, nameAnchorId)+import qualified Data.Map as Map+import Text.XHtml hiding ( name, title, quote )+import Data.Maybe (fromMaybe)++import GHC.Data.FastString ( unpackFS )+import GHC hiding (anchor)+import GHC.Types.Name (nameOccName)++--------------------------------------------------------------------------------+-- * Sections of the document+--------------------------------------------------------------------------------+++miniBody :: Html -> Html+miniBody = body ! [identifier "mini"]+++sectionDiv :: String -> Html -> Html+sectionDiv i = thediv ! [identifier i]+++sectionName :: Html -> Html+sectionName = paragraph ! [theclass "caption"]+++-- | Make an element that always has at least something (a non-breaking space).+-- If it would have otherwise been empty, then give it the class ".empty".+nonEmptySectionName :: Html -> Html+nonEmptySectionName c+ | isNoHtml c = thespan ! [theclass "caption empty"] $ spaceHtml+ | otherwise = thespan ! [theclass "caption"] $ c+++divPackageHeader, divContent, divModuleHeader, divFooter,+ divTableOfContents, divDescription, divSynopsis, divInterface,+ divIndex, divAlphabet, divPackageList, divModuleList, divContentsList+ :: Html -> Html++divPackageHeader = sectionDiv "package-header"+divContent = sectionDiv "content"+divModuleHeader = sectionDiv "module-header"+divFooter = sectionDiv "footer"+divTableOfContents = sectionDiv "table-of-contents"+divContentsList = sectionDiv "contents-list"+divDescription = sectionDiv "description"+divSynopsis = sectionDiv "synopsis"+divInterface = sectionDiv "interface"+divIndex = sectionDiv "index"+divAlphabet = sectionDiv "alphabet"+divModuleList = sectionDiv "module-list"+divPackageList = sectionDiv "module-list"+++--------------------------------------------------------------------------------+-- * Declaration containers+--------------------------------------------------------------------------------+++shortDeclList :: [Html] -> Html+shortDeclList items = ulist << map (li ! [theclass "src short"] <<) items+++shortSubDecls :: Bool -> [Html] -> Html+shortSubDecls inst items = ulist ! [theclass c] << map (i <<) items+ where i | inst = li ! [theclass "inst"]+ | otherwise = li+ c | inst = "inst"+ | otherwise = "subs"+++divTopDecl :: Html -> Html+divTopDecl = thediv ! [theclass "top"]+++type SubDecl = (Html, Maybe (MDoc DocName), [Html])+++divSubDecls :: (HTML a) => String -> a -> Maybe Html -> Html+divSubDecls cssClass captionName = maybe noHtml wrap+ where+ wrap = (subSection <<) . (subCaption +++)+ subSection = thediv ! [theclass $ unwords ["subs", cssClass]]+ subCaption = paragraph ! [theclass "caption"] << captionName+++subDlist :: Maybe Package -> Qualification -> [SubDecl] -> Maybe Html+subDlist _ _ [] = Nothing+subDlist pkg qual decls = Just $ ulist << map subEntry decls+ where+ subEntry (decl, mdoc, subs) =+ li <<+ (define ! [theclass "src"] << decl ++++ docElement thediv << (fmap (docToHtml Nothing pkg qual) mdoc +++ subs))+++subTable :: Maybe Package -> Qualification -> [SubDecl] -> Maybe Html+subTable _ _ [] = Nothing+subTable pkg qual decls = Just $ table << aboves (concatMap subRow decls)+ where+ subRow (decl, mdoc, subs) =+ (td ! [theclass "src"] << decl+ <->+ docElement td << fmap (docToHtml Nothing pkg qual) mdoc)+ : map (cell . (td <<)) subs+++-- | Sub table with source information (optional).+subTableSrc :: Maybe Package -> Qualification -> LinksInfo -> Bool+ -> [(SubDecl, Maybe Module, Located DocName)] -> Maybe Html+subTableSrc _ _ _ _ [] = Nothing+subTableSrc pkg qual lnks splice decls = Just $ table << aboves (concatMap subRow decls)+ where+ subRow ((decl, mdoc, subs), mdl, L loc dn) =+ (td ! [theclass "src clearfix"] <<+ (thespan ! [theclass "inst-left"] << decl)+ <+> linkHtml loc mdl dn+ <->+ docElement td << fmap (docToHtml Nothing pkg qual) mdoc+ )+ : map (cell . (td <<)) subs++ linkHtml :: SrcSpan -> Maybe Module -> DocName -> Html+ linkHtml loc@(RealSrcSpan _ _) mdl dn = links lnks loc splice mdl dn+ linkHtml _ _ _ = noHtml++subBlock :: [Html] -> Maybe Html+subBlock [] = Nothing+subBlock hs = Just $ toHtml hs+++subArguments :: Maybe Package -> Qualification -> [SubDecl] -> Html+subArguments pkg qual = divSubDecls "arguments" "Arguments" . subTable pkg qual+++subAssociatedTypes :: [Html] -> Html+subAssociatedTypes = divSubDecls "associated-types" "Associated Types" . subBlock+++subConstructors :: Maybe Package -> Qualification -> [SubDecl] -> Html+subConstructors pkg qual = divSubDecls "constructors" "Constructors" . subTable pkg qual++subPatterns :: Maybe Package -> Qualification -> [SubDecl] -> Html+subPatterns pkg qual = divSubDecls "bundled-patterns" "Bundled Patterns" . subTable pkg qual++subFields :: Maybe Package -> Qualification -> [SubDecl] -> Html+subFields pkg qual = divSubDecls "fields" "Fields" . subDlist pkg qual+++subEquations :: Maybe Package -> Qualification -> [SubDecl] -> Html+subEquations pkg qual = divSubDecls "equations" "Equations" . subTable pkg qual+++-- | Generate collapsible sub table for instance declarations, with source+subInstances :: Maybe Package -> Qualification+ -> String -- ^ Class name, used for anchor generation+ -> LinksInfo -> Bool+ -> [(SubDecl, Maybe Module, Located DocName)] -> Html+subInstances pkg qual nm lnks splice = maybe noHtml wrap . instTable+ where+ wrap contents = subSection (hdr +++ collapseDetails id_ DetailsOpen (summary +++ contents))+ instTable = subTableSrc pkg qual lnks splice+ subSection = thediv ! [theclass "subs instances"]+ hdr = h4 ! collapseControl id_ "instances" << "Instances"+ summary = thesummary ! [ theclass "hide-when-js-enabled" ] << "Instances details"+ id_ = makeAnchorId $ "i:" ++ nm+++subOrphanInstances :: Maybe Package -> Qualification+ -> LinksInfo -> Bool+ -> [(SubDecl, Maybe Module, Located DocName)] -> Html+subOrphanInstances pkg qual lnks splice = maybe noHtml wrap . instTable+ where+ wrap = ((h1 << "Orphan instances") +++)+ instTable = fmap (thediv ! [ identifier ("section." ++ id_) ] <<) . subTableSrc pkg qual lnks splice+ id_ = makeAnchorId "orphans"+++subInstHead :: String -- ^ Instance unique id (for anchor generation)+ -> Html -- ^ Header content (instance name and type)+ -> Html+subInstHead iid hdr =+ expander noHtml <+> hdr+ where+ expander = thespan ! collapseControl (instAnchorId iid) "instance"+++subInstDetails :: String -- ^ Instance unique id (for anchor generation)+ -> [Html] -- ^ Associated type contents+ -> [Html] -- ^ Method contents (pretty-printed signatures)+ -> Html -- ^ Source module+ -> Html+subInstDetails iid ats mets mdl =+ subInstSection iid << (p mdl <+> subAssociatedTypes ats <+> subMethods mets)++subFamInstDetails :: String -- ^ Instance unique id (for anchor generation)+ -> Html -- ^ Type or data family instance+ -> Html -- ^ Source module TODO: use this+ -> Html+subFamInstDetails iid fi mdl =+ subInstSection iid << (p mdl <+> (thediv ! [theclass "src"] << fi))++subInstSection :: String -- ^ Instance unique id (for anchor generation)+ -> Html+ -> Html+subInstSection iid contents = collapseDetails (instAnchorId iid) DetailsClosed (summary +++ contents)+ where+ summary = thesummary ! [ theclass "hide-when-js-enabled" ] << "Instance details"++instAnchorId :: String -> String+instAnchorId iid = makeAnchorId $ "i:" ++ iid+++subMethods :: [Html] -> Html+subMethods = divSubDecls "methods" "Methods" . subBlock++subDefaults :: [Html] -> Html+subDefaults = divSubDecls "default" "" . subBlock++subMinimal :: Html -> Html+subMinimal = divSubDecls "minimal" "Minimal complete definition" . Just . declElem+++-- a box for displaying code+declElem :: Html -> Html+declElem = paragraph ! [theclass "src"]+++-- a box for top level documented names+-- it adds a source and wiki link at the right hand side of the box+topDeclElem :: LinksInfo -> SrcSpan -> Bool -> [DocName] -> Html -> Html+topDeclElem lnks loc splice names html =+ declElem << (html <+> (links lnks loc splice Nothing $ head names))+ -- FIXME: is it ok to simply take the first name?++-- | Adds a source and wiki link at the right hand side of the box.+-- Name must be documented, otherwise we wouldn't get here.+links :: LinksInfo -> SrcSpan -> Bool -> Maybe Module -> DocName -> Html+links ((_,_,sourceMap,lineMap), (_,_,maybe_wiki_url)) loc splice mdl' docName@(Documented n mdl) =+ srcLink <+> wikiLink <+> (selfLink ! [theclass "selflink"] << "#")+ where selfLink = linkedAnchor (nameAnchorId (nameOccName (getName docName)))++ srcLink = let nameUrl = Map.lookup origPkg sourceMap+ lineUrl = Map.lookup origPkg lineMap+ mUrl | splice = lineUrl+ -- Use the lineUrl as a backup+ | otherwise = maybe lineUrl Just nameUrl in+ case mUrl of+ Nothing -> noHtml+ Just url -> let url' = spliceURL (Just fname) (Just origMod)+ (Just n) (Just loc) url+ in anchor ! [href url', theclass "link"] << "Source"++ wikiLink =+ case maybe_wiki_url of+ Nothing -> noHtml+ Just url -> let url' = spliceURL (Just fname) (Just mdl)+ (Just n) (Just loc) url+ in anchor ! [href url', theclass "link"] << "Comments"++ -- For source links, we want to point to the original module,+ -- because only that will have the source.+ --+ -- 'mdl'' is a way of "overriding" the module. Without it, instances+ -- will point to the module defining the class/family, which is wrong.+ origMod = fromMaybe (nameModule n) mdl'+ origPkg = moduleUnit origMod++ fname = case loc of+ RealSrcSpan l _ -> unpackFS (srcSpanFile l)+ UnhelpfulSpan _ -> error "links: UnhelpfulSpan"+links _ _ _ _ _ = noHtml
@@ -0,0 +1,28 @@+module Haddock.Backends.Xhtml.Meta where++import Haddock.Utils.Json+import Haddock.Version++import Data.ByteString.Builder (hPutBuilder)+import System.FilePath ((</>))+import System.IO (withFile, IOMode (WriteMode))++-- | Everytime breaking changes to the Quckjump api+-- happen this needs to be modified.+quickjumpVersion :: Int+quickjumpVersion = 1++-- | Writes a json encoded file containing additional+-- information about the generated documentation. This+-- is useful for external tools (e.g., Hackage).+writeHaddockMeta :: FilePath -> Bool -> IO ()+writeHaddockMeta odir withQuickjump = do+ let+ meta_json :: Value+ meta_json = object (concat [+ [ "haddock_version" .= String projectVersion ]+ , [ "quickjump_version" .= quickjumpVersion | withQuickjump ]+ ])++ withFile (odir </> "meta.json") WriteMode $ \h ->+ hPutBuilder h (encodeToBuilder meta_json)
@@ -0,0 +1,198 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Names+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Names (+ ppName, ppDocName, ppLDocName, ppRdrName, ppUncheckedLink,+ ppBinder, ppBinderInfix, ppBinder',+ ppModule, ppModuleRef, ppIPName, linkId, Notation(..),+ ppWrappedDocName, ppWrappedName,+) where+++import Haddock.Backends.Xhtml.Utils+import Haddock.GhcUtils+import Haddock.Types+import Haddock.Utils++import Text.XHtml hiding ( name, p, quote )+import qualified Data.Map as M+import Data.List ( stripPrefix )++import GHC hiding (LexicalFixity(..), anchor)+import GHC.Types.Name+import GHC.Types.Name.Reader+import GHC.Data.FastString (unpackFS)+++-- | Indicator of how to render a 'DocName' into 'Html'+data Notation = Raw -- ^ Render as-is.+ | Infix -- ^ Render using infix notation.+ | Prefix -- ^ Render using prefix notation.+ deriving (Eq, Show)++ppOccName :: OccName -> Html+ppOccName = toHtml . occNameString+++ppRdrName :: RdrName -> Html+ppRdrName = ppOccName . rdrNameOcc++ppIPName :: HsIPName -> Html+ppIPName = toHtml . ('?':) . unpackFS . hsIPNameFS+++ppUncheckedLink :: Qualification -> Wrap (ModuleName, OccName) -> Html+ppUncheckedLink _ x = linkIdOcc' mdl (Just occ) << occHtml+ where+ (mdl, occ) = unwrap x+ occHtml = toHtml (showWrapped (occNameString . snd) x) -- TODO: apply ppQualifyName++-- The Bool indicates if it is to be rendered in infix notation+ppLDocName :: Qualification -> Notation -> GenLocated l DocName -> Html+ppLDocName qual notation (L _ d) = ppDocName qual notation True d+++ppDocName :: Qualification -> Notation -> Bool -> DocName -> Html+ppDocName qual notation insertAnchors docName =+ case docName of+ Documented name mdl ->+ linkIdOcc mdl (Just (nameOccName name)) insertAnchors+ << ppQualifyName qual notation name mdl+ Undocumented name+ | isExternalName name || isWiredInName name ->+ ppQualifyName qual notation name (nameModule name)+ | otherwise -> ppName notation name+++ppWrappedDocName :: Qualification -> Notation -> Bool -> Wrap DocName -> Html+ppWrappedDocName qual notation insertAnchors docName = case docName of+ Unadorned n -> ppDocName qual notation insertAnchors n+ Parenthesized n -> ppDocName qual Prefix insertAnchors n+ Backticked n -> ppDocName qual Infix insertAnchors n++ppWrappedName :: Notation -> Wrap Name -> Html+ppWrappedName notation docName = case docName of+ Unadorned n -> ppName notation n+ Parenthesized n -> ppName Prefix n+ Backticked n -> ppName Infix n++-- | Render a name depending on the selected qualification mode+ppQualifyName :: Qualification -> Notation -> Name -> Module -> Html+ppQualifyName qual notation name mdl =+ case qual of+ NoQual -> ppName notation name+ FullQual -> ppFullQualName notation mdl name+ LocalQual localmdl ->+ if moduleString mdl == moduleString localmdl+ then ppName notation name+ else ppFullQualName notation mdl name+ RelativeQual localmdl ->+ case stripPrefix (moduleString localmdl) (moduleString mdl) of+ -- local, A.x -> x+ Just [] -> ppName notation name+ -- sub-module, A.B.x -> B.x+ Just ('.':m) -> toHtml $ m ++ '.' : getOccString name+ -- some module with same prefix, ABC.x -> ABC.x+ Just _ -> ppFullQualName notation mdl name+ -- some other module, D.x -> D.x+ Nothing -> ppFullQualName notation mdl name+ AliasedQual aliases localmdl ->+ case (moduleString mdl == moduleString localmdl,+ M.lookup mdl aliases) of+ (False, Just alias) -> ppQualName notation alias name+ _ -> ppName notation name+++ppFullQualName :: Notation -> Module -> Name -> Html+ppFullQualName notation mdl name = wrapInfix notation (getOccName name) qname+ where+ qname = toHtml $ moduleString mdl ++ '.' : getOccString name++ppQualName :: Notation -> ModuleName -> Name -> Html+ppQualName notation mdlName name = wrapInfix notation (getOccName name) qname+ where+ qname = toHtml $ moduleNameString mdlName ++ '.' : getOccString name++ppName :: Notation -> Name -> Html+ppName notation name = wrapInfix notation (getOccName name) $ toHtml (getOccString name)+++ppBinder :: Bool -> OccName -> Html+ppBinder = ppBinderWith Prefix++ppBinderInfix :: Bool -> OccName -> Html+ppBinderInfix = ppBinderWith Infix++ppBinderWith :: Notation -> Bool -> OccName -> Html+-- 'isRef' indicates whether this is merely a reference from another part of+-- the documentation or is the actual definition; in the latter case, we also+-- set the 'id' and 'class' attributes.+ppBinderWith notation isRef n =+ makeAnchor << ppBinder' notation n+ where+ name = nameAnchorId n+ makeAnchor | isRef = linkedAnchor name+ | otherwise = namedAnchor name ! [theclass "def"]++ppBinder' :: Notation -> OccName -> Html+ppBinder' notation n = wrapInfix notation n $ ppOccName n++wrapInfix :: Notation -> OccName -> Html -> Html+wrapInfix notation n = case notation of+ Infix | is_star_kind -> id+ | not is_sym -> quote+ Prefix | is_star_kind -> id+ | is_sym -> parens+ _ -> id+ where+ is_sym = isSymOcc n+ is_star_kind = isTcOcc n && occNameString n == "*"++linkId :: Module -> Maybe Name -> Html -> Html+linkId mdl mbName = linkIdOcc mdl (fmap nameOccName mbName) True+++linkIdOcc :: Module -> Maybe OccName -> Bool -> Html -> Html+linkIdOcc mdl mbName insertAnchors =+ if insertAnchors+ then anchor ! [href url, title ttl]+ else id+ where+ ttl = moduleNameString (moduleName mdl)+ url = case mbName of+ Nothing -> moduleUrl mdl+ Just name -> moduleNameUrl mdl name+++linkIdOcc' :: ModuleName -> Maybe OccName -> Html -> Html+linkIdOcc' mdl mbName = anchor ! [href url, title ttl]+ where+ ttl = moduleNameString mdl+ url = case mbName of+ Nothing -> moduleHtmlFile' mdl+ Just name -> moduleNameUrl' mdl name+++ppModule :: Module -> Html+ppModule mdl = anchor ! [href (moduleUrl mdl)]+ << toHtml (moduleString mdl)+++ppModuleRef :: Maybe Html -> ModuleName -> String -> Html+ppModuleRef Nothing mdl ref = anchor ! [href (moduleHtmlFile' mdl ++ ref)]+ << toHtml (moduleNameString mdl)+ppModuleRef (Just lbl) mdl ref = anchor ! [href (moduleHtmlFile' mdl ++ ref)]+ << lbl++ -- NB: The ref parameter already includes the '#'.+ -- This function is only called from markupModule expanding a+ -- DocModule, which doesn't seem to be ever be used.
@@ -0,0 +1,208 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Themes+-- Copyright : (c) Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Themes (+ Themes,+ getThemes,++ cssFiles, styleSheet+ )+ where++import Haddock.Options+import Haddock.Backends.Xhtml.Types ( BaseURL, withBaseURL )++import Control.Monad (liftM)+import Data.Char (toLower)+import Data.Either (lefts, rights)+import Data.List (nub)+import Data.Maybe (isJust, listToMaybe)++import System.Directory+import System.FilePath+import Text.XHtml hiding ( name, title, p, quote, (</>) )+import qualified Text.XHtml as XHtml+++--------------------------------------------------------------------------------+-- * CSS Themes+--------------------------------------------------------------------------------++data Theme = Theme {+ themeName :: String,+ themeHref :: String,+ themeFiles :: [FilePath]+ }++type Themes = [Theme]++type PossibleTheme = Either String Theme+type PossibleThemes = Either String Themes+++-- | Find a theme by name (case insensitive match)+findTheme :: String -> Themes -> Maybe Theme+findTheme s = listToMaybe . filter ((== ls).lower.themeName)+ where lower = map toLower+ ls = lower s+++-- | Standard theme used by default+standardTheme :: FilePath -> IO PossibleThemes+standardTheme libDir = liftM (liftEither (take 1)) (defaultThemes libDir)+++-- | Default themes that are part of Haddock; added with @--built-in-themes@+-- The first theme in this list is considered the standard theme.+-- Themes are "discovered" by scanning the html sub-dir of the libDir,+-- and looking for directories with the extension .theme or .std-theme.+-- The later is, obviously, the standard theme.+defaultThemes :: FilePath -> IO PossibleThemes+defaultThemes libDir = do+ themeDirs <- getDirectoryItems (libDir </> "html")+ themes <- mapM directoryTheme $ discoverThemes themeDirs+ return $ sequenceEither themes+ where+ discoverThemes paths =+ filterExt ".std-theme" paths ++ filterExt ".theme" paths+ filterExt ext = filter ((== ext).takeExtension)+++-- | Build a theme from a single .css file+singleFileTheme :: FilePath -> IO PossibleTheme+singleFileTheme path =+ if isCssFilePath path+ then retRight $ Theme name file [path]+ else errMessage "File extension isn't .css" path+ where+ name = takeBaseName path+ file = takeFileName path+++-- | Build a theme from a directory+directoryTheme :: FilePath -> IO PossibleTheme+directoryTheme path = do+ items <- getDirectoryItems path+ case filter isCssFilePath items of+ [cf] -> retRight $ Theme (takeBaseName path) (takeFileName cf) items+ [] -> errMessage "No .css file in theme directory" path+ _ -> errMessage "More than one .css file in theme directory" path+++-- | Check if we have a built in theme+doesBuiltInExist :: IO PossibleThemes -> String -> IO Bool+doesBuiltInExist pts s = fmap (either (const False) test) pts+ where test = isJust . findTheme s+++-- | Find a built in theme+builtInTheme :: IO PossibleThemes -> String -> IO PossibleTheme+builtInTheme pts s = either Left fetch <$> pts+ where fetch = maybe (Left ("Unknown theme: " ++ s)) Right . findTheme s+++--------------------------------------------------------------------------------+-- * CSS Theme Arguments+--------------------------------------------------------------------------------++-- | Process input flags for CSS Theme arguments+getThemes :: FilePath -> [Flag] -> IO PossibleThemes+getThemes libDir flags =+ liftM concatEither (mapM themeFlag flags) >>= someTheme+ where+ themeFlag :: Flag -> IO (Either String Themes)+ themeFlag (Flag_CSS path) = (liftM . liftEither) (:[]) (theme path)+ themeFlag (Flag_BuiltInThemes) = builtIns+ themeFlag _ = retRight []++ theme :: FilePath -> IO PossibleTheme+ theme path = pick path+ [(doesFileExist, singleFileTheme),+ (doesDirectoryExist, directoryTheme),+ (doesBuiltInExist builtIns, builtInTheme builtIns)]+ "Theme not found"++ pick :: FilePath+ -> [(FilePath -> IO Bool, FilePath -> IO PossibleTheme)] -> String+ -> IO PossibleTheme+ pick path [] msg = errMessage msg path+ pick path ((test,build):opts) msg = do+ pass <- test path+ if pass then build path else pick path opts msg+++ someTheme :: Either String Themes -> IO (Either String Themes)+ someTheme (Right []) = standardTheme libDir+ someTheme est = return est++ builtIns = defaultThemes libDir+++errMessage :: String -> FilePath -> IO (Either String a)+errMessage msg path = return (Left msg')+ where msg' = "Error: " ++ msg ++ ": \"" ++ path ++ "\"\n"+++retRight :: a -> IO (Either String a)+retRight = return . Right+++--------------------------------------------------------------------------------+-- * File Utilities+--------------------------------------------------------------------------------+++getDirectoryItems :: FilePath -> IO [FilePath]+getDirectoryItems path =+ map (combine path) . filter notDot <$> getDirectoryContents path+ where notDot s = s /= "." && s /= ".."+++isCssFilePath :: FilePath -> Bool+isCssFilePath path = takeExtension path == ".css"+++--------------------------------------------------------------------------------+-- * Style Sheet Utilities+--------------------------------------------------------------------------------++cssFiles :: Themes -> [String]+cssFiles ts = nub $ concatMap themeFiles ts+++styleSheet :: BaseURL -> Themes -> Html+styleSheet base_url ts = toHtml $ zipWith mkLink rels ts+ where+ rels = "stylesheet" : repeat "alternate stylesheet"+ mkLink aRel t =+ thelink+ ! [ href (withBaseURL base_url (themeHref t)), rel aRel, thetype "text/css",+ XHtml.title (themeName t)+ ]+ << noHtml++--------------------------------------------------------------------------------+-- * Either Utilities+--------------------------------------------------------------------------------++-- These three routines are here because Haddock does not have access to the+-- Control.Monad.Error module which supplies the Functor and Monad instances+-- for Either String.++sequenceEither :: [Either a b] -> Either a [b]+sequenceEither es = maybe (Right $ rights es) Left (listToMaybe (lefts es))+++liftEither :: (b -> c) -> Either a b -> Either a c+liftEither f = either Left (Right . f)+++concatEither :: [Either a [b]] -> Either a [b]+concatEither = liftEither concat . sequenceEither
@@ -0,0 +1,48 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Types+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Types (+ SourceURLs, WikiURLs,+ BaseURL,+ withBaseURL,+ LinksInfo,+ Splice,+ Unicode,+) where+++import Data.Map+import GHC+import qualified System.FilePath as FilePath+++-- the base, module and entity URLs for the source code and wiki links.+type SourceURLs = (Maybe FilePath, Maybe FilePath, Map Unit FilePath, Map Unit FilePath)+type WikiURLs = (Maybe FilePath, Maybe FilePath, Maybe FilePath)++-- | base url for loading js, json, css resources. The default is "."+--+type BaseURL = Maybe String++-- TODO: we shouldn't use 'FilePath.</>'+withBaseURL :: BaseURL -> String -> String+withBaseURL Nothing uri = uri+withBaseURL (Just baseUrl) uri = baseUrl FilePath.</> uri++-- The URL for source and wiki links+type LinksInfo = (SourceURLs, WikiURLs)++-- Whether something is a splice or not+type Splice = Bool++-- Whether unicode syntax is to be used+type Unicode = Bool
@@ -0,0 +1,241 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Backends.Html.Util+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mark Lentczner 2010+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Backends.Xhtml.Utils (+ renderToString,++ namedAnchor, linkedAnchor,+ spliceURL, spliceURL',+ groupId,++ (<+>), (<=>), char,+ keyword, punctuate,++ braces, brackets, pabrackets, parens, parenList, ubxParenList, ubxSumList,+ arrow, lollipop, comma, dcolon, dot, darrow, equals, forallSymbol, quote, promoQuote,+ multAnnotation,+ atSign,++ hsep, vcat,++ DetailsState(..), collapseDetails, thesummary,+ collapseToggle, collapseControl,+) where+++import Haddock.Utils++import Data.Maybe++import Text.XHtml hiding ( name, title, p, quote )+import qualified Text.XHtml as XHtml++import GHC ( SrcSpan(..), srcSpanStartLine, Name )+import GHC.Unit.Module ( Module, ModuleName, moduleName, moduleNameString )+import GHC.Types.Name ( getOccString, nameOccName, isValOcc )+++-- | Replace placeholder string elements with provided values.+--+-- Used to generate URL for customized external paths, usually provided with+-- @--source-module@, @--source-entity@ and related command-line arguments.+--+-- >>> spliceURL Nothing mmod mname Nothing "output/%{MODULE}.hs#%{NAME}"+-- "output/Foo.hs#foo"+spliceURL :: Maybe FilePath -> Maybe Module -> Maybe GHC.Name ->+ Maybe SrcSpan -> String -> String+spliceURL mfile mmod = spliceURL' mfile (moduleName <$> mmod)+++-- | Same as 'spliceURL' but takes 'ModuleName' instead of 'Module'.+spliceURL' :: Maybe FilePath -> Maybe ModuleName -> Maybe GHC.Name ->+ Maybe SrcSpan -> String -> String+spliceURL' maybe_file maybe_mod maybe_name maybe_loc = run+ where+ file = fromMaybe "" maybe_file+ mdl = case maybe_mod of+ Nothing -> ""+ Just m -> moduleNameString m++ (name, kind) =+ case maybe_name of+ Nothing -> ("","")+ Just n | isValOcc (nameOccName n) -> (escapeStr (getOccString n), "v")+ | otherwise -> (escapeStr (getOccString n), "t")++ line = case maybe_loc of+ Nothing -> ""+ Just span_ ->+ case span_ of+ RealSrcSpan span__ _ ->+ show $ srcSpanStartLine span__+ UnhelpfulSpan _ -> ""++ run "" = ""+ run ('%':'M':rest) = mdl ++ run rest+ run ('%':'F':rest) = file ++ run rest+ run ('%':'N':rest) = name ++ run rest+ run ('%':'K':rest) = kind ++ run rest+ run ('%':'L':rest) = line ++ run rest+ run ('%':'%':rest) = '%' : run rest++ run ('%':'{':'M':'O':'D':'U':'L':'E':'}':rest) = mdl ++ run rest+ run ('%':'{':'F':'I':'L':'E':'}':rest) = file ++ run rest+ run ('%':'{':'N':'A':'M':'E':'}':rest) = name ++ run rest+ run ('%':'{':'K':'I':'N':'D':'}':rest) = kind ++ run rest++ run ('%':'{':'M':'O':'D':'U':'L':'E':'/':'.':'/':c:'}':rest) =+ map (\x -> if x == '.' then c else x) mdl ++ run rest++ run ('%':'{':'F':'I':'L':'E':'/':'/':'/':c:'}':rest) =+ map (\x -> if x == '/' then c else x) file ++ run rest++ run ('%':'{':'L':'I':'N':'E':'}':rest) = line ++ run rest++ run (c:rest) = c : run rest+++renderToString :: Bool -> Html -> String+renderToString debug html+ | debug = renderHtml html+ | otherwise = showHtml html+++hsep :: [Html] -> Html+hsep [] = noHtml+hsep htmls = foldr1 (<+>) htmls++-- | Concatenate a series of 'Html' values vertically, with linebreaks in between.+vcat :: [Html] -> Html+vcat [] = noHtml+vcat htmls = foldr1 (\a b -> a+++br+++b) htmls+++infixr 8 <+>+(<+>) :: Html -> Html -> Html+a <+> b = a +++ sep +++ b+ where+ sep = if isNoHtml a || isNoHtml b then noHtml else toHtml " "++-- | Join two 'Html' values together with a linebreak in between.+-- Has 'noHtml' as left identity.+infixr 8 <=>+(<=>) :: Html -> Html -> Html+a <=> b = a +++ sep +++ b+ where+ sep = if isNoHtml a then noHtml else br+++keyword :: String -> Html+keyword s = thespan ! [theclass "keyword"] << toHtml s+++equals, comma :: Html+equals = char '='+comma = char ','+++char :: Char -> Html+char c = toHtml [c]+++quote :: Html -> Html+quote h = char '`' +++ h +++ '`'+++-- | Promoted type quote (e.g. @'[a, b]@, @'(a, b, c)@).+promoQuote :: Html -> Html+promoQuote h = char '\'' +++ h+++parens, brackets, pabrackets, braces :: Html -> Html+parens h = char '(' +++ h +++ char ')'+brackets h = char '[' +++ h +++ char ']'+pabrackets h = toHtml "[:" +++ h +++ toHtml ":]"+braces h = char '{' +++ h +++ char '}'+++punctuate :: Html -> [Html] -> [Html]+punctuate _ [] = []+punctuate h (d0:ds) = go d0 ds+ where+ go d [] = [d]+ go d (e:es) = (d +++ h) : go e es+++parenList :: [Html] -> Html+parenList = parens . hsep . punctuate comma+++ubxParenList :: [Html] -> Html+ubxParenList = ubxparens . hsep . punctuate comma+++ubxSumList :: [Html] -> Html+ubxSumList = ubxparens . hsep . punctuate (toHtml " | ")+++ubxparens :: Html -> Html+ubxparens h = toHtml "(#" <+> h <+> toHtml "#)"+++dcolon, arrow, lollipop, darrow, forallSymbol, atSign :: Bool -> Html+dcolon unicode = toHtml (if unicode then "∷" else "::")+arrow unicode = toHtml (if unicode then "→" else "->")+lollipop unicode = toHtml (if unicode then "⊸" else "%1 ->")+darrow unicode = toHtml (if unicode then "⇒" else "=>")+forallSymbol unicode = if unicode then toHtml "∀" else keyword "forall"+atSign unicode = toHtml (if unicode then "@" else "@")++multAnnotation :: Html+multAnnotation = toHtml "%"++dot :: Html+dot = toHtml "."+++-- | Generate a named anchor+namedAnchor :: String -> Html -> Html+namedAnchor n = anchor ! [XHtml.identifier n]+++linkedAnchor :: String -> Html -> Html+linkedAnchor n = anchor ! [href ('#':n)]+++-- | generate an anchor identifier for a group+groupId :: String -> String+groupId g = makeAnchorId ("g:" ++ g)++--+-- A section of HTML which is collapsible.+--++data DetailsState = DetailsOpen | DetailsClosed++collapseDetails :: String -> DetailsState -> Html -> Html+collapseDetails id_ state = tag "details" ! (identifier id_ : openAttrs)+ where openAttrs = case state of { DetailsOpen -> [emptyAttr "open"]; DetailsClosed -> [] }++thesummary :: Html -> Html+thesummary = tag "summary"++-- | Attributes for an area that toggles a collapsed area+collapseToggle :: String -> String -> [HtmlAttr]+collapseToggle id_ classes = [ theclass cs, strAttr "data-details-id" id_ ]+ where cs = unwords (words classes ++ ["details-toggle"])++-- | Attributes for an area that toggles a collapsed area,+-- and displays a control.+collapseControl :: String -> String -> [HtmlAttr]+collapseControl id_ classes = collapseToggle id_ cs+ where cs = unwords (words classes ++ ["details-toggle-control"])
@@ -0,0 +1,986 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE BangPatterns #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Convert+-- Copyright : (c) Isaac Dupree 2009,+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Conversion between TyThing and HsDecl. This functionality may be moved into+-- GHC at some point.+-----------------------------------------------------------------------------+module Haddock.Convert (+ tyThingToLHsDecl,+ synifyInstHead,+ synifyFamInst,+ PrintRuntimeReps(..),+) where++import Control.DeepSeq (force)+import GHC.Data.Bag ( emptyBag )+import GHC.Types.Basic ( TupleSort(..), DefMethSpec(..), TopLevelFlag(..) )+import GHC.Types.SourceText (SourceText(..))+import GHC.Types.Fixity (LexicalFixity(..))+import GHC.Core.Class+import GHC.Core.Coercion.Axiom+import GHC.Core.ConLike+import GHC.Core.DataCon+import GHC.Core.FamInstEnv+import GHC.Core.PatSyn+import GHC.Core.TyCon+import GHC.Core.Type+import GHC.Core.TyCo.Rep+import GHC.Core.TyCo.Compare( eqTypes )++import GHC.Hs+import GHC.Types.TyThing+import GHC.Types.Name+import GHC.Types.Name.Set ( emptyNameSet )+import GHC.Types.Name.Reader ( mkVarUnqual )+import GHC.Builtin.Types.Prim ( alphaTyVars )+import GHC.Builtin.Types ( eqTyConName, listTyConName, liftedTypeKindTyConName+ , unitTy, promotedNilDataCon, promotedConsDataCon )+import GHC.Builtin.Names ( hasKey, eqTyConKey, ipClassKey, tYPETyConKey+ , liftedDataConKey, boxedRepDataConKey )+import GHC.Types.Unique ( getUnique )+import GHC.Utils.Misc ( chkAppend, dropList, equalLength+ , filterByList, filterOut )+import GHC.Utils.Panic.Plain ( assert )+import GHC.Types.Var+import GHC.Types.Var.Set+import GHC.Types.SrcLoc++import Language.Haskell.Syntax.Basic (FieldLabelString(..))++import Haddock.Types+import Haddock.Interface.Specialize+import Haddock.GhcUtils ( orderedFVs, defaultRuntimeRepVars, mkEmptySigType )++import Data.Either (lefts, rights)+import Data.Maybe ( catMaybes, mapMaybe, maybeToList )+import Data.Either ( partitionEithers )+++-- | Whether or not to default 'RuntimeRep' variables to 'LiftedRep'. Check+-- out Note [Defaulting RuntimeRep variables] in GHC.Iface.Type for the+-- motivation.+data PrintRuntimeReps = ShowRuntimeRep | HideRuntimeRep deriving Show++-- the main function here! yay!+tyThingToLHsDecl+ :: PrintRuntimeReps+ -> TyThing+ -> Either String ([String], (HsDecl GhcRn))+tyThingToLHsDecl prr t = case t of+ -- ids (functions and zero-argument a.k.a. CAFs) get a type signature.+ -- Including built-in functions like seq.+ -- foreign-imported functions could be represented with ForD+ -- instead of SigD if we wanted...+ --+ -- in a future code version we could turn idVarDetails = foreign-call+ -- into a ForD instead of a SigD if we wanted. Haddock doesn't+ -- need to care.+ AnId i -> allOK $ SigD noExtField (synifyIdSig prr ImplicitizeForAll [] i)++ -- type-constructors (e.g. Maybe) are complicated, put the definition+ -- later in the file (also it's used for class associated-types too.)+ ATyCon tc+ | Just cl <- tyConClass_maybe tc -- classes are just a little tedious+ -> let extractFamilyDecl :: TyClDecl a -> Either String (FamilyDecl a)+ extractFamilyDecl (FamDecl _ d) = return d+ extractFamilyDecl _ =+ Left "tyThingToLHsDecl: impossible associated tycon"++ cvt :: HsTyVarBndr flag GhcRn -> HsType GhcRn+ -- Without this signature, we trigger GHC#18932+ cvt (UserTyVar _ _ n) = HsTyVar noAnn NotPromoted n+ cvt (KindedTyVar _ _ (L name_loc n) kind) = HsKindSig noAnn+ (L (na2la name_loc) (HsTyVar noAnn NotPromoted (L name_loc n))) kind++ -- | Convert a LHsTyVarBndr to an equivalent LHsType.+ hsLTyVarBndrToType :: LHsTyVarBndr flag GhcRn -> LHsType GhcRn+ hsLTyVarBndrToType = fmap cvt++ extractFamDefDecl :: FamilyDecl GhcRn -> Type -> TyFamDefltDecl GhcRn+ extractFamDefDecl fd rhs =+ TyFamInstDecl noAnn $ FamEqn+ { feqn_ext = noAnn+ , feqn_tycon = fdLName fd+ , feqn_bndrs = HsOuterImplicit{hso_ximplicit = hsq_ext (fdTyVars fd)}+ , feqn_pats = map (HsValArg . hsLTyVarBndrToType) $+ hsq_explicit $ fdTyVars fd+ , feqn_fixity = fdFixity fd+ , feqn_rhs = synifyType WithinType [] rhs }++ extractAtItem+ :: ClassATItem+ -> Either String (LFamilyDecl GhcRn, Maybe (LTyFamDefltDecl GhcRn))+ extractAtItem (ATI at_tc def) = do+ tyDecl <- synifyTyCon prr Nothing at_tc+ famDecl <- extractFamilyDecl tyDecl+ let defEqnTy = fmap (noLocA . extractFamDefDecl famDecl . fst) def+ pure (noLocA famDecl, defEqnTy)++ atTyClDecls = map extractAtItem (classATItems cl)+ (atFamDecls, atDefFamDecls) = unzip (rights atTyClDecls)+ vs = tyConVisibleTyVars (classTyCon cl)++ in withErrs (lefts atTyClDecls) . TyClD noExtField $ ClassDecl+ { tcdCtxt = Just $ synifyCtx (classSCTheta cl)+ , tcdLayout = NoLayoutInfo+ , tcdLName = synifyNameN cl+ , tcdTyVars = synifyTyVars vs+ , tcdFixity = synifyFixity cl+ , tcdFDs = map (\ (l,r) -> noLocA+ (FunDep noAnn (map (noLocA . getName) l) (map (noLocA . getName) r)) ) $+ snd $ classTvsFds cl+ , tcdSigs = noLocA (MinimalSig (noAnn, NoSourceText) . noLocA . fmap noLocA $ classMinimalDef cl) :+ [ noLocA tcdSig+ | clsOp <- classOpItems cl+ , tcdSig <- synifyTcIdSig vs clsOp ]+ , tcdMeths = emptyBag --ignore default method definitions, they don't affect signature+ -- class associated-types are a subset of TyCon:+ , tcdATs = atFamDecls+ , tcdATDefs = catMaybes atDefFamDecls+ , tcdDocs = [] --we don't have any docs at this point+ , tcdCExt = emptyNameSet }+ | otherwise+ -> synifyTyCon prr Nothing tc >>= allOK . TyClD noExtField++ -- type-constructors (e.g. Maybe) are complicated, put the definition+ -- later in the file (also it's used for class associated-types too.)+ ACoAxiom ax -> synifyAxiom ax >>= allOK++ -- a data-constructor alone just gets rendered as a function:+ AConLike (RealDataCon dc) -> allOK $ SigD noExtField (TypeSig noAnn [synifyNameN dc]+ (synifySigWcType ImplicitizeForAll [] (dataConWrapperType dc)))++ AConLike (PatSynCon ps) ->+ allOK . SigD noExtField $ PatSynSig noAnn [synifyNameN ps] (synifyPatSynSigType ps)+ where+ withErrs e x = return (e, x)+ allOK x = return (mempty, x)++synifyAxBranch :: TyCon -> CoAxBranch -> TyFamInstEqn GhcRn+synifyAxBranch tc (CoAxBranch { cab_tvs = tkvs, cab_lhs = args, cab_rhs = rhs })+ = let name = synifyNameN tc+ args_types_only = filterOutInvisibleTypes tc args+ typats = map (synifyType WithinType []) args_types_only+ annot_typats = zipWith3 annotHsType args_poly args_types_only typats+ hs_rhs = synifyType WithinType [] rhs+ outer_bndrs = HsOuterImplicit{hso_ximplicit = map tyVarName tkvs}+ -- TODO: this must change eventually+ in FamEqn { feqn_ext = noAnn+ , feqn_tycon = name+ , feqn_bndrs = outer_bndrs+ , feqn_pats = map HsValArg annot_typats+ , feqn_fixity = synifyFixity name+ , feqn_rhs = hs_rhs }+ where+ args_poly = tyConArgsPolyKinded tc++synifyAxiom :: CoAxiom br -> Either String (HsDecl GhcRn)+synifyAxiom ax@(CoAxiom { co_ax_tc = tc })+ | isOpenTypeFamilyTyCon tc+ , Just branch <- coAxiomSingleBranch_maybe ax+ = return $ InstD noExtField+ $ TyFamInstD noExtField+ $ TyFamInstDecl { tfid_xtn = noAnn, tfid_eqn = synifyAxBranch tc branch }++ | Just ax' <- isClosedSynFamilyTyConWithAxiom_maybe tc+ , getUnique ax' == getUnique ax -- without the getUniques, type error+ = synifyTyCon ShowRuntimeRep (Just ax) tc >>= return . TyClD noExtField++ | otherwise+ = Left "synifyAxiom: closed/open family confusion"++-- | Turn type constructors into data declarations, type families, or type synonyms+synifyTyCon+ :: PrintRuntimeReps+ -> Maybe (CoAxiom br) -- ^ RHS of type synonym+ -> TyCon -- ^ type constructor to convert+ -> Either String (TyClDecl GhcRn)+synifyTyCon prr _coax tc+ | isPrimTyCon tc+ = return $+ DataDecl { tcdLName = synifyNameN tc+ , tcdTyVars = HsQTvs { hsq_ext = [] -- No kind polymorphism+ , hsq_explicit = zipWith mk_hs_tv+ (map scaledThing tyVarKinds)+ alphaTyVars --a, b, c... which are unfortunately all kind *+ }++ , tcdFixity = synifyFixity tc++ , tcdDataDefn = HsDataDefn { dd_ext = noExtField+ , dd_cons = DataTypeCons False [] -- No constructors; arbitrary lie, they are neither+ -- algebraic data nor newtype:+ , dd_ctxt = Nothing+ , dd_cType = Nothing+ , dd_kindSig = synifyDataTyConReturnKind tc+ -- we have their kind accurately:+ , dd_derivs = [] }+ , tcdDExt = DataDeclRn False emptyNameSet }+ where+ -- tyConTyVars doesn't work on fun/prim, but we can make them up:+ mk_hs_tv realKind fakeTyVar+ | isLiftedTypeKind realKind = noLocA $ UserTyVar noAnn () (noLocA (getName fakeTyVar))+ | otherwise = noLocA $ KindedTyVar noAnn () (noLocA (getName fakeTyVar)) (synifyKindSig realKind)++ conKind = defaultType prr (tyConKind tc)+ tyVarKinds = fst . splitFunTys . snd . splitInvisPiTys $ conKind++synifyTyCon _prr _coax tc+ | Just flav <- famTyConFlav_maybe tc+ = case flav of+ -- Type families+ OpenSynFamilyTyCon -> mkFamDecl OpenTypeFamily+ ClosedSynFamilyTyCon mb+ | Just (CoAxiom { co_ax_branches = branches }) <- mb+ -> mkFamDecl $ ClosedTypeFamily $ Just+ $ map (noLocA . synifyAxBranch tc) (fromBranches branches)+ | otherwise+ -> mkFamDecl $ ClosedTypeFamily $ Just []+ BuiltInSynFamTyCon {}+ -> mkFamDecl $ ClosedTypeFamily $ Just []+ AbstractClosedSynFamilyTyCon {}+ -> mkFamDecl $ ClosedTypeFamily Nothing+ DataFamilyTyCon {}+ -> mkFamDecl DataFamily+ where+ resultVar = tyConFamilyResVar_maybe tc+ mkFamDecl i = return $ FamDecl noExtField $+ FamilyDecl { fdExt = noAnn+ , fdInfo = i+ , fdTopLevel = TopLevel+ , fdLName = synifyNameN tc+ , fdTyVars = synifyTyVars (tyConVisibleTyVars tc)+ , fdFixity = synifyFixity tc+ , fdResultSig =+ synifyFamilyResultSig resultVar (tyConResKind tc)+ , fdInjectivityAnn =+ synifyInjectivityAnn resultVar (tyConTyVars tc)+ (tyConInjectivityInfo tc)+ }++synifyTyCon _prr coax tc+ | Just ty <- synTyConRhs_maybe tc+ = return $ SynDecl { tcdSExt = emptyNameSet+ , tcdLName = synifyNameN tc+ , tcdTyVars = synifyTyVars (tyConVisibleTyVars tc)+ , tcdFixity = synifyFixity tc+ , tcdRhs = synifyType WithinType [] ty }+ | otherwise = do+ -- (closed) newtype and data+ let alg_ctx = synifyCtx (tyConStupidTheta tc)+ name = case coax of+ Just a -> synifyNameN a -- Data families are named according to their+ -- CoAxioms, not their TyCons+ _ -> synifyNameN tc+ tyvars = synifyTyVars (tyConVisibleTyVars tc)+ kindSig = synifyDataTyConReturnKind tc+ -- The data constructors.+ --+ -- Any data-constructors not exported from the module that *defines* the+ -- type will not (cannot) be included.+ --+ -- Very simple constructors, Haskell98 with no existentials or anything,+ -- probably look nicer in non-GADT syntax. In source code, all constructors+ -- must be declared with the same (GADT vs. not) syntax, and it probably+ -- is less confusing to follow that principle for the documentation as well.+ --+ -- There is no sensible infix-representation for GADT-syntax constructor+ -- declarations. They cannot be made in source code, but we could end up+ -- with some here in the case where some constructors use existentials.+ -- That seems like an acceptable compromise (they'll just be documented+ -- in prefix position), since, otherwise, the logic (at best) gets much more+ -- complicated. (would use dataConIsInfix.)+ use_gadt_syntax = isGadtSyntaxTyCon tc+ consRaw <- case partitionEithers $ synifyDataCon use_gadt_syntax <$> tyConDataCons tc of+ ([], consRaw) -> Right consRaw+ (errs, _) -> Left (unlines errs)+ cons <- case (isNewTyCon tc, consRaw) of+ (False, cons) -> Right (DataTypeCons False cons)+ (True, [con]) -> Right (NewTypeCon con)+ (True, _) -> Left "Newtype hasn't 1 constructor"++ let -- "deriving" doesn't affect the signature, no need to specify any.+ alg_deriv = []+ defn = HsDataDefn { dd_ext = noExtField+ , dd_ctxt = Just alg_ctx+ , dd_cType = Nothing+ , dd_kindSig = kindSig+ , dd_cons = cons+ , dd_derivs = alg_deriv }+ pure DataDecl { tcdLName = name, tcdTyVars = tyvars+ , tcdFixity = synifyFixity name+ , tcdDataDefn = defn+ , tcdDExt = DataDeclRn False emptyNameSet }++-- | In this module, every TyCon being considered has come from an interface+-- file. This means that when considering a data type constructor such as:+--+-- > data Foo (w :: *) (m :: * -> *) (a :: *)+--+-- Then its tyConKind will be (* -> (* -> *) -> * -> *). But beware! We are+-- also rendering the type variables of Foo, so if we synify the tyConKind of+-- Foo in full, we will end up displaying this in Haddock:+--+-- > data Foo (w :: *) (m :: * -> *) (a :: *)+-- > :: * -> (* -> *) -> * -> *+--+-- Which is entirely wrong (#548). We only want to display the /return/ kind,+-- which this function obtains.+synifyDataTyConReturnKind :: TyCon -> Maybe (LHsKind GhcRn)+synifyDataTyConReturnKind tc+ | isLiftedTypeKind ret_kind = Nothing -- Don't bother displaying :: *+ | otherwise = Just (synifyKindSig ret_kind)+ where ret_kind = tyConResKind tc++synifyInjectivityAnn :: Maybe Name -> [TyVar] -> Injectivity+ -> Maybe (LInjectivityAnn GhcRn)+synifyInjectivityAnn Nothing _ _ = Nothing+synifyInjectivityAnn _ _ NotInjective = Nothing+synifyInjectivityAnn (Just lhs) tvs (Injective inj) =+ let rhs = map (noLocA . tyVarName) (filterByList inj tvs)+ in Just $ noLocA $ InjectivityAnn noAnn (noLocA lhs) rhs++synifyFamilyResultSig :: Maybe Name -> Kind -> LFamilyResultSig GhcRn+synifyFamilyResultSig Nothing kind+ | isLiftedTypeKind kind = noLocA $ NoSig noExtField+ | otherwise = noLocA $ KindSig noExtField (synifyKindSig kind)+synifyFamilyResultSig (Just name) kind =+ noLocA $ TyVarSig noExtField (noLocA $ KindedTyVar noAnn () (noLocA name) (synifyKindSig kind))++-- User beware: it is your responsibility to pass True (use_gadt_syntax)+-- for any constructor that would be misrepresented by omitting its+-- result-type.+-- But you might want pass False in simple enough cases,+-- if you think it looks better.+synifyDataCon :: Bool -> DataCon -> Either String (LConDecl GhcRn)+synifyDataCon use_gadt_syntax dc =+ let+ -- dataConIsInfix allegedly tells us whether it was declared with+ -- infix *syntax*.+ use_infix_syntax = dataConIsInfix dc+ use_named_field_syntax = not (null field_tys)+ name = synifyNameN dc+ -- con_qvars means a different thing depending on gadt-syntax+ (_univ_tvs, ex_tvs, _eq_spec, theta, arg_tys, res_ty) = dataConFullSig dc+ user_tvbndrs = dataConUserTyVarBinders dc -- Used for GADT data constructors++ outer_bndrs | null user_tvbndrs+ = HsOuterImplicit { hso_ximplicit = [] }+ | otherwise+ = HsOuterExplicit { hso_xexplicit = noExtField+ , hso_bndrs = map synifyTyVarBndr user_tvbndrs }++ -- skip any EqTheta, use 'orig'inal syntax+ ctx | null theta = Nothing+ | otherwise = Just $ synifyCtx theta++ linear_tys =+ zipWith (\ty bang ->+ let tySyn = synifyType WithinType [] (scaledThing ty)+ in case bang of+ (HsSrcBang _ NoSrcUnpack NoSrcStrict) -> tySyn+ bang' -> noLocA $ HsBangTy noAnn bang' tySyn)+ arg_tys (dataConSrcBangs dc)++ field_tys = zipWith con_decl_field (dataConFieldLabels dc) linear_tys+ con_decl_field fl synTy = noLocA $+ ConDeclField noAnn [noLocA $ FieldOcc (flSelector fl) (noLocA $ mkVarUnqual $ field_label $ flLabel fl)] synTy+ Nothing++ mk_h98_arg_tys :: Either String (HsConDeclH98Details GhcRn)+ mk_h98_arg_tys = case (use_named_field_syntax, use_infix_syntax) of+ (True,True) -> Left "synifyDataCon: contradiction!"+ (True,False) -> return $ RecCon (noLocA field_tys)+ (False,False) -> return $ PrefixCon noTypeArgs (map hsUnrestricted linear_tys)+ (False,True) -> case linear_tys of+ [a,b] -> return $ InfixCon (hsUnrestricted a) (hsUnrestricted b)+ _ -> Left "synifyDataCon: infix with non-2 args?"++ mk_gadt_arg_tys :: HsConDeclGADTDetails GhcRn+ mk_gadt_arg_tys+ | use_named_field_syntax = RecConGADT (noLocA field_tys) noHsUniTok+ | otherwise = PrefixConGADT (map hsUnrestricted linear_tys)++ -- finally we get synifyDataCon's result!+ in if use_gadt_syntax+ then do+ let hat = mk_gadt_arg_tys+ return $ noLocA $ ConDeclGADT+ { con_g_ext = noAnn+ , con_names = pure name+ , con_dcolon = noHsUniTok+ , con_bndrs = noLocA outer_bndrs+ , con_mb_cxt = ctx+ , con_g_args = hat+ , con_res_ty = synifyType WithinType [] res_ty+ , con_doc = Nothing }+ else do+ hat <- mk_h98_arg_tys+ return $ noLocA $ ConDeclH98+ { con_ext = noAnn+ , con_name = name+ , con_forall = False+ , con_ex_tvs = map (synifyTyVarBndr . (mkForAllTyBinder InferredSpec)) ex_tvs+ , con_mb_cxt = ctx+ , con_args = hat+ , con_doc = Nothing }++synifyNameN :: NamedThing n => n -> LocatedN Name+synifyNameN n = L (noAnnSrcSpan $ srcLocSpan (getSrcLoc n)) (getName n)++-- synifyName :: NamedThing n => n -> LocatedA Name+-- synifyName n = L (noAnnSrcSpan $ srcLocSpan (getSrcLoc n)) (getName n)++-- | Guess the fixity of a something with a name. This isn't quite right, since+-- a user can always declare an infix name in prefix form or a prefix name in+-- infix form. Unfortunately, that is not something we can usually reconstruct.+synifyFixity :: NamedThing n => n -> LexicalFixity+synifyFixity n | isSymOcc (getOccName n) = Infix+ | otherwise = Prefix++synifyIdSig+ :: PrintRuntimeReps -- ^ are we printing tyvars of kind 'RuntimeRep'?+ -> SynifyTypeState -- ^ what to do with a 'forall'+ -> [TyVar] -- ^ free variables in the type to convert+ -> Id -- ^ the 'Id' from which to get the type signature+ -> Sig GhcRn+synifyIdSig prr s vs i = TypeSig noAnn [n] (synifySigWcType s vs t)+ where+ !n = force $ synifyNameN i+ t = defaultType prr (varType i)++-- | Turn a 'ClassOpItem' into a list of signatures. The list returned is going+-- to contain the synified 'ClassOpSig' as well (when appropriate) a default+-- 'ClassOpSig'.+synifyTcIdSig :: [TyVar] -> ClassOpItem -> [Sig GhcRn]+synifyTcIdSig vs (i, dm) =+ [ ClassOpSig noAnn False [synifyNameN i] (mainSig (varType i)) ] +++ [ ClassOpSig noAnn True [noLocA dn] (defSig dt)+ | Just (dn, GenericDM dt) <- [dm] ]+ where+ mainSig t = synifySigType DeleteTopLevelQuantification vs t+ defSig t = synifySigType ImplicitizeForAll vs t++synifyCtx :: [PredType] -> LHsContext GhcRn+synifyCtx ts = noLocA ( map (synifyType WithinType []) ts)+++synifyTyVars :: [TyVar] -> LHsQTyVars GhcRn+synifyTyVars ktvs = HsQTvs { hsq_ext = []+ , hsq_explicit = map synifyTyVar ktvs }++synifyTyVar :: TyVar -> LHsTyVarBndr () GhcRn+synifyTyVar = synify_ty_var emptyVarSet ()++synifyTyVarBndr :: VarBndr TyVar flag -> LHsTyVarBndr flag GhcRn+synifyTyVarBndr = synifyTyVarBndr' emptyVarSet++synifyTyVarBndr' :: VarSet -> VarBndr TyVar flag -> LHsTyVarBndr flag GhcRn+synifyTyVarBndr' no_kinds (Bndr tv spec) = synify_ty_var no_kinds spec tv++-- | Like 'synifyTyVarBndr', but accepts a set of variables for which to omit kind+-- signatures (even if they don't have the lifted type kind).+synify_ty_var :: VarSet -> flag -> TyVar -> LHsTyVarBndr flag GhcRn+synify_ty_var no_kinds flag tv+ | isLiftedTypeKind kind || tv `elemVarSet` no_kinds+ = noLocA (UserTyVar noAnn flag (noLocA name))+ | otherwise = noLocA (KindedTyVar noAnn flag (noLocA name) (synifyKindSig kind))+ where+ kind = tyVarKind tv+ name = getName tv++-- | Annotate (with HsKingSig) a type if the first parameter is True+-- and if the type contains a free variable.+-- This is used to synify type patterns for poly-kinded tyvars in+-- synifying class and type instances.+annotHsType :: Bool -- True <=> annotate+ -> Type -> LHsType GhcRn -> LHsType GhcRn+ -- tiny optimization: if the type is annotated, don't annotate again.+annotHsType _ _ hs_ty@(L _ (HsKindSig {})) = hs_ty+annotHsType True ty hs_ty+ | not $ isEmptyVarSet $ filterVarSet isTyVar $ tyCoVarsOfType ty+ = let ki = typeKind ty+ hs_ki = synifyType WithinType [] ki+ in noLocA (HsKindSig noAnn hs_ty hs_ki)+annotHsType _ _ hs_ty = hs_ty++-- | For every argument type that a type constructor accepts,+-- report whether or not the argument is poly-kinded. This is used to+-- eventually feed into 'annotThType'.+tyConArgsPolyKinded :: TyCon -> [Bool]+tyConArgsPolyKinded tc =+ map (is_poly_ty . tyVarKind) tc_vis_tvs+ ++ map (is_poly_ty . piTyBinderType) tc_res_kind_vis_bndrs+ ++ repeat True+ where+ is_poly_ty :: Type -> Bool+ is_poly_ty ty = not $+ isEmptyVarSet $+ filterVarSet isTyVar $+ tyCoVarsOfType ty++ tc_vis_tvs :: [TyVar]+ tc_vis_tvs = tyConVisibleTyVars tc++ tc_res_kind_vis_bndrs :: [PiTyBinder]+ tc_res_kind_vis_bndrs = filter isVisiblePiTyBinder $ fst $ splitPiTys $ tyConResKind tc++--states of what to do with foralls:+data SynifyTypeState+ = WithinType+ -- ^ normal situation. This is the safe one to use if you don't+ -- quite understand what's going on.+ | ImplicitizeForAll+ -- ^ beginning of a function definition, in which, to make it look+ -- less ugly, those rank-1 foralls (without kind annotations) are made+ -- implicit.+ | DeleteTopLevelQuantification+ -- ^ because in class methods the context is added to the type+ -- (e.g. adding @forall a. Num a =>@ to @(+) :: a -> a -> a@)+ -- which is rather sensible,+ -- but we want to restore things to the source-syntax situation where+ -- the defining class gets to quantify all its functions for free!+++synifySigType :: SynifyTypeState -> [TyVar] -> Type -> LHsSigType GhcRn+-- The use of mkEmptySigType (which uses empty binders in OuterImplicit)+-- is a bit suspicious; what if the type has free variables?+synifySigType s vs ty = mkEmptySigType (synifyType s vs ty)++synifySigWcType :: SynifyTypeState -> [TyVar] -> Type -> LHsSigWcType GhcRn+-- Ditto (see synifySigType)+synifySigWcType s vs ty = mkEmptyWildCardBndrs (mkEmptySigType (synifyType s vs ty))++synifyPatSynSigType :: PatSyn -> LHsSigType GhcRn+-- Ditto (see synifySigType)+synifyPatSynSigType ps = mkEmptySigType (synifyPatSynType ps)++-- | Depending on the first argument, try to default all type variables of kind+-- 'RuntimeRep' to 'LiftedType'.+defaultType :: PrintRuntimeReps -> Type -> Type+defaultType ShowRuntimeRep = id+defaultType HideRuntimeRep = defaultRuntimeRepVars++-- | Convert a core type into an 'HsType'.+synifyType+ :: SynifyTypeState -- ^ what to do with a 'forall'+ -> [TyVar] -- ^ free variables in the type to convert+ -> Type -- ^ the type to convert+ -> LHsType GhcRn+synifyType _ _ (TyVarTy tv) = noLocA $ HsTyVar noAnn NotPromoted $ noLocA (getName tv)+synifyType _ vs (TyConApp tc tys)+ = maybe_sig res_ty+ where+ res_ty :: LHsType GhcRn+ res_ty+ -- Use */# instead of TYPE 'Lifted/TYPE 'Unlifted (#473)+ | tc `hasKey` tYPETyConKey+ , [TyConApp rep [TyConApp lev []]] <- tys+ , rep `hasKey` boxedRepDataConKey+ , lev `hasKey` liftedDataConKey+ = noLocA (HsTyVar noAnn NotPromoted (noLocA liftedTypeKindTyConName))+ -- Use non-prefix tuple syntax where possible, because it looks nicer.+ | Just sort <- tyConTuple_maybe tc+ , tyConArity tc == tys_len+ = noLocA $ HsTupleTy noAnn+ (case sort of+ BoxedTuple -> HsBoxedOrConstraintTuple+ ConstraintTuple -> HsBoxedOrConstraintTuple+ UnboxedTuple -> HsUnboxedTuple)+ (map (synifyType WithinType vs) vis_tys)+ | isUnboxedSumTyCon tc = noLocA $ HsSumTy noAnn (map (synifyType WithinType vs) vis_tys)+ | Just dc <- isPromotedDataCon_maybe tc+ , isTupleDataCon dc+ , dataConSourceArity dc == length vis_tys+ = noLocA $ HsExplicitTupleTy noExtField (map (synifyType WithinType vs) vis_tys)+ -- ditto for lists+ | getName tc == listTyConName, [ty] <- vis_tys =+ noLocA $ HsListTy noAnn (synifyType WithinType vs ty)+ | tc == promotedNilDataCon, [] <- vis_tys+ = noLocA $ HsExplicitListTy noExtField IsPromoted []+ | tc == promotedConsDataCon+ , [ty1, ty2] <- vis_tys+ = let hTy = synifyType WithinType vs ty1+ in case synifyType WithinType vs ty2 of+ tTy | L _ (HsExplicitListTy _ IsPromoted tTy') <- stripKindSig tTy+ -> noLocA $ HsExplicitListTy noExtField IsPromoted (hTy : tTy')+ | otherwise+ -> noLocA $ HsOpTy noAnn IsPromoted hTy (noLocA $ getName tc) tTy+ -- ditto for implicit parameter tycons+ | tc `hasKey` ipClassKey+ , [name, ty] <- tys+ , Just x <- isStrLitTy name+ = noLocA $ HsIParamTy noAnn (noLocA $ HsIPName x) (synifyType WithinType vs ty)+ -- and equalities+ | tc `hasKey` eqTyConKey+ , [ty1, ty2] <- tys+ = noLocA $ HsOpTy noAnn+ NotPromoted+ (synifyType WithinType vs ty1)+ (noLocA eqTyConName)+ (synifyType WithinType vs ty2)+ -- and infix type operators+ | isSymOcc (nameOccName (getName tc))+ , ty1:ty2:tys_rest <- vis_tys+ = mk_app_tys (HsOpTy noAnn+ prom+ (synifyType WithinType vs ty1)+ (noLocA $ getName tc)+ (synifyType WithinType vs ty2))+ tys_rest+ -- Most TyCons:+ | otherwise+ = mk_app_tys (HsTyVar noAnn prom $ noLocA (getName tc))+ vis_tys+ where+ !prom = if isPromotedDataCon tc then IsPromoted else NotPromoted+ mk_app_tys ty_app ty_args =+ foldl (\t1 t2 -> noLocA $ HsAppTy noExtField t1 t2)+ (noLocA ty_app)+ (map (synifyType WithinType vs) $+ filterOut isCoercionTy ty_args)++ tys_len = length tys+ vis_tys = filterOutInvisibleTypes tc tys++ maybe_sig :: LHsType GhcRn -> LHsType GhcRn+ maybe_sig ty'+ | tyConAppNeedsKindSig False tc tys_len+ = let full_kind = typeKind (mkTyConApp tc tys)+ full_kind' = synifyType WithinType vs full_kind+ in noLocA $ HsKindSig noAnn ty' full_kind'+ | otherwise = ty'++synifyType _ vs ty@(AppTy {}) = let+ (ty_head, ty_args) = splitAppTys ty+ ty_head' = synifyType WithinType vs ty_head+ ty_args' = map (synifyType WithinType vs) $+ filterOut isCoercionTy $+ filterByList (map isVisibleForAllTyFlag $ appTyForAllTyFlags ty_head ty_args)+ ty_args+ in foldl (\t1 t2 -> noLocA $ HsAppTy noExtField t1 t2) ty_head' ty_args'++synifyType s vs funty@(FunTy af w t1 t2)+ | isInvisibleFunArg af = synifySigmaType s vs funty+ | otherwise = noLocA $ HsFunTy noAnn w' s1 s2+ where+ s1 = synifyType WithinType vs t1+ s2 = synifyType WithinType vs t2+ w' = synifyMult vs w++synifyType s vs forallty@(ForAllTy (Bndr _ argf) _ty) =+ case argf of+ Required -> synifyVisForAllType vs forallty+ Invisible _ -> synifySigmaType s vs forallty++synifyType _ _ (LitTy t) = noLocA $ HsTyLit noExtField $ synifyTyLit t+synifyType s vs (CastTy t _) = synifyType s vs t+synifyType _ _ (CoercionTy {}) = error "synifyType:Coercion"++-- | Process a 'Type' which starts with a visible @forall@ into an 'HsType'+synifyVisForAllType+ :: [TyVar] -- ^ free variables in the type to convert+ -> Type -- ^ the forall type to convert+ -> LHsType GhcRn+synifyVisForAllType vs ty =+ let (tvs, rho) = tcSplitForAllTysReqPreserveSynonyms ty++ sTvs = map synifyTyVarBndr tvs++ -- Figure out what the type variable order would be inferred in the+ -- absence of an explicit forall+ tvs' = orderedFVs (mkVarSet vs) [rho]++ in noLocA $ HsForAllTy { hst_tele = mkHsForAllVisTele noAnn sTvs+ , hst_xforall = noExtField+ , hst_body = synifyType WithinType (tvs' ++ vs) rho }++-- | Process a 'Type' which starts with an invisible @forall@ or a constraint+-- into an 'HsType'+synifySigmaType+ :: SynifyTypeState -- ^ what to do with the 'forall'+ -> [TyVar] -- ^ free variables in the type to convert+ -> Type -- ^ the forall type to convert+ -> LHsType GhcRn+synifySigmaType s vs ty =+ let (tvs, ctx, tau) = tcSplitSigmaTyPreserveSynonyms ty+ sPhi = HsQualTy { hst_ctxt = synifyCtx ctx+ , hst_xqual = noExtField+ , hst_body = synifyType WithinType (tvs' ++ vs) tau }++ sTy = HsForAllTy { hst_tele = mkHsForAllInvisTele noAnn sTvs+ , hst_xforall = noExtField+ , hst_body = noLocA sPhi }++ sTvs = map synifyTyVarBndr tvs++ -- Figure out what the type variable order would be inferred in the+ -- absence of an explicit forall+ tvs' = orderedFVs (mkVarSet vs) (ctx ++ [tau])++ in case s of+ DeleteTopLevelQuantification -> synifyType ImplicitizeForAll (tvs' ++ vs) tau++ -- Put a forall in if there are any type variables+ WithinType+ | not (null tvs) -> noLocA sTy+ | otherwise -> noLocA sPhi++ ImplicitizeForAll -> implicitForAll [] vs tvs ctx (synifyType WithinType) tau++-- | Put a forall in if there are any type variables which require+-- explicit kind annotations or if the inferred type variable order+-- would be different.+implicitForAll+ :: [TyCon] -- ^ type constructors that determine their args kinds+ -> [TyVar] -- ^ free variables in the type to convert+ -> [InvisTVBinder] -- ^ type variable binders in the forall+ -> ThetaType -- ^ constraints right after the forall+ -> ([TyVar] -> Type -> LHsType GhcRn) -- ^ how to convert the inner type+ -> Type -- ^ inner type+ -> LHsType GhcRn+implicitForAll tycons vs tvs ctx synInner tau+ | any (isHsKindedTyVar . unLoc) sTvs = noLocA sTy+ | tvs' /= (binderVars tvs) = noLocA sTy+ | otherwise = noLocA sPhi+ where+ sRho = synInner (tvs' ++ vs) tau+ sPhi | null ctx = unLoc sRho+ | otherwise+ = HsQualTy { hst_ctxt = synifyCtx ctx+ , hst_xqual = noExtField+ , hst_body = synInner (tvs' ++ vs) tau }+ sTy = HsForAllTy { hst_tele = mkHsForAllInvisTele noAnn sTvs+ , hst_xforall = noExtField+ , hst_body = noLocA sPhi }++ no_kinds_needed = noKindTyVars tycons tau+ sTvs = map (synifyTyVarBndr' no_kinds_needed) tvs++ -- Figure out what the type variable order would be inferred in the+ -- absence of an explicit forall+ tvs' = orderedFVs (mkVarSet vs) (ctx ++ [tau])++++-- | Find the set of type variables whose kind signatures can be properly+-- inferred just from their uses in the type signature. This means the type+-- variable to has at least one fully applied use @f x1 x2 ... xn@ where:+--+-- * @f@ has a function kind where the arguments have the same kinds+-- as @x1 x2 ... xn@.+--+-- * @f@ has a function kind whose final return has lifted type kind+--+noKindTyVars+ :: [TyCon] -- ^ type constructors that determine their args kinds+ -> Type -- ^ type to inspect+ -> VarSet -- ^ set of variables whose kinds can be inferred from uses in the type+noKindTyVars _ (TyVarTy var)+ | isLiftedTypeKind (tyVarKind var) = unitVarSet var+noKindTyVars ts ty+ | (f, xs) <- splitAppTys ty+ , not (null xs)+ = let args = map (noKindTyVars ts) xs+ func = case f of+ TyVarTy var | (xsKinds, outKind) <- splitFunTys (tyVarKind var)+ , map scaledThing xsKinds `eqTypes` map typeKind xs+ , isLiftedTypeKind outKind+ -> unitVarSet var+ TyConApp t ks | t `elem` ts+ , all noFreeVarsOfType ks+ -> mkVarSet [ v | TyVarTy v <- xs ]+ _ -> noKindTyVars ts f+ in unionVarSets (func : args)+noKindTyVars ts (ForAllTy _ t) = noKindTyVars ts t+noKindTyVars ts (FunTy _ w t1 t2) = noKindTyVars ts w `unionVarSet`+ noKindTyVars ts t1 `unionVarSet`+ noKindTyVars ts t2+noKindTyVars ts (CastTy t _) = noKindTyVars ts t+noKindTyVars _ _ = emptyVarSet++synifyMult :: [TyVar] -> Mult -> HsArrow GhcRn+synifyMult vs t = case t of+ OneTy -> HsLinearArrow (HsPct1 noHsTok noHsUniTok)+ ManyTy -> HsUnrestrictedArrow noHsUniTok+ ty -> HsExplicitMult noHsTok (synifyType WithinType vs ty) noHsUniTok++++synifyPatSynType :: PatSyn -> LHsType GhcRn+synifyPatSynType ps =+ let (univ_tvs, req_theta, ex_tvs, prov_theta, arg_tys, res_ty) = patSynSigBndr ps+ ts = maybeToList (tyConAppTyCon_maybe res_ty)++ -- HACK: a HsQualTy with theta = [unitTy] will be printed as "() =>",+ -- i.e., an explicit empty context, which is what we need. This is not+ -- possible by taking theta = [], as that will print no context at all+ req_theta' | null req_theta+ , not (null prov_theta && null ex_tvs)+ = [unitTy]+ | otherwise = req_theta++ in implicitForAll ts [] (univ_tvs ++ ex_tvs) req_theta'+ (\vs -> implicitForAll ts vs [] prov_theta (synifyType WithinType))+ (mkScaledFunTys arg_tys res_ty)++synifyTyLit :: TyLit -> HsTyLit GhcRn+synifyTyLit (NumTyLit n) = HsNumTy NoSourceText n+synifyTyLit (StrTyLit s) = HsStrTy NoSourceText s+synifyTyLit (CharTyLit c) = HsCharTy NoSourceText c++synifyKindSig :: Kind -> LHsKind GhcRn+synifyKindSig k = synifyType WithinType [] k++stripKindSig :: LHsType GhcRn -> LHsType GhcRn+stripKindSig (L _ (HsKindSig _ t _)) = t+stripKindSig t = t++synifyInstHead :: ([TyVar], [PredType], Class, [Type]) -> InstHead GhcRn+synifyInstHead (vs, preds, cls, types) = specializeInstHead $ InstHead+ { ihdClsName = getName cls+ , ihdTypes = map unLoc annot_ts+ , ihdInstType = ClassInst+ { clsiCtx = map (unLoc . synifyType WithinType []) preds+ , clsiTyVars = synifyTyVars (tyConVisibleTyVars cls_tycon)+ , clsiSigs = map synifyClsIdSig $ classMethods cls+ , clsiAssocTys = do+ (Right (FamDecl _ fam)) <- map (synifyTyCon HideRuntimeRep Nothing)+ (classATs cls)+ pure $ mkPseudoFamilyDecl fam+ }+ }+ where+ cls_tycon = classTyCon cls+ ts = filterOutInvisibleTypes cls_tycon types+ ts' = map (synifyType WithinType vs) ts+ annot_ts = zipWith3 annotHsType args_poly ts ts'+ args_poly = tyConArgsPolyKinded cls_tycon+ synifyClsIdSig = synifyIdSig ShowRuntimeRep DeleteTopLevelQuantification vs++-- Convert a family instance, this could be a type family or data family+synifyFamInst :: FamInst -> Bool -> Either String (InstHead GhcRn)+synifyFamInst fi opaque = do+ ityp' <- ityp fam_flavor+ return InstHead+ { ihdClsName = fi_fam fi+ , ihdTypes = map unLoc annot_ts+ , ihdInstType = ityp'+ }+ where+ ityp SynFamilyInst | opaque = return $ TypeInst Nothing+ ityp SynFamilyInst =+ return . TypeInst . Just . unLoc $ synifyType WithinType [] fam_rhs+ ityp (DataFamilyInst c) =+ DataInst <$> synifyTyCon HideRuntimeRep (Just $ famInstAxiom fi) c+ fam_tc = famInstTyCon fi+ fam_flavor = fi_flavor fi+ fam_lhs = fi_tys fi+ fam_rhs = fi_rhs fi++ eta_expanded_lhs+ -- eta-expand lhs types, because sometimes data/newtype+ -- instances are eta-reduced; See Trac #9692+ -- See Note [Eta reduction for data family axioms] in GHC.Tc.TyCl.Instance in GHC+ | DataFamilyInst rep_tc <- fam_flavor+ = let (_, rep_tc_args) = splitTyConApp fam_rhs+ etad_tyvars = dropList rep_tc_args $ tyConTyVars rep_tc+ etad_tys = mkTyVarTys etad_tyvars+ eta_exp_lhs = fam_lhs `chkAppend` etad_tys+ in eta_exp_lhs+ | otherwise+ = fam_lhs++ ts = filterOutInvisibleTypes fam_tc eta_expanded_lhs+ synifyTypes = map (synifyType WithinType [])+ ts' = synifyTypes ts+ annot_ts = zipWith3 annotHsType args_poly ts ts'+ args_poly = tyConArgsPolyKinded fam_tc++{-+Note [Invariant: Never expand type synonyms]++In haddock, we never want to expand a type synonym that may be presented to the+user, as we want to keep the link to the abstraction captured in the synonym.++All code in Haddock.Convert must make sure that this invariant holds.++See https://github.com/haskell/haddock/issues/879 for a bug where this+invariant didn't hold.+-}++-- | A version of 'TcType.tcSplitSigmaTy' that:+--+-- 1. Preserves type synonyms.+-- 2. Returns 'InvisTVBinder's instead of 'TyVar's.+--+-- See Note [Invariant: Never expand type synonyms]+tcSplitSigmaTyPreserveSynonyms :: Type -> ([InvisTVBinder], ThetaType, Type)+tcSplitSigmaTyPreserveSynonyms ty =+ case tcSplitForAllTysInvisPreserveSynonyms ty of+ (tvs, rho) -> case tcSplitPhiTyPreserveSynonyms rho of+ (theta, tau) -> (tvs, theta, tau)++-- | See Note [Invariant: Never expand type synonyms]+tcSplitSomeForAllTysPreserveSynonyms ::+ (ForAllTyFlag -> Bool) -> Type -> ([ForAllTyBinder], Type)+tcSplitSomeForAllTysPreserveSynonyms argf_pred ty = split ty ty []+ where+ split _ (ForAllTy tvb@(Bndr _ argf) ty') tvs+ | argf_pred argf = split ty' ty' (tvb:tvs)+ split orig_ty _ tvs = (reverse tvs, orig_ty)++-- | See Note [Invariant: Never expand type synonyms]+tcSplitForAllTysReqPreserveSynonyms :: Type -> ([ReqTVBinder], Type)+tcSplitForAllTysReqPreserveSynonyms ty =+ let (all_bndrs, body) = tcSplitSomeForAllTysPreserveSynonyms isVisibleForAllTyFlag ty+ req_bndrs = mapMaybe mk_req_bndr_maybe all_bndrs in+ assert ( req_bndrs `equalLength` all_bndrs)+ (req_bndrs, body)+ where+ mk_req_bndr_maybe :: ForAllTyBinder -> Maybe ReqTVBinder+ mk_req_bndr_maybe (Bndr tv argf) = case argf of+ Required -> Just $ Bndr tv ()+ Invisible _ -> Nothing++-- | See Note [Invariant: Never expand type synonyms]+tcSplitForAllTysInvisPreserveSynonyms :: Type -> ([InvisTVBinder], Type)+tcSplitForAllTysInvisPreserveSynonyms ty =+ let (all_bndrs, body) = tcSplitSomeForAllTysPreserveSynonyms isInvisibleForAllTyFlag ty+ inv_bndrs = mapMaybe mk_inv_bndr_maybe all_bndrs in+ assert ( inv_bndrs `equalLength` all_bndrs)+ (inv_bndrs, body)+ where+ mk_inv_bndr_maybe :: ForAllTyBinder -> Maybe InvisTVBinder+ mk_inv_bndr_maybe (Bndr tv argf) = case argf of+ Invisible s -> Just $ Bndr tv s+ Required -> Nothing++-- | See Note [Invariant: Never expand type synonyms]++-- | See Note [Invariant: Never expand type synonyms]+tcSplitPhiTyPreserveSynonyms :: Type -> (ThetaType, Type)+tcSplitPhiTyPreserveSynonyms ty0 = split ty0 []+ where+ split ty ts+ = case tcSplitPredFunTyPreserveSynonyms_maybe ty of+ Just (pred_, ty') -> split ty' (pred_:ts)+ Nothing -> (reverse ts, ty)++-- | See Note [Invariant: Never expand type synonyms]+tcSplitPredFunTyPreserveSynonyms_maybe :: Type -> Maybe (PredType, Type)+tcSplitPredFunTyPreserveSynonyms_maybe (FunTy af _ arg res)+ | isInvisibleFunArg af = Just (arg, res)+tcSplitPredFunTyPreserveSynonyms_maybe _ = Nothing
@@ -0,0 +1,34 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Haddock.Doc ( module Documentation.Haddock.Doc+ , docCodeBlock+ , combineDocumentation+ ) where++import Data.Maybe+import Documentation.Haddock.Doc+import Haddock.Types+import Haddock.Utils (mkMeta)++combineDocumentation :: Documentation name -> Maybe (MDoc name)+combineDocumentation (Documentation Nothing Nothing) = Nothing+combineDocumentation (Documentation mDoc mWarning) =+ Just (maybe emptyMetaDoc mkMeta mWarning+ `metaDocAppend`+ fromMaybe emptyMetaDoc mDoc)++-- Drop trailing whitespace from @..@ code blocks. Otherwise this:+--+-- -- @+-- -- foo+-- -- @+--+-- turns into (DocCodeBlock "\nfoo\n ") which when rendered in HTML+-- gives an extra vertical space after the code block. The single space+-- on the final line seems to trigger the extra vertical space.+--+docCodeBlock :: DocH mod id -> DocH mod id+docCodeBlock (DocString s)+ = DocString (reverse $ dropWhile (`elem` " \t") $ reverse s)+docCodeBlock (DocAppend l r)+ = DocAppend l (docCodeBlock r)+docCodeBlock d = d
@@ -0,0 +1,777 @@+{-# LANGUAGE BangPatterns, FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MonadComprehensions #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}+{-# OPTIONS_HADDOCK hide #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.GhcUtils+-- Copyright : (c) David Waern 2006-2009+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Utils for dealing with types from the GHC API+-----------------------------------------------------------------------------+module Haddock.GhcUtils where+++import Control.Arrow+import Data.Char ( isSpace )+import Data.Foldable ( toList, foldl' )+import Data.List.NonEmpty ( NonEmpty )+import Data.Maybe ( mapMaybe, fromMaybe )+import qualified Data.Set as Set++import Haddock.Types( DocName, DocNameI, XRecCond )++import GHC.Utils.FV as FV+import GHC.Utils.Outputable ( Outputable )+import GHC.Utils.Panic ( panic )+import GHC.Driver.Ppr (showPpr )+import GHC.Types.Name+import GHC.Unit.Module+import GHC+import GHC.Driver.Session+import GHC.Types.SrcLoc ( advanceSrcLoc )+import GHC.Types.Var ( Specificity, VarBndr(..), TyVarBinder+ , tyVarKind, updateTyVarKind, isInvisibleForAllTyFlag )+import GHC.Types.Var.Set ( VarSet, emptyVarSet )+import GHC.Types.Var.Env ( TyVarEnv, extendVarEnv, elemVarEnv, emptyVarEnv )+import GHC.Core.TyCo.Rep ( Type(..) )+import GHC.Core.Type ( isRuntimeRepVar, binderVar )+import GHC.Builtin.Types( liftedRepTy )++import GHC.Data.StringBuffer ( StringBuffer )+import qualified GHC.Data.StringBuffer as S++import Data.ByteString ( ByteString )+import qualified Data.ByteString as BS+import qualified Data.ByteString.Internal as BS++import GHC.HsToCore.Docs++moduleString :: Module -> String+moduleString = moduleNameString . moduleName++isNameSym :: Name -> Bool+isNameSym = isSymOcc . nameOccName++-- Useful when there is a signature with multiple names, e.g.+-- foo, bar :: Types..+-- but only one of the names is exported and we have to change the+-- type signature to only include the exported names.+filterLSigNames :: (IdP (GhcPass p) -> Bool) -> LSig (GhcPass p) -> Maybe (LSig (GhcPass p))+filterLSigNames p (L loc sig) = L loc <$> (filterSigNames p sig)++filterSigNames :: (IdP (GhcPass p) -> Bool) -> Sig (GhcPass p) -> Maybe (Sig (GhcPass p))+filterSigNames p orig@(SpecSig _ n _ _) = ifTrueJust (p $ unLoc n) orig+filterSigNames p orig@(InlineSig _ n _) = ifTrueJust (p $ unLoc n) orig+filterSigNames p (FixSig _ (FixitySig _ ns ty)) =+ case filter (p . unLoc) ns of+ [] -> Nothing+ filtered -> Just (FixSig noAnn (FixitySig noExtField filtered ty))+filterSigNames _ orig@(MinimalSig _ _) = Just orig+filterSigNames p (TypeSig _ ns ty) =+ case filter (p . unLoc) ns of+ [] -> Nothing+ filtered -> Just (TypeSig noAnn filtered ty)+filterSigNames p (ClassOpSig _ is_default ns ty) =+ case filter (p . unLoc) ns of+ [] -> Nothing+ filtered -> Just (ClassOpSig noAnn is_default filtered ty)+filterSigNames p (PatSynSig _ ns ty) =+ case filter (p . unLoc) ns of+ [] -> Nothing+ filtered -> Just (PatSynSig noAnn filtered ty)+filterSigNames _ _ = Nothing++ifTrueJust :: Bool -> name -> Maybe name+ifTrueJust True = Just+ifTrueJust False = const Nothing++sigName :: LSig GhcRn -> [IdP GhcRn]+sigName (L _ sig) = sigNameNoLoc emptyOccEnv sig++-- | Was this signature given by the user?+isUserLSig :: forall p. UnXRec p => LSig p -> Bool+isUserLSig = isUserSig . unXRec @p++isClassD :: HsDecl a -> Bool+isClassD (TyClD _ d) = isClassDecl d+isClassD _ = False++pretty :: Outputable a => DynFlags -> a -> String+pretty = showPpr++-- ---------------------------------------------------------------------++-- These functions are duplicated from the GHC API, as they must be+-- instantiated at DocNameI instead of (GhcPass _).++-- | Like 'hsTyVarName' from GHC API, but not instantiated at (GhcPass _)+hsTyVarBndrName :: forall flag n. (XXTyVarBndr n ~ DataConCantHappen, UnXRec n)+ => HsTyVarBndr flag n -> IdP n+hsTyVarBndrName (UserTyVar _ _ name) = unXRec @n name+hsTyVarBndrName (KindedTyVar _ _ name _) = unXRec @n name++hsTyVarNameI :: HsTyVarBndr flag DocNameI -> DocName+hsTyVarNameI (UserTyVar _ _ (L _ n)) = n+hsTyVarNameI (KindedTyVar _ _ (L _ n) _) = n++hsLTyVarNameI :: LHsTyVarBndr flag DocNameI -> DocName+hsLTyVarNameI = hsTyVarNameI . unLoc++getConNamesI :: ConDecl DocNameI -> NonEmpty (LocatedN DocName)+getConNamesI ConDeclH98 {con_name = name} = pure name+getConNamesI ConDeclGADT {con_names = names} = names++hsSigTypeI :: LHsSigType DocNameI -> LHsType DocNameI+hsSigTypeI = sig_body . unLoc++mkEmptySigType :: LHsType GhcRn -> LHsSigType GhcRn+-- Dubious, because the implicit binders are empty even+-- though the type might have free variables+mkEmptySigType lty@(L loc ty) = L loc $ case ty of+ HsForAllTy { hst_tele = HsForAllInvis { hsf_invis_bndrs = bndrs }+ , hst_body = body }+ -> HsSig { sig_ext = noExtField+ , sig_bndrs = HsOuterExplicit { hso_xexplicit = noExtField+ , hso_bndrs = bndrs }+ , sig_body = body }+ _ -> HsSig { sig_ext = noExtField+ , sig_bndrs = HsOuterImplicit{hso_ximplicit = []}+ , sig_body = lty }++mkHsForAllInvisTeleI ::+ [LHsTyVarBndr Specificity DocNameI] -> HsForAllTelescope DocNameI+mkHsForAllInvisTeleI invis_bndrs =+ HsForAllInvis { hsf_xinvis = noExtField, hsf_invis_bndrs = invis_bndrs }++mkHsImplicitSigTypeI :: LHsType DocNameI -> HsSigType DocNameI+mkHsImplicitSigTypeI body =+ HsSig { sig_ext = noExtField+ , sig_bndrs = HsOuterImplicit{hso_ximplicit = noExtField}+ , sig_body = body }++getGADTConType :: ConDecl DocNameI -> LHsSigType DocNameI+-- The full type of a GADT data constructor We really only get this in+-- order to pretty-print it, and currently only in Haddock's code. So+-- we are cavalier about locations and extensions, hence the+-- 'undefined's+getGADTConType (ConDeclGADT { con_bndrs = L _ outer_bndrs+ , con_mb_cxt = mcxt, con_g_args = args+ , con_res_ty = res_ty })+ = noLocA (HsSig { sig_ext = noExtField+ , sig_bndrs = outer_bndrs+ , sig_body = theta_ty })+ where+ theta_ty | Just theta <- mcxt+ = noLocA (HsQualTy { hst_xqual = noAnn, hst_ctxt = theta, hst_body = tau_ty })+ | otherwise+ = tau_ty++-- tau_ty :: LHsType DocNameI+ tau_ty = case args of+ RecConGADT flds _ -> mkFunTy (noLocA (HsRecTy noAnn (unLoc flds))) res_ty+ PrefixConGADT pos_args -> foldr mkFunTy res_ty (map hsScaledThing pos_args)++ mkFunTy :: LHsType DocNameI -> LHsType DocNameI -> LHsType DocNameI+ mkFunTy a b = noLocA (HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) a b)++getGADTConType (ConDeclH98 {}) = panic "getGADTConType"+ -- Should only be called on ConDeclGADT++getMainDeclBinderI :: HsDecl DocNameI -> [IdP DocNameI]+getMainDeclBinderI (TyClD _ d) = [tcdNameI d]+getMainDeclBinderI (ValD _ d) =+ case collectHsBindBinders CollNoDictBinders d of+ [] -> []+ (name:_) -> [name]+getMainDeclBinderI (SigD _ d) = sigNameNoLoc emptyOccEnv d+getMainDeclBinderI (ForD _ (ForeignImport _ name _ _)) = [unLoc name]+getMainDeclBinderI (ForD _ (ForeignExport _ _ _ _)) = []+getMainDeclBinderI _ = []++familyDeclLNameI :: FamilyDecl DocNameI -> LocatedN DocName+familyDeclLNameI (FamilyDecl { fdLName = n }) = n++tyClDeclLNameI :: TyClDecl DocNameI -> LocatedN DocName+tyClDeclLNameI (FamDecl { tcdFam = fd }) = familyDeclLNameI fd+tyClDeclLNameI (SynDecl { tcdLName = ln }) = ln+tyClDeclLNameI (DataDecl { tcdLName = ln }) = ln+tyClDeclLNameI (ClassDecl { tcdLName = ln }) = ln++tcdNameI :: TyClDecl DocNameI -> DocName+tcdNameI = unLoc . tyClDeclLNameI++addClassContext :: Name -> LHsQTyVars GhcRn -> LSig GhcRn -> LSig GhcRn+-- Add the class context to a class-op signature+addClassContext cls tvs0 (L pos (ClassOpSig _ _ lname ltype))+ = L pos (TypeSig noAnn lname (mkEmptyWildCardBndrs (go_sig_ty ltype)))+ where+ go_sig_ty (L loc (HsSig { sig_bndrs = bndrs, sig_body = ty }))+ = L loc (HsSig { sig_ext = noExtField+ , sig_bndrs = bndrs, sig_body = go_ty ty })++ go_ty (L loc (HsForAllTy { hst_tele = tele, hst_body = ty }))+ = L loc (HsForAllTy { hst_xforall = noExtField+ , hst_tele = tele, hst_body = go_ty ty })+ go_ty (L loc (HsQualTy { hst_ctxt = ctxt, hst_body = ty }))+ = L loc (HsQualTy { hst_xqual = noExtField+ , hst_ctxt = add_ctxt ctxt, hst_body = ty })+ go_ty (L loc ty)+ = L loc (HsQualTy { hst_xqual = noExtField+ , hst_ctxt = add_ctxt (noLocA []), hst_body = L loc ty })++ extra_pred = nlHsTyConApp NotPromoted Prefix cls (lHsQTyVarsToTypes tvs0)++ add_ctxt (L loc preds) = L loc (extra_pred : preds)++addClassContext _ _ sig = sig -- E.g. a MinimalSig is fine++lHsQTyVarsToTypes :: LHsQTyVars GhcRn -> [LHsTypeArg GhcRn]+lHsQTyVarsToTypes tvs+ = [ HsValArg $ noLocA (HsTyVar noAnn NotPromoted (noLocA (hsLTyVarName tv)))+ | tv <- hsQTvExplicit tvs ]+++--------------------------------------------------------------------------------+-- * Making abstract declarations+--------------------------------------------------------------------------------++restrictTo :: [Name] -> LHsDecl GhcRn -> LHsDecl GhcRn+restrictTo names (L loc decl) = L loc $ case decl of+ TyClD x d | isDataDecl d ->+ TyClD x (d { tcdDataDefn = restrictDataDefn names (tcdDataDefn d) })+ TyClD x d | isClassDecl d ->+ TyClD x (d { tcdSigs = restrictDecls names (tcdSigs d),+ tcdATs = restrictATs names (tcdATs d) })+ _ -> decl++restrictDataDefn :: [Name] -> HsDataDefn GhcRn -> HsDataDefn GhcRn+restrictDataDefn names d = d { dd_cons = restrictDataDefnCons names (dd_cons d) }++restrictDataDefnCons :: [Name] -> DataDefnCons (LConDecl GhcRn) -> DataDefnCons (LConDecl GhcRn)+restrictDataDefnCons names = \ case+ DataTypeCons is_type_data cons -> DataTypeCons is_type_data (restrictCons names cons)+ NewTypeCon con -> maybe (DataTypeCons False []) NewTypeCon $ restrictCons names (Just con)++restrictCons :: MonadFail m => [Name] -> m (LConDecl GhcRn) -> m (LConDecl GhcRn)+restrictCons names decls = [ L p d | L p (Just d) <- fmap keep <$> decls ]+ where+ keep :: ConDecl GhcRn -> Maybe (ConDecl GhcRn)+ keep d+ | any (`elem` names) (unLoc <$> getConNames d) =+ case d of+ ConDeclH98 { con_args = con_args' } -> case con_args' of+ PrefixCon {} -> Just d+ RecCon fields+ | all field_avail (unLoc fields) -> Just d+ | otherwise -> Just (d { con_args = PrefixCon [] (field_types $ unLoc fields) })+ -- if we have *all* the field names available, then+ -- keep the record declaration. Otherwise degrade to+ -- a constructor declaration. This isn't quite right, but+ -- it's the best we can do.+ InfixCon _ _ -> Just d++ ConDeclGADT { con_g_args = con_args' } -> case con_args' of+ PrefixConGADT {} -> Just d+ RecConGADT fields _+ | all field_avail (unLoc fields) -> Just d+ | otherwise -> Just (d { con_g_args = PrefixConGADT (field_types $ unLoc fields) })+ -- see above+ where+ field_avail :: LConDeclField GhcRn -> Bool+ field_avail (L _ (ConDeclField _ fs _ _))+ = all (\f -> foExt (unLoc f) `elem` names) fs++ field_types flds = [ hsUnrestricted t | L _ (ConDeclField _ _ t _) <- flds ]++ keep _ = Nothing++restrictDecls :: [Name] -> [LSig GhcRn] -> [LSig GhcRn]+restrictDecls names = mapMaybe (filterLSigNames (`elem` names))+++restrictATs :: [Name] -> [LFamilyDecl GhcRn] -> [LFamilyDecl GhcRn]+restrictATs names ats = [ at | at <- ats , unLoc (fdLName (unLoc at)) `elem` names ]+++-------------------------------------------------------------------------------+-- * Parenthesization+-------------------------------------------------------------------------------++-- | Precedence level (inside the 'HsType' AST).+data Precedence+ = PREC_TOP -- ^ precedence of 'type' production in GHC's parser++ | PREC_SIG -- ^ explicit type signature++ | PREC_CTX -- ^ Used for single contexts, eg. ctx => type+ -- (as opposed to (ctx1, ctx2) => type)++ | PREC_FUN -- ^ precedence of 'btype' production in GHC's parser+ -- (used for LH arg of (->))++ | PREC_OP -- ^ arg of any infix operator+ -- (we don't keep have fixity info)++ | PREC_CON -- ^ arg of type application: always parenthesize unless atomic+ deriving (Eq, Ord)++-- | Add in extra 'HsParTy' where needed to ensure that what would be printed+-- out using 'ppr' has enough parentheses to be re-parsed properly.+--+-- We cannot add parens that may be required by fixities because we do not have+-- any fixity information to work with in the first place :(.+reparenTypePrec :: forall a. (XRecCond a)+ => Precedence -> HsType a -> HsType a+reparenTypePrec = go+ where++ -- Shorter name for 'reparenType'+ go :: Precedence -> HsType a -> HsType a+ go _ (HsBangTy x b ty) = HsBangTy x b (reparenLType ty)+ go _ (HsTupleTy x con tys) = HsTupleTy x con (map reparenLType tys)+ go _ (HsSumTy x tys) = HsSumTy x (map reparenLType tys)+ go _ (HsListTy x ty) = HsListTy x (reparenLType ty)+ go _ (HsRecTy x flds) = HsRecTy x (map (mapXRec @a reparenConDeclField) flds)+ go p (HsDocTy x ty d) = HsDocTy x (goL p ty) d+ go _ (HsExplicitListTy x p tys) = HsExplicitListTy x p (map reparenLType tys)+ go _ (HsExplicitTupleTy x tys) = HsExplicitTupleTy x (map reparenLType tys)+ go p (HsKindSig x ty kind)+ = paren p PREC_SIG $ HsKindSig x (goL PREC_SIG ty) (goL PREC_SIG kind)+ go p (HsIParamTy x n ty)+ = paren p PREC_SIG $ HsIParamTy x n (reparenLType ty)+ go p (HsForAllTy x tele ty)+ = paren p PREC_CTX $ HsForAllTy x (reparenHsForAllTelescope tele) (reparenLType ty)+ go p (HsQualTy x ctxt ty)+ = let p' [_] = PREC_CTX+ p' _ = PREC_TOP -- parens will get added anyways later...+ ctxt' = mapXRec @a (\xs -> map (goL (p' xs)) xs) ctxt+ in paren p PREC_CTX $ HsQualTy x ctxt' (goL PREC_TOP ty)+ go p (HsFunTy x w ty1 ty2)+ = paren p PREC_FUN $ HsFunTy x w (goL PREC_FUN ty1) (goL PREC_TOP ty2)+ go p (HsAppTy x fun_ty arg_ty)+ = paren p PREC_CON $ HsAppTy x (goL PREC_FUN fun_ty) (goL PREC_CON arg_ty)+ go p (HsAppKindTy x fun_ty arg_ki)+ = paren p PREC_CON $ HsAppKindTy x (goL PREC_FUN fun_ty) (goL PREC_CON arg_ki)+ go p (HsOpTy x prom ty1 op ty2)+ = paren p PREC_FUN $ HsOpTy x prom (goL PREC_OP ty1) op (goL PREC_OP ty2)+ go p (HsParTy _ t) = unXRec @a $ goL p t -- pretend the paren doesn't exist - it will be added back if needed+ go _ t@HsTyVar{} = t+ go _ t@HsStarTy{} = t+ go _ t@HsSpliceTy{} = t+ go _ t@HsTyLit{} = t+ go _ t@HsWildCardTy{} = t+ go _ t@XHsType{} = t++ -- Located variant of 'go'+ goL :: Precedence -> LHsType a -> LHsType a+ goL ctxt_prec = mapXRec @a (go ctxt_prec)++ -- Optionally wrap a type in parens+ paren :: Precedence -- Precedence of context+ -> Precedence -- Precedence of top-level operator+ -> HsType a -> HsType a -- Wrap in parens if (ctxt >= op)+ paren ctxt_prec op_prec | ctxt_prec >= op_prec = HsParTy noAnn . wrapXRec @a+ | otherwise = id+++-- | Add parenthesis around the types in a 'HsType' (see 'reparenTypePrec')+reparenType :: XRecCond a => HsType a -> HsType a+reparenType = reparenTypePrec PREC_TOP++-- | Add parenthesis around the types in a 'LHsType' (see 'reparenTypePrec')+reparenLType :: forall a. (XRecCond a) => LHsType a -> LHsType a+reparenLType = mapXRec @a reparenType++-- | Add parentheses around the types in an 'HsSigType' (see 'reparenTypePrec')+reparenSigType :: forall a. ( XRecCond a )+ => HsSigType a -> HsSigType a+reparenSigType (HsSig x bndrs body) =+ HsSig x (reparenOuterTyVarBndrs bndrs) (reparenLType body)+reparenSigType v@XHsSigType{} = v++-- | Add parentheses around the types in an 'HsOuterTyVarBndrs' (see 'reparenTypePrec')+reparenOuterTyVarBndrs :: forall flag a. ( XRecCond a )+ => HsOuterTyVarBndrs flag a -> HsOuterTyVarBndrs flag a+reparenOuterTyVarBndrs imp@HsOuterImplicit{} = imp+reparenOuterTyVarBndrs (HsOuterExplicit x exp_bndrs) =+ HsOuterExplicit x (map (mapXRec @(NoGhcTc a) reparenTyVar) exp_bndrs)+reparenOuterTyVarBndrs v@XHsOuterTyVarBndrs{} = v++-- | Add parentheses around the types in an 'HsForAllTelescope' (see 'reparenTypePrec')+reparenHsForAllTelescope :: forall a. (XRecCond a )+ => HsForAllTelescope a -> HsForAllTelescope a+reparenHsForAllTelescope (HsForAllVis x bndrs) =+ HsForAllVis x (map (mapXRec @a reparenTyVar) bndrs)+reparenHsForAllTelescope (HsForAllInvis x bndrs) =+ HsForAllInvis x (map (mapXRec @a reparenTyVar) bndrs)+reparenHsForAllTelescope v@XHsForAllTelescope{} = v++-- | Add parenthesis around the types in a 'HsTyVarBndr' (see 'reparenTypePrec')+reparenTyVar :: (XRecCond a) => HsTyVarBndr flag a -> HsTyVarBndr flag a+reparenTyVar (UserTyVar x flag n) = UserTyVar x flag n+reparenTyVar (KindedTyVar x flag n kind) = KindedTyVar x flag n (reparenLType kind)+reparenTyVar v@XTyVarBndr{} = v++-- | Add parenthesis around the types in a 'ConDeclField' (see 'reparenTypePrec')+reparenConDeclField :: (XRecCond a) => ConDeclField a -> ConDeclField a+reparenConDeclField (ConDeclField x n t d) = ConDeclField x n (reparenLType t) d+reparenConDeclField c@XConDeclField{} = c+++-------------------------------------------------------------------------------+-- * Located+-------------------------------------------------------------------------------+++unL :: GenLocated l a -> a+unL (L _ x) = x++reL :: a -> GenLocated l a+reL = L undefined++mapMA :: Monad m => (a -> m b) -> LocatedAn an a -> m (Located b)+mapMA f (L al a) = L (locA al) <$> f a++-------------------------------------------------------------------------------+-- * NamedThing instances+-------------------------------------------------------------------------------+++instance NamedThing (TyClDecl GhcRn) where+ getName = tcdName++-------------------------------------------------------------------------------+-- * Subordinates+-------------------------------------------------------------------------------+++class Parent a where+ children :: a -> [Name]+++instance Parent (ConDecl GhcRn) where+ children con =+ case getRecConArgs_maybe con of+ Nothing -> []+ Just flds -> map (foExt . unLoc) $ concatMap (cd_fld_names . unLoc) (unLoc flds)++instance Parent (TyClDecl GhcRn) where+ children d+ | isDataDecl d = map unLoc $ concatMap (toList . getConNames . unLoc)+ $ (dd_cons . tcdDataDefn) d+ | isClassDecl d =+ map (unLoc . fdLName . unLoc) (tcdATs d) +++ [ unLoc n | L _ (TypeSig _ ns _) <- tcdSigs d, n <- ns ]+ | otherwise = []+++-- | A parent and its children+family :: (NamedThing a, Parent a) => a -> (Name, [Name])+family = getName &&& children+++familyConDecl :: ConDecl GHC.GhcRn -> [(Name, [Name])]+familyConDecl d = zip (toList $ unLoc <$> getConNames d) (repeat $ children d)++-- | A mapping from the parent (main-binder) to its children and from each+-- child to its grand-children, recursively.+families :: TyClDecl GhcRn -> [(Name, [Name])]+families d+ | isDataDecl d = family d : concatMap (familyConDecl . unLoc) (dd_cons (tcdDataDefn d))+ | isClassDecl d = [family d]+ | otherwise = []+++-- | A mapping from child to parent+parentMap :: TyClDecl GhcRn -> [(Name, Name)]+parentMap d = [ (c, p) | (p, cs) <- families d, c <- cs ]+++-- | The parents of a subordinate in a declaration+parents :: Name -> HsDecl GhcRn -> [Name]+parents n (TyClD _ d) = [ p | (c, p) <- parentMap d, c == n ]+parents _ _ = []+++-------------------------------------------------------------------------------+-- * Utils that work in monads defined by GHC+-------------------------------------------------------------------------------+++modifySessionDynFlags :: (DynFlags -> DynFlags) -> Ghc ()+modifySessionDynFlags f = do+ dflags <- getSessionDynFlags+ _ <- setSessionDynFlags (f dflags)+ return ()+++-------------------------------------------------------------------------------+-- * DynFlags+-------------------------------------------------------------------------------++-- TODO: use `setOutputDir` from GHC+setOutputDir :: FilePath -> DynFlags -> DynFlags+setOutputDir dir dynFlags =+ dynFlags { objectDir = Just dir+ , hiDir = Just dir+ , hieDir = Just dir+ , stubDir = Just dir+ , includePaths = addGlobalInclude (includePaths dynFlags) [dir]+ , dumpDir = Just dir+ }++-------------------------------------------------------------------------------+-- * 'StringBuffer' and 'ByteString'+-------------------------------------------------------------------------------+-- We get away with a bunch of these functions because 'StringBuffer' and+-- 'ByteString' have almost exactly the same structure.++-- | Convert a UTF-8 encoded 'ByteString' into a 'StringBuffer. This really+-- relies on the internals of both 'ByteString' and 'StringBuffer'.+--+-- /O(n)/ (but optimized into a @memcpy@ by @bytestring@ under the hood)+stringBufferFromByteString :: ByteString -> StringBuffer+stringBufferFromByteString bs =+ let BS.PS fp off len = bs <> BS.pack [0,0,0]+ in S.StringBuffer { S.buf = fp, S.len = len - 3, S.cur = off }++-- | Take the first @n@ /bytes/ of the 'StringBuffer' and put them in a+-- 'ByteString'.+--+-- /O(1)/+takeStringBuffer :: Int -> StringBuffer -> ByteString+takeStringBuffer !n (S.StringBuffer fp _ cur) = BS.PS fp cur n++-- | Return the prefix of the first 'StringBuffer' that /isn't/ in the second+-- 'StringBuffer'. **The behavior is undefined if the 'StringBuffers' use+-- separate buffers.**+--+-- /O(1)/+splitStringBuffer :: StringBuffer -> StringBuffer -> ByteString+splitStringBuffer buf1 buf2 = takeStringBuffer n buf1+ where n = S.byteDiff buf1 buf2++-- | Split the 'StringBuffer' at the next newline (or the end of the buffer).+-- Also: initial position is passed in and the updated position is returned.+--+-- /O(n)/ (but /O(1)/ space)+spanLine :: RealSrcLoc -> StringBuffer -> (ByteString, RealSrcLoc, StringBuffer)+spanLine !loc !buf = go loc buf+ where++ go !l !b+ | not (S.atEnd b)+ = case S.nextChar b of+ ('\n', b') -> (splitStringBuffer buf b', advanceSrcLoc l '\n', b')+ (c, b') -> go (advanceSrcLoc l c) b'+ | otherwise+ = (splitStringBuffer buf b, advanceSrcLoc l '\n', b)++-- | Given a start position and a buffer with that start position, split the+-- buffer at an end position.+--+-- /O(n)/ (but /O(1)/ space)+spanPosition :: RealSrcLoc -- ^ start of buffeer+ -> RealSrcLoc -- ^ position until which to take+ -> StringBuffer -- ^ buffer from which to take+ -> (ByteString, StringBuffer)+spanPosition !start !end !buf = go start buf+ where++ go !l !b+ | l < end+ , not (S.atEnd b)+ , (c, b') <- S.nextChar b+ = go (advanceSrcLoc l c) b'+ | otherwise+ = (splitStringBuffer buf b, b)++-- | Try to parse a line of CPP from the from of the buffer. A \"line\" of CPP+-- consists of+--+-- * at most 10 whitespace characters, including at least one newline+-- * a @#@ character+-- * keep parsing lines until you find a line not ending in @\\@.+--+-- This is chock full of heuristics about what a line of CPP is.+--+-- /O(n)/ (but /O(1)/ space)+tryCppLine :: RealSrcLoc -> StringBuffer -> Maybe (ByteString, RealSrcLoc, StringBuffer)+tryCppLine !loc !buf = spanSpace (S.prevChar buf '\n' == '\n') loc buf+ where++ -- Keep consuming space characters until we hit either a @#@ or something+ -- else. If we hit a @#@, start parsing CPP+ spanSpace !seenNl !l !b+ | S.atEnd b+ = Nothing+ | otherwise+ = case S.nextChar b of+ ('#' , b') | not (S.atEnd b')+ , ('-', b'') <- S.nextChar b'+ , ('}', _) <- S.nextChar b''+ -> Nothing -- Edge case exception for @#-}@+ | seenNl+ -> Just (spanCppLine (advanceSrcLoc l '#') b') -- parse CPP+ | otherwise+ -> Nothing -- We didn't see a newline, so this can't be CPP!++ (c , b') | isSpace c -> spanSpace (seenNl || c == '\n')+ (advanceSrcLoc l c) b'+ | otherwise -> Nothing++ -- Consume a CPP line to its "end" (basically the first line that ends not+ -- with a @\@ character)+ spanCppLine !l !b+ | S.atEnd b+ = (splitStringBuffer buf b, l, b)+ | otherwise+ = case S.nextChar b of+ ('\\', b') | not (S.atEnd b')+ , ('\n', b'') <- S.nextChar b'+ -> spanCppLine (advanceSrcLoc (advanceSrcLoc l '\\') '\n') b''++ ('\n', b') -> (splitStringBuffer buf b', advanceSrcLoc l '\n', b')++ (c , b') -> spanCppLine (advanceSrcLoc l c) b'++-------------------------------------------------------------------------------+-- * Names in a 'Type'+-------------------------------------------------------------------------------++-- | Given a 'Type', return a set of 'Name's coming from the 'TyCon's within+-- the type.+typeNames :: Type -> Set.Set Name+typeNames ty = go ty Set.empty+ where+ go :: Type -> Set.Set Name -> Set.Set Name+ go t acc =+ case t of+ TyVarTy {} -> acc+ AppTy t1 t2 -> go t2 $ go t1 acc+ FunTy _ _ t1 t2 -> go t2 $ go t1 acc+ TyConApp tcon args -> foldl' (\s t' -> go t' s) (Set.insert (getName tcon) acc) args+ ForAllTy bndr t' -> go t' $ go (tyVarKind (binderVar bndr)) acc+ LitTy _ -> acc+ CastTy t' _ -> go t' acc+ CoercionTy {} -> acc++-------------------------------------------------------------------------------+-- * Free variables of a 'Type'+-------------------------------------------------------------------------------++-- | Get free type variables in a 'Type' in their order of appearance.+-- See [Ordering of implicit variables].+orderedFVs+ :: VarSet -- ^ free variables to ignore+ -> [Type] -- ^ types to traverse (in order) looking for free variables+ -> [TyVar] -- ^ free type variables, in the order they appear in+orderedFVs vs tys =+ reverse . fst $ tyCoFVsOfTypes' tys (const True) vs ([], emptyVarSet)+++-- See the "Free variables of types and coercions" section in 'TyCoRep', or+-- check out Note [Free variables of types]. The functions in this section+-- don't output type variables in the order they first appear in in the 'Type'.+--+-- For example, 'tyCoVarsOfTypeList' reports an incorrect order for the type+-- of 'const :: a -> b -> a':+--+-- >>> import GHC.Types.Name+-- >>> import TyCoRep+-- >>> import GHC.Builtin.Types.Prim+-- >>> import GHC.Types.Var+-- >>> a = TyVarTy alphaTyVar+-- >>> b = TyVarTy betaTyVar+-- >>> constTy = mkFunTys [a, b] a+-- >>> map (getOccString . tyVarName) (tyCoVarsOfTypeList constTy)+-- ["b","a"]+--+-- However, we want to reuse the very optimized traversal machinery there, so+-- so we make our own `tyCoFVsOfType'`, `tyCoFVsBndr'`, and `tyCoVarsOfTypes'`.+-- All these do differently is traverse in a different order and ignore+-- coercion variables.++-- | Just like 'tyCoFVsOfType', but traverses type variables in reverse order+-- of appearance.+tyCoFVsOfType' :: Type -> FV+tyCoFVsOfType' (TyVarTy v) a b c = (FV.unitFV v `unionFV` tyCoFVsOfType' (tyVarKind v)) a b c+tyCoFVsOfType' (TyConApp _ tys) a b c = tyCoFVsOfTypes' tys a b c+tyCoFVsOfType' (LitTy {}) a b c = emptyFV a b c+tyCoFVsOfType' (AppTy fun arg) a b c = (tyCoFVsOfType' arg `unionFV` tyCoFVsOfType' fun) a b c+tyCoFVsOfType' (FunTy _ w arg res) a b c = (tyCoFVsOfType' w `unionFV`+ tyCoFVsOfType' res `unionFV`+ tyCoFVsOfType' arg) a b c+tyCoFVsOfType' (ForAllTy bndr ty) a b c = tyCoFVsBndr' bndr (tyCoFVsOfType' ty) a b c+tyCoFVsOfType' (CastTy ty _) a b c = (tyCoFVsOfType' ty) a b c+tyCoFVsOfType' (CoercionTy _ ) a b c = emptyFV a b c++-- | Just like 'tyCoFVsOfTypes', but traverses type variables in reverse order+-- of appearance.+tyCoFVsOfTypes' :: [Type] -> FV+tyCoFVsOfTypes' (ty:tys) fv_cand in_scope acc = (tyCoFVsOfTypes' tys `unionFV` tyCoFVsOfType' ty) fv_cand in_scope acc+tyCoFVsOfTypes' [] fv_cand in_scope acc = emptyFV fv_cand in_scope acc++-- | Just like 'tyCoFVsBndr', but traverses type variables in reverse order of+-- appearance.+tyCoFVsBndr' :: TyVarBinder -> FV -> FV+tyCoFVsBndr' (Bndr tv _) fvs = FV.delFV tv fvs `unionFV` tyCoFVsOfType' (tyVarKind tv)+++-------------------------------------------------------------------------------+-- * Defaulting RuntimeRep variables+-------------------------------------------------------------------------------++-- | Traverses the type, defaulting type variables of kind 'RuntimeRep' to+-- 'LiftedType'. See 'defaultRuntimeRepVars' in GHC.Iface.Type the original such+-- function working over `IfaceType`'s.+defaultRuntimeRepVars :: Type -> Type+defaultRuntimeRepVars = go emptyVarEnv+ where+ go :: TyVarEnv () -> Type -> Type+ go subs (ForAllTy (Bndr var flg) ty)+ | isRuntimeRepVar var+ , isInvisibleForAllTyFlag flg+ = let subs' = extendVarEnv subs var ()+ in go subs' ty+ | otherwise+ = ForAllTy (Bndr (updateTyVarKind (go subs) var) flg)+ (go subs ty)++ go subs (TyVarTy tv)+ | tv `elemVarEnv` subs+ = liftedRepTy+ | otherwise+ = TyVarTy (updateTyVarKind (go subs) tv)++ go subs (TyConApp tc tc_args)+ = TyConApp tc (map (go subs) tc_args)++ go subs (FunTy af w arg res)+ = FunTy af (go subs w) (go subs arg) (go subs res)++ go subs (AppTy t u)+ = AppTy (go subs t) (go subs u)++ go subs (CastTy x co)+ = CastTy (go subs x) co++ go _ ty@(LitTy {}) = ty+ go _ ty@(CoercionTy {}) = ty++fromMaybeContext :: Maybe (LHsContext DocNameI) -> HsContext DocNameI+fromMaybeContext mctxt = unLoc $ fromMaybe (noLocA []) mctxt
@@ -0,0 +1,434 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE TupleSections #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2010,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- This module typechecks Haskell modules using the GHC API and processes+-- the result to create 'Interface's. The typechecking and the 'Interface'+-- creation is interleaved, so that when a module is processed, the+-- 'Interface's of all previously processed modules are available. The+-- creation of an 'Interface' from a typechecked module is delegated to+-- "Haddock.Interface.Create".+--+-- When all modules have been typechecked and processed, information about+-- instances are attached to each 'Interface'. This task is delegated to+-- "Haddock.Interface.AttachInstances". Note that this is done as a separate+-- step because GHC can't know about all instances until all modules have been+-- typechecked.+--+-- As a last step a link environment is built which maps names to the \"best\"+-- places to link to in the documentation, and all 'Interface's are \"renamed\"+-- using this environment.+-----------------------------------------------------------------------------+module Haddock.Interface (+ plugin+ , processModules+) where+++import Haddock.GhcUtils (moduleString, pretty)+import Haddock.Interface.AttachInstances (attachInstances)+import Haddock.Interface.Create (createInterface1)+import Haddock.Interface.Rename (renameInterface)+import Haddock.InterfaceFile (InterfaceFile, ifInstalledIfaces, ifLinkEnv)+import Haddock.Options hiding (verbosity)+import Haddock.Types+import Haddock.Utils (Verbosity (..), normal, out, verbose)++import Control.Monad (unless, when)+import Data.IORef (atomicModifyIORef', newIORef, readIORef, IORef)+import Data.List (foldl', isPrefixOf)+import Data.Maybe (mapMaybe)+import Data.Traversable (for)+import Text.Printf (printf)+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set++import GHC hiding (verbosity)+import GHC.Data.Graph.Directed+import GHC.Driver.Env+import GHC.Driver.Monad (modifySession, withTimingM)+import GHC.Driver.Session hiding (verbosity)+import GHC.HsToCore.Docs (getMainDeclBinder)+import GHC.Plugins+import GHC.Tc.Types (TcGblEnv (..), TcM)+import GHC.Tc.Utils.Env (tcLookupGlobal)+import GHC.Tc.Utils.Monad (getTopEnv)+import GHC.Unit.Module.Graph+import GHC.Utils.Error (withTiming)++#if defined(mingw32_HOST_OS)+import System.IO+import GHC.IO.Encoding.CodePage (mkLocaleEncoding)+import GHC.IO.Encoding.Failure (CodingFailureMode(TransliterateCodingFailure))+#endif++-- | Create 'Interface's and a link environment by typechecking the list of+-- modules using the GHC API and processing the resulting syntax trees.+processModules+ :: Verbosity -- ^ Verbosity of logging to 'stdout'+ -> [String] -- ^ A list of file or module names sorted by+ -- module topology+ -> [Flag] -- ^ Command-line flags+ -> [InterfaceFile] -- ^ Interface files of package dependencies+ -> Ghc ([Interface], LinkEnv) -- ^ Resulting list of interfaces and renaming+ -- environment+processModules verbosity modules flags extIfaces = do+#if defined(mingw32_HOST_OS)+ -- Avoid internal error: <stderr>: hPutChar: invalid argument (invalid character)' non UTF-8 Windows+ liftIO $ hSetEncoding stdout $ mkLocaleEncoding TransliterateCodingFailure+ liftIO $ hSetEncoding stderr $ mkLocaleEncoding TransliterateCodingFailure+#endif++ dflags <- getDynFlags++ out verbosity verbose "Creating interfaces..."+++ -- Map from a module to a corresponding installed interface+ let instIfaceMap :: InstIfaceMap+ instIfaceMap = Map.fromList+ [ (instMod iface, iface)+ | ext <- extIfaces+ , iface <- ifInstalledIfaces ext+ ]++ (interfaces, ms) <- createIfaces verbosity modules flags instIfaceMap++ let exportedNames =+ Set.unions $ map (Set.fromList . ifaceExports) $+ filter (\i -> not $ OptHide `elem` ifaceOptions i) interfaces+ mods = Set.fromList $ map ifaceMod interfaces++ out verbosity verbose "Attaching instances..."+ interfaces' <- {-# SCC attachInstances #-}+ withTimingM "attachInstances" (const ()) $ do+ attachInstances (exportedNames, mods) interfaces instIfaceMap ms++ out verbosity verbose "Building cross-linking environment..."+ -- Combine the link envs of the external packages into one+ let extLinks = Map.unions (map ifLinkEnv extIfaces)+ homeLinks = buildHomeLinks interfaces' -- Build the environment for the home+ -- package+ links = homeLinks `Map.union` extLinks++ out verbosity verbose "Renaming interfaces..."++ let warnings = Flag_NoWarnings `notElem` flags+ ignoredSymbolSet = ignoredSymbols flags++ interfaces'' <-+ withTimingM "renameAllInterfaces" (const ()) $+ for interfaces' $ \i -> do+ withTimingM ("renameInterface: " <+> pprModuleName (moduleName (ifaceMod i))) (const ()) $+ renameInterface dflags ignoredSymbolSet links warnings (Flag_Hoogle `elem` flags) i++ return (interfaces'', homeLinks)++--------------------------------------------------------------------------------+-- * Module typechecking and Interface creation+--------------------------------------------------------------------------------++createIfaces+ :: Verbosity+ -- ^ Verbosity requested by the caller+ -> [String]+ -- ^ List of modules provided as arguments to Haddock (still in FilePath+ -- format)+ -> [Flag]+ -- ^ Command line flags which Hadddock was invoked with+ -> InstIfaceMap+ -- ^ Map from module to corresponding installed interface file+ -> Ghc ([Interface], ModuleSet)+ -- ^ Resulting interfaces+createIfaces verbosity modules flags instIfaceMap = do+ -- Initialize the IORefs for the interface map and the module set+ (ifaceMapRef, moduleSetRef) <- liftIO $ do+ m <- newIORef Map.empty+ s <- newIORef emptyModuleSet+ return (m, s)++ let+ haddockPlugin = plugin verbosity flags instIfaceMap ifaceMapRef moduleSetRef++ installHaddockPlugin :: HscEnv -> HscEnv+ installHaddockPlugin hsc_env =+ let+ old_plugins = hsc_plugins hsc_env+ new_plugins = old_plugins { staticPlugins = haddockPlugin : staticPlugins old_plugins }+ hsc_env' = hsc_env { hsc_plugins = new_plugins }+ in hscUpdateFlags (flip gopt_set Opt_PluginTrustworthy) hsc_env'++ -- Note that we would rather use withTempSession but as long as we+ -- have the separate attachInstances step we need to keep the session+ -- alive to be able to find all the instances.+ modifySession installHaddockPlugin++ targets <- mapM (\filePath -> guessTarget filePath Nothing Nothing) modules+ setTargets targets++ loadOk <- withTimingM "load" (const ()) $+ {-# SCC load #-} GHC.load LoadAllTargets++ case loadOk of+ Failed ->+ throwE "Cannot typecheck modules"+ Succeeded -> do+ modGraph <- GHC.getModuleGraph++ (ifaceMap, moduleSet) <- liftIO $ do+ m <- atomicModifyIORef' ifaceMapRef (Map.empty,)+ s <- atomicModifyIORef' moduleSetRef (Set.empty,)+ return (m, s)++ let+ -- We topologically sort the module graph including boot files,+ -- so it should be acylic (hopefully we failed much earlier if this is not the case)+ -- We then filter out boot modules from the resultant topological sort+ --+ -- We do it this way to make 'buildHomeLinks' a bit more stable+ -- 'buildHomeLinks' depends on the topological order of its input in order+ -- to construct its result. In particular, modules closer to the bottom of+ -- the dependency chain are to be prefered for link destinations.+ --+ -- If there are cycles in the graph, then this order is indeterminate+ -- (the nodes in the cycle can be ordered in any way).+ -- While 'topSortModuleGraph' does guarantee stability for equivalent+ -- module graphs, seemingly small changes in the ModuleGraph can have+ -- big impacts on the `LinkEnv` constructed.+ --+ -- For example, suppose+ -- G1 = A.hs -> B.hs -> C.hs (where '->' denotes an import).+ --+ -- Then suppose C.hs is changed to have a cyclic dependency on A+ --+ -- G2 = A.hs -> B.hs -> C.hs -> A.hs-boot+ --+ -- For G1, `C.hs` is preferred for link destinations. However, for G2,+ -- the topologically sorted order not taking into account boot files (so+ -- C -> A) is completely indeterminate.+ -- Using boot files to resolve cycles, we end up with the original order+ -- [C, B, A] (in decreasing order of preference for links)+ --+ -- This exact case came up in testing for the 'base' package, where there+ -- is a big module cycle involving 'Prelude' on windows, but the cycle doesn't+ -- include 'Prelude' on non-windows platforms. This lead to drastically different+ -- LinkEnv's (and failing haddockHtmlTests) across the platforms+ --+ -- In effect, for haddock users this behaviour (using boot files to eliminate cycles)+ -- means that {-# SOURCE #-} imports no longer count towards re-ordering+ -- the preference of modules for linking.+ --+ -- i.e. if module A imports B, then B is preferred over A,+ -- but if module A {-# SOURCE #-} imports B, then we can't say the same.+ --+ go :: SCC ModuleGraphNode -> Maybe Module+ go (AcyclicSCC (ModuleNode _ ms))+ | NotBoot <- isBootSummary ms = Just $ ms_mod ms+ | otherwise = Nothing+ go (AcyclicSCC _) = Nothing+ go (CyclicSCC _) = error "haddock: module graph cyclic even with boot files"++ ifaces :: [Interface]+ ifaces =+ [ Map.findWithDefault+ (error "haddock:iface")+ m+ ifaceMap+ | m <- mapMaybe go $ topSortModuleGraph False modGraph Nothing+ ]++ return (ifaces, moduleSet)+++-- | A `Plugin` that hooks into GHC's compilation pipeline to generate Haddock+-- interfaces. Due to the plugin nature we benefit from GHC's capabilities to+-- parallelize the compilation process.+plugin+ :: Verbosity+ -- ^ Verbosity requested by the Haddock caller+ -> [Flag]+ -- ^ Command line flags which Hadddock was invoked with+ -> InstIfaceMap+ -- ^ Map from module to corresponding installed interface file+ -> IORef IfaceMap+ -- ^ The 'IORef' to write the interface map to+ -> IORef ModuleSet+ -- ^ The 'IORef' to write the module set to+ -> StaticPlugin -- the plugin to install with GHC+plugin verbosity flags instIfaceMap ifaceMapRef moduleSetRef =+ let+ processTypeCheckedResult :: ModSummary -> TcGblEnv -> TcM ()+ processTypeCheckedResult mod_summary tc_gbl_env+ -- Don't do anything for hs-boot modules+ | IsBoot <- isBootSummary mod_summary =+ pure ()+ | otherwise = do+ hsc_env <- getTopEnv+ ifaces <- liftIO $ readIORef ifaceMapRef++ (iface, modules) <-+ withTiming (hsc_logger hsc_env) "processModule1" (const ()) $+ processModule1 verbosity flags ifaces instIfaceMap hsc_env mod_summary tc_gbl_env++ liftIO $ do+ atomicModifyIORef' ifaceMapRef $ \xs ->+ (Map.insert (ms_mod mod_summary) iface xs, ())++ atomicModifyIORef' moduleSetRef $ \xs ->+ (modules `unionModuleSet` xs, ())+ in+ StaticPlugin+ {+ spPlugin = PluginWithArgs+ {+ paPlugin = defaultPlugin+ {+ renamedResultAction = keepRenamedSource+ , typeCheckResultAction = \_ mod_summary tc_gbl_env -> do+ processTypeCheckedResult mod_summary tc_gbl_env+ pure tc_gbl_env+ }+ , paArguments = []+ }+ }++processModule1+ :: Verbosity+ -- ^ Verbosity requested by the Haddock caller+ -> [Flag]+ -- ^ Command line flags which Hadddock was invoked with+ -> IfaceMap+ -- ^ Map from module to corresponding interface, for the modules we have+ -- already processed+ -> InstIfaceMap+ -- ^ Map from module to corresponding installed interface file+ -> HscEnv+ -> ModSummary+ -> TcGblEnv+ -> TcM (Interface, ModuleSet)+processModule1 verbosity flags ifaces inst_ifaces hsc_env mod_summary tc_gbl_env = do+ out verbosity verbose "Creating interface..."++ let+ TcGblEnv { tcg_rdr_env } = tc_gbl_env++ unit_state = hsc_units hsc_env++ !interface <- do+ logger <- getLogger+ {-# SCC createInterface #-}+ withTiming logger "createInterface" (const ()) $+ runIfM (fmap Just . tcLookupGlobal) $+ createInterface1 flags unit_state mod_summary tc_gbl_env ifaces inst_ifaces++ -- We need to keep track of which modules were somehow in scope so that when+ -- Haddock later looks for instances, it also looks in these modules too.+ --+ -- See https://github.com/haskell/haddock/issues/469.+ let+ mods :: ModuleSet+ !mods = mkModuleSet+ [ nameModule name+ | gre <- globalRdrEnvElts tcg_rdr_env+ , let name = greMangledName gre+ , nameIsFromExternalPackage (hsc_home_unit hsc_env) name+ , isTcOcc (nameOccName name) -- Types and classes only+ , unQualOK gre -- In scope unqualified+ ]++ dflags <- getDynFlags++ let+ (haddockable, haddocked) =+ ifaceHaddockCoverage interface++ percentage :: Int+ percentage = div (haddocked * 100) haddockable++ modString :: String+ modString = moduleString (ifaceMod interface)++ coverageMsg :: String+ coverageMsg =+ printf " %3d%% (%3d /%3d) in '%s'" percentage haddocked haddockable modString++ header :: Bool+ header = case ifaceDoc interface of+ Documentation Nothing _ -> False+ _ -> True++ undocumentedExports :: [String]+ undocumentedExports =+ [ formatName (locA s) n+ | ExportDecl ExportD+ { expDDecl = L s n+ , expDMbDoc = (Documentation Nothing _, _)+ } <- ifaceExportItems interface+ ]+ where+ formatName :: SrcSpan -> HsDecl GhcRn -> String+ formatName loc n = p (getMainDeclBinder emptyOccEnv n) ++ case loc of+ RealSrcSpan rss _ -> " (" ++ unpackFS (srcSpanFile rss) ++ ":" +++ show (srcSpanStartLine rss) ++ ")"+ _ -> ""++ p :: Outputable a => [a] -> String+ p [] = ""+ p (x:_) = let n = pretty dflags x+ ms = modString ++ "."+ in if ms `isPrefixOf` n+ then drop (length ms) n+ else n++ when (OptHide `notElem` ifaceOptions interface) $ do+ out verbosity normal coverageMsg+ when (Flag_NoPrintMissingDocs `notElem` flags+ && not (null undocumentedExports && header)) $ do+ out verbosity normal " Missing documentation for:"+ unless header $ out verbosity normal " Module header"+ mapM_ (out verbosity normal . (" " ++)) undocumentedExports++ pure (interface, mods)+++--------------------------------------------------------------------------------+-- * Building of cross-linking environment+--------------------------------------------------------------------------------+++-- | Build a mapping which for each original name, points to the "best"+-- place to link to in the documentation. For the definition of+-- "best", we use "the module nearest the bottom of the dependency+-- graph which exports this name", not including hidden modules. When+-- there are multiple choices, we pick a random one.+--+-- The interfaces are passed in in topologically sorted order, but we start+-- by reversing the list so we can do a foldl.+buildHomeLinks :: [Interface] -> LinkEnv+buildHomeLinks ifaces = foldl' upd Map.empty (reverse ifaces)+ where+ upd old_env iface+ | OptHide `elem` ifaceOptions iface =+ old_env+ | OptNotHome `elem` ifaceOptions iface =+ foldl' keep_old old_env exported_names+ | otherwise =+ foldl' keep_new old_env exported_names+ where+ exported_names = ifaceVisibleExports iface ++ map haddockClsInstName (ifaceInstances iface)+ mdl = ifaceMod iface+ keep_old env n = Map.insertWith (\_ old -> old) n mdl env+ keep_new env n = Map.insert n mdl env
@@ -0,0 +1,280 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE BangPatterns #-}+{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface.AttachInstances+-- Copyright : (c) Simon Marlow 2006,+-- David Waern 2006-2009,+-- Isaac Dupree 2009+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Interface.AttachInstances (attachInstances, instHead) where+++import Haddock.Convert+import Haddock.GhcUtils (typeNames)+import Haddock.Types++import Control.Applicative ((<|>))+import Control.Arrow hiding ((<+>))+import Control.DeepSeq (force)+import Data.Foldable (foldl')+import Data.List (sortBy)+import Data.Ord (comparing)+import Data.Maybe ( maybeToList, mapMaybe, fromMaybe )+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set++import GHC.Data.FastString (unpackFS)+import GHC.Core.Class+import GHC.Core.FamInstEnv+import GHC+import GHC.Core.InstEnv+import GHC.Unit.Module.Env ( ModuleSet, moduleSetElts )+import GHC.Types.Name+import GHC.Types.Name.Env+import GHC.Utils.Outputable (text, sep, (<+>))+import GHC.Types.SrcLoc+import GHC.Core.TyCon+import GHC.Core.TyCo.Rep+import GHC.Builtin.Types( unrestrictedFunTyConName )+import GHC.Types.Var hiding (varName)+import GHC.HsToCore.Docs++type ExportedNames = Set.Set Name+type Modules = Set.Set Module+type ExportInfo = (ExportedNames, Modules)++-- Also attaches fixities+attachInstances :: ExportInfo -> [Interface] -> InstIfaceMap -> ModuleSet -> Ghc [Interface]+attachInstances expInfo ifaces instIfaceMap mods = do+ (_msgs, mb_index) <- getNameToInstancesIndex (map ifaceMod ifaces) mods'+ mapM (attach $ fromMaybe emptyNameEnv mb_index) ifaces+ where+ mods' = Just (moduleSetElts mods)++ -- TODO: take an IfaceMap as input+ ifaceMap = Map.fromList [ (ifaceMod i, i) | i <- ifaces ]++ attach index iface = do++ let getInstDoc = findInstDoc iface ifaceMap instIfaceMap+ getFixity = findFixity iface ifaceMap instIfaceMap++ newItems <- mapM (attachToExportItem index expInfo getInstDoc getFixity)+ (ifaceExportItems iface)+ let orphanInstances = attachOrphanInstances expInfo getInstDoc (ifaceInstances iface)+ return $ iface { ifaceExportItems = newItems+ , ifaceOrphanInstances = orphanInstances+ }++attachOrphanInstances+ :: ExportInfo+ -> (Name -> Maybe (MDoc Name)) -- ^ how to lookup the doc of an instance+ -> [HaddockClsInst] -- ^ a list of instances+ -> [DocInstance GhcRn]+attachOrphanInstances expInfo getInstDoc cls_instances =+ [ (synified, getInstDoc instName, (L (getSrcSpan instName) instName), Nothing)+ | let is =+ [ ( haddockClsInstHead i+ , haddockClsInstSynified i+ , haddockClsInstName i+ , haddockClsInstClsName i+ , haddockClsInstTyNames i+ )+ | i <- cls_instances, haddockClsInstIsOrphan i+ ]+ , (_, synified, instName, cls, tyNames) <- sortBy (comparing $ (\(ih,_,_,_,_) -> ih)) is+ , not $ isInstanceHidden expInfo cls tyNames+ ]+++attachToExportItem+ :: NameEnv ([ClsInst], [FamInst]) -- ^ all instances (that we know of)+ -> ExportInfo+ -> (Name -> Maybe (MDoc Name)) -- ^ how to lookup the doc of an instance+ -> (Name -> Maybe Fixity) -- ^ how to lookup a fixity+ -> ExportItem GhcRn+ -> Ghc (ExportItem GhcRn)+attachToExportItem index expInfo getInstDoc getFixity export =+ case attachFixities export of+ ExportDecl e@(ExportD { expDDecl = L eSpan (TyClD _ d) }) -> do+ insts <-+ let mb_instances = lookupNameEnv index (tcdName d)+ cls_instances = maybeToList mb_instances >>= fst+ fam_instances = maybeToList mb_instances >>= snd+ fam_insts = [ ( synFamInst+ , getInstDoc n+ , spanNameE n synFamInst (L (locA eSpan) (tcdName d))+ , mb_mdl+ )+ | i <- sortBy (comparing instFam) fam_instances+ , let n = getName i+ , not $ isNameHidden expInfo (fi_fam i)+ , not $ any (isTypeHidden expInfo) (fi_tys i)+ , let opaque = isTypeHidden expInfo (fi_rhs i)+ , let synFamInst = synifyFamInst i opaque+ , let !mb_mdl = force $ nameModule_maybe n+ ]+ cls_insts = [ ( synClsInst+ , getInstDoc n+ , spanName n synClsInst (L (locA eSpan) (tcdName d))+ , mb_mdl+ )+ | let is = [ (instanceSig i, getName i) | i <- cls_instances ]+ , (i@(_,_,cls,tys), n) <- sortBy (comparing $ first instHead) is+ , not $ isInstanceHidden+ expInfo+ (getName cls)+ (foldl' (\acc t -> acc `Set.union` typeNames t) Set.empty tys)+ , let synClsInst = synifyInstHead i+ , let !mb_mdl = force $ nameModule_maybe n+ ]+ -- fam_insts but with failing type fams filtered out+ cleanFamInsts = [ (fi, n, L l r, m) | (Right fi, n, L l (Right r), m) <- fam_insts ]+ famInstErrs = [ errm | (Left errm, _, _, _) <- fam_insts ]+ in do+ let mkBug = (text "haddock-bug:" <+>) . text+ putMsgM (sep $ map mkBug famInstErrs)+ return $ cls_insts ++ cleanFamInsts+ return $ ExportDecl e { expDInstances = insts }+ e -> return e+ where+ attachFixities+ ( ExportDecl+ ( e@ExportD+ { expDDecl = L _ d+ , expDPats = patsyns+ , expDSubDocs = subDocs+ }+ )+ )+ = ExportDecl e+ { expDFixities = fixities+ }+ where+ fixities :: [(Name, Fixity)]+ !fixities = force . Map.toList $ foldl' f Map.empty all_names++ f :: Map.Map Name Fixity -> Name -> Map.Map Name Fixity+ f !fs n = Map.alter (<|> getFixity n) n fs++ patsyn_names :: [Name]+ patsyn_names = concatMap (getMainDeclBinder emptyOccEnv . fst) patsyns++ all_names :: [Name]+ all_names =+ getMainDeclBinder emptyOccEnv d+ ++ map fst subDocs+ ++ patsyn_names++ attachFixities e = e++ -- spanName: attach the location to the name that is the same file as the instance location+ spanName s (InstHead { ihdClsName = clsn }) (L instL instn) =+ let s1 = getSrcSpan s+ sn = if srcSpanFileName_maybe s1 == srcSpanFileName_maybe instL+ then instn+ else clsn+ in L (getSrcSpan s) sn+ -- spanName on Either+ spanNameE s (Left e) _ = L (getSrcSpan s) (Left e)+ spanNameE s (Right ok) linst =+ let L l r = spanName s ok linst+ in L l (Right r)++-- | Lookup the doc associated with a certain instance+findInstDoc :: Interface -> IfaceMap -> InstIfaceMap -> Name -> Maybe (MDoc Name)+findInstDoc iface ifaceMap instIfaceMap = \name ->+ (Map.lookup name . ifaceDocMap $ iface) <|>+ (Map.lookup name . ifaceDocMap =<< Map.lookup (nameModule name) ifaceMap) <|>+ (Map.lookup name . instDocMap =<< Map.lookup (nameModule name) instIfaceMap)++-- | Lookup the fixity associated with a certain name+findFixity :: Interface -> IfaceMap -> InstIfaceMap -> Name -> Maybe Fixity+findFixity iface ifaceMap instIfaceMap = \name ->+ (Map.lookup name . ifaceFixMap $ iface) <|>+ (Map.lookup name . ifaceFixMap =<< Map.lookup (nameModule name) ifaceMap) <|>+ (Map.lookup name . instFixMap =<< Map.lookup (nameModule name) instIfaceMap)+++--------------------------------------------------------------------------------+-- Collecting and sorting instances+--------------------------------------------------------------------------------++instHead :: ([TyVar], [PredType], Class, [Type]) -> ([Int], SName, [SimpleType])+instHead (_, _, cls, args)+ = (map argCount args, SName (className cls), map simplify args)++argCount :: Type -> Int+argCount (AppTy t _) = argCount t + 1+argCount (TyConApp _ ts) = length ts+argCount (FunTy _ _ _ _) = 2+argCount (ForAllTy _ t) = argCount t+argCount (CastTy t _) = argCount t+argCount _ = 0++simplify :: Type -> SimpleType+simplify (FunTy _ _ t1 t2) = SimpleType (SName unrestrictedFunTyConName) [simplify t1, simplify t2]+simplify (ForAllTy _ t) = simplify t+simplify (AppTy t1 t2) = SimpleType s (ts ++ maybeToList (simplify_maybe t2))+ where (SimpleType s ts) = simplify t1+simplify (TyVarTy v) = SimpleType (SName (tyVarName v)) []+simplify (TyConApp tc ts) = SimpleType (SName (tyConName tc))+ (mapMaybe simplify_maybe ts)+simplify (LitTy (NumTyLit n)) = SimpleIntTyLit n+simplify (LitTy (StrTyLit s)) = SimpleStringTyLit (unpackFS s)+simplify (LitTy (CharTyLit c)) = SimpleCharTyLit c+simplify (CastTy ty _) = simplify ty+simplify (CoercionTy _) = error "simplify:Coercion"++simplify_maybe :: Type -> Maybe SimpleType+simplify_maybe (CoercionTy {}) = Nothing+simplify_maybe ty = Just (simplify ty)++-- Used for sorting+instFam :: FamInst -> ([Int], SName, [SimpleType], Int, SimpleType)+instFam FamInst { fi_fam = n, fi_tys = ts, fi_rhs = t }+ = (map argCount ts, SName n, map simplify ts, argCount t, simplify t)+++--------------------------------------------------------------------------------+-- Filtering hidden instances+--------------------------------------------------------------------------------++-- | A class or data type is hidden iff+--+-- * it is defined in one of the modules that are being processed+--+-- * and it is not exported by any non-hidden module+isNameHidden :: ExportInfo -> Name -> Bool+isNameHidden (names, modules) name =+ nameModule name `Set.member` modules &&+ not (name `Set.member` names)++-- | We say that an instance is «hidden» iff its class or any (part)+-- of its type(s) is hidden.+isInstanceHidden :: ExportInfo -> Name -> Set.Set Name -> Bool+isInstanceHidden expInfo cls tyNames =+ instClassHidden || instTypeHidden+ where+ instClassHidden :: Bool+ instClassHidden = isNameHidden expInfo cls++ instTypeHidden :: Bool+ instTypeHidden = any (isNameHidden expInfo) tyNames++isTypeHidden :: ExportInfo -> Type -> Bool+isTypeHidden expInfo = typeHidden+ where+ typeHidden :: Type -> Bool+ typeHidden t = any nameHidden $ typeNames t++ nameHidden :: Name -> Bool+ nameHidden = isNameHidden expInfo
@@ -0,0 +1,1276 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -Wwarn #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface.Create+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- This module provides a single function 'createInterface',+-- which creates a Haddock 'Interface' from the typechecking+-- results 'TypecheckedModule' from GHC.+-----------------------------------------------------------------------------+module Haddock.Interface.Create (IfM, runIfM, createInterface1) where++import Documentation.Haddock.Doc (metaDocAppend)+import Haddock.Backends.Hoogle (outWith)+import Haddock.Convert (PrintRuntimeReps (..), tyThingToLHsDecl, synifyInstHead)+import Haddock.GhcUtils (addClassContext, filterSigNames, lHsQTyVarsToTypes, mkEmptySigType, moduleString, parents,+ pretty, restrictTo, sigName, unL, typeNames)+import Haddock.Interface.AttachInstances (instHead)+import Haddock.Interface.LexParseRn+import Haddock.Options (Flag (..), modulePackageInfo)+import Haddock.Types+import Haddock.Utils (replace)++import Control.Applicative ((<|>))+import Control.DeepSeq+import Control.Monad.State.Strict+import Data.Bitraversable (bitraverse)+import Data.Foldable (toList)+import Data.List (find, foldl')+import qualified Data.IntMap as IM+import Data.IntMap (IntMap)+import Data.Map.Strict (Map)+import qualified Data.Map.Strict as M+import Data.Maybe (catMaybes, fromJust, isJust, mapMaybe, maybeToList)+import qualified Data.Set as Set+import Data.Traversable (for)++import GHC hiding (lookupName)+import GHC.Core (isOrphan)+import GHC.Core.Class (ClassMinimalDef, classMinimalDef)+import GHC.Core.ConLike (ConLike (..))+import GHC.Core.InstEnv+import GHC.Data.FastString (unpackFS)+import GHC.Driver.Ppr (showSDoc, showSDocForUser)+import GHC.HsToCore.Docs hiding (mkMaps, unionArgMaps)+import GHC.IORef (readIORef)+import GHC.Stack (HasCallStack)+import GHC.Tc.Types hiding (IfM)+import GHC.Tc.Utils.Monad (finalSafeMode)+import GHC.Types.Avail hiding (avail)+import qualified GHC.Types.Avail as Avail+import GHC.Types.Name (getOccString, getSrcSpan, isDataConName, isValName, nameIsLocalOrFrom, nameOccName, emptyOccEnv)+import GHC.Types.Name.Env (lookupNameEnv)+import GHC.Types.Name.Reader (GlobalRdrEnv, greMangledName, lookupGlobalRdrEnv)+import GHC.Types.Name.Set (elemNameSet, mkNameSet)+import GHC.Types.SourceFile (HscSource (..))+import GHC.Types.SourceText (SourceText (..), sl_fs)+import GHC.Unit.Types+import qualified GHC.Types.SrcLoc as SrcLoc+import qualified GHC.Unit.Module as Module+import GHC.Unit.Module.ModSummary (msHsFilePath)+import GHC.Unit.State (PackageName (..), UnitState, lookupModuleInAllUnits)+import qualified GHC.Utils.Outputable as O+import GHC.Utils.Panic (pprPanic)+import GHC.Unit.Module.Warnings+import GHC.Types.Unique.Map++createInterface1+ :: MonadIO m+ => [Flag]+ -> UnitState+ -> ModSummary+ -> TcGblEnv+ -> IfaceMap+ -> InstIfaceMap+ -> IfM m Interface+createInterface1 flags unit_state mod_sum tc_gbl_env ifaces inst_ifaces = do++ let+ ModSummary+ {+ -- Cached flags from OPTIONS, INCLUDE and LANGUAGE+ -- pragmas in the modules source code. Used to infer+ -- safety of module.+ ms_hspp_opts+ , ms_location = ModLocation+ {+ ml_hie_file+ }+ } = mod_sum++ !ml_hie_file' = force ml_hie_file++ TcGblEnv+ {+ tcg_mod+ , tcg_src+ , tcg_semantic_mod+ , tcg_rdr_env+ , tcg_exports+ , tcg_insts+ , tcg_fam_insts+ , tcg_warns++ -- Renamed source+ , tcg_rn_imports+ , tcg_rn_exports+ , tcg_rn_decls++ , tcg_th_docs+ , tcg_doc_hdr+ } = tc_gbl_env++ dflags = ms_hspp_opts++ is_sig = tcg_src == HsigFile++ (pkg_name_fs, _) =+ modulePackageInfo unit_state flags (Just tcg_mod)++ pkg_name :: Maybe Package+ pkg_name =+ let+ unpack (PackageName name) = unpackFS name+ in+ fmap unpack pkg_name_fs++ fixities :: FixMap+ fixities = case tcg_rn_decls of+ Nothing -> mempty+ Just dx -> mkFixMap dx++ -- Locations of all the TH splices+ loc_splices :: [SrcSpan]+ loc_splices = case tcg_rn_decls of+ Nothing -> []+ Just HsGroup { hs_splcds } -> [ locA loc | L loc _ <- hs_splcds ]++ decls <- case tcg_rn_decls of+ Nothing -> do+ warn "Warning: Renamed source is not available"+ pure []+ Just dx -> pure (topDecls dx)++ -- Derive final options to use for haddocking this module+ doc_opts <- mkDocOpts (haddockOptions ms_hspp_opts) flags tcg_mod++ let+ -- All elements of an explicit export list, if present+ export_list :: Maybe [(IE GhcRn, Avails)]+ export_list+ | OptIgnoreExports `elem` doc_opts =+ Nothing+ | Just rn_exports <- tcg_rn_exports =+ Just [ (ie, avail) | (L _ ie, avail) <- rn_exports ]+ | otherwise =+ Nothing++ -- All the exported Names of this module.+ exported_names :: [Name]+ !exported_names = force $+ concatMap availNamesWithSelectors tcg_exports++ -- Module imports of the form `import X`. Note that there is+ -- a) no qualification and+ -- b) no import list+ imported_modules :: Map ModuleName [ModuleName]+ imported_modules+ | Just{} <- export_list =+ unrestrictedModuleImports (map unLoc tcg_rn_imports)+ | otherwise =+ M.empty++ -- TyThings that have instances defined in this module+ local_instances :: [Name]+ local_instances =+ [ name+ | name <- map getName tcg_insts ++ map getName tcg_fam_insts+ , nameIsLocalOrFrom tcg_semantic_mod name+ ]++ -- Infer module safety+ safety <- liftIO (finalSafeMode ms_hspp_opts tc_gbl_env)++ -- The docs added via Template Haskell's putDoc+ thDocs@ExtractedTHDocs { ethd_mod_header = thMbDocStr } <-+ liftIO $ extractTHDocs <$> readIORef tcg_th_docs++ -- Process the top-level module header documentation.+ (!info, !header_doc) <- force <$> processModuleHeader dflags pkg_name+ tcg_rdr_env safety (fmap hsDocString thMbDocStr <|> (hsDocString . unLoc <$> tcg_doc_hdr))++ -- Warnings on declarations in this module+ decl_warnings <- mkWarningMap dflags tcg_warns tcg_rdr_env exported_names++ -- Warning on the module header+ mod_warning <- moduleWarning dflags tcg_rdr_env tcg_warns++ let+ -- Warnings in this module and transitive warnings from dependent modules+ warnings :: Map Name (Doc Name)+ warnings = M.unions (decl_warnings : map ifaceWarningMap (M.elems ifaces))++ maps@(!docs, !arg_docs, !decl_map, _) <-+ mkMaps dflags pkg_name tcg_rdr_env local_instances decls thDocs++ export_items <- mkExportItems is_sig ifaces pkg_name tcg_mod tcg_semantic_mod+ warnings tcg_rdr_env exported_names (map fst decls) maps fixities+ imported_modules loc_splices export_list tcg_exports inst_ifaces dflags++ let+ visible_names :: [Name]+ !visible_names = force $ mkVisibleNames maps export_items doc_opts++ -- Measure haddock documentation coverage.+ pruned_export_items :: [ExportItem GhcRn]+ pruned_export_items = pruneExportItems export_items++ !haddockable = 1 + length export_items -- module + exports+ !haddocked = (if isJust tcg_doc_hdr then 1 else 0) + length pruned_export_items++ coverage :: (Int, Int)+ !coverage = (haddockable, haddocked)++ aliases :: Map Module ModuleName+ aliases = mkAliasMap unit_state tcg_rn_imports++ insts :: [HaddockClsInst]+ !insts = force $ map (fromClsInst (Flag_Hoogle `elem` flags) dflags unit_state) tcg_insts++ return $! Interface+ {+ ifaceMod = tcg_mod+ , ifaceIsSig = is_sig+ , ifaceOrigFilename = msHsFilePath mod_sum+ , ifaceHieFile = Just ml_hie_file'+ , ifaceInfo = info+ , ifaceDoc = Documentation header_doc mod_warning+ , ifaceRnDoc = Documentation Nothing Nothing+ , ifaceOptions = doc_opts+ , ifaceDocMap = docs+ , ifaceArgMap = arg_docs+ , ifaceExportItems = if OptPrune `elem` doc_opts then+ pruned_export_items else export_items+ , ifaceRnExportItems = [] -- Filled in renameInterfaceRn+ , ifaceExports = exported_names+ , ifaceVisibleExports = visible_names+ , ifaceDeclMap = decl_map+ , ifaceFixMap = fixities+ , ifaceModuleAliases = aliases+ , ifaceInstances = insts+ , ifaceOrphanInstances = [] -- Filled in attachInstances+ , ifaceRnOrphanInstances = [] -- Filled in renameInterfaceRn+ , ifaceHaddockCoverage = coverage+ , ifaceWarningMap = warnings+ , ifaceDynFlags = dflags+ }+++-- | Given all of the @import M as N@ declarations in a package,+-- create a mapping from the module identity of M, to an alias N+-- (if there are multiple aliases, we pick the last one.) This+-- will go in 'ifaceModuleAliases'.+mkAliasMap :: UnitState -> [LImportDecl GhcRn] -> M.Map Module ModuleName+mkAliasMap st impDecls =+ M.fromList $+ mapMaybe (\(SrcLoc.L _ impDecl) -> do+ SrcLoc.L _ alias <- ideclAs impDecl+ return+ (lookupModuleDyn st+ -- TODO: This is supremely dodgy, because in general the+ -- UnitId isn't going to look anything like the package+ -- qualifier (even with old versions of GHC, the+ -- IPID would be p-0.1, but a package qualifier never+ -- has a version number it. (Is it possible that in+ -- Haddock-land, the UnitIds never have version numbers?+ -- I, ezyang, have not quite understand Haddock's package+ -- identifier model.)+ --+ -- Additionally, this is simulating some logic GHC already+ -- has for deciding how to qualify names when it outputs+ -- them to the user. We should reuse that information;+ -- or at least reuse the renamed imports, which know what+ -- they import!+ (ideclPkgQual impDecl)+ (case ideclName impDecl of SrcLoc.L _ name -> name),+ alias))+ impDecls++-- We want to know which modules are imported without any qualification. This+-- way we can display module reexports more compactly. This mapping also looks+-- through aliases:+--+-- module M (module X) where+-- import M1 as X+-- import M2 as X+--+-- With our mapping we know that we can display exported modules M1 and M2.+--+unrestrictedModuleImports :: [ImportDecl GhcRn] -> M.Map ModuleName [ModuleName]+unrestrictedModuleImports idecls =+ M.map (map (unLoc . ideclName))+ $ M.filter (all isInteresting) impModMap+ where+ impModMap =+ M.fromListWith (++) (concatMap moduleMapping idecls)++ moduleMapping idecl =+ concat [ [ (unLoc (ideclName idecl), [idecl]) ]+ , [ (unLoc mod_name, [idecl])+ | Just mod_name <- [ideclAs idecl]+ ]+ ]++ isInteresting idecl =+ case ideclImportList idecl of+ -- i) no subset selected+ Nothing -> True+ -- ii) an import with a hiding clause+ -- without any names+ Just (EverythingBut, L _ []) -> True+ -- iii) any other case of qualification+ _ -> False++-- Similar to GHC.lookupModule+-- ezyang: Not really...+lookupModuleDyn ::+ UnitState -> PkgQual -> ModuleName -> Module+lookupModuleDyn st pkg_qual mdlName = case pkg_qual of+ OtherPkg uid -> Module.mkModule (RealUnit (Definite uid)) mdlName+ ThisPkg uid -> Module.mkModule (RealUnit (Definite uid)) mdlName+ NoPkgQual -> case lookupModuleInAllUnits st mdlName of+ (m,_):_ -> m+ [] -> Module.mkModule Module.mainUnit mdlName++-- | Prune a 'ClsInst' down to a 'HaddockClsInst'. The goal is to remove as much+-- unnecessary information from the 'ClsInst' as possible by precomputing the+-- information we eventually want from it.+fromClsInst+ :: Bool+ -- ^ Was Hoogle output requested?+ -> DynFlags+ -- ^ GHC session dynflags+ -> UnitState+ -- ^ GHC session dynflags+ -> ClsInst+ -- ^ Class instance to convert+ -> HaddockClsInst+ -- ^ Resulting Haddock class instance+fromClsInst doHoogle dflags unitState inst =+ HaddockClsInst+ { haddockClsInstPprHoogle =+ if doHoogle then Just (ppInstance inst) else Nothing+ , haddockClsInstName = getName inst+ , haddockClsInstClsName = getName cls+ , haddockClsInstIsOrphan = isOrphan $ is_orphan inst+ , haddockClsInstSynified = synifyInstHead instSig+ , haddockClsInstHead = instHead instSig+ , haddockClsInstTyNames =+ foldl' (\ns t -> ns `Set.union` typeNames t) Set.empty tys+ }+ where+ instSig :: ([TyVar], [Type], Class, [Type])+ instSig@(_,_,cls,tys) = instanceSig inst++ ppInstance :: ClsInst -> String+ ppInstance i =+ dropComment $ outWith (showSDocForUser dflags unitState alwaysQualify) i'+ where+ -- As per #168, we don't want safety information about the class+ -- in Hoogle output. The easiest way to achieve this is to set the+ -- safety information to a state where the Outputable instance+ -- produces no output which means no overlap and unsafe (or [safe]+ -- is generated).+ i' = i { is_flag = OverlapFlag { overlapMode = NoOverlap NoSourceText+ , isSafeOverlap = False } }++ dropComment :: String -> String+ dropComment (' ':'-':'-':' ':_) = []+ dropComment (x:xs) = x : dropComment xs+ dropComment [] = []+++-------------------------------------------------------------------------------+-- Warnings+-------------------------------------------------------------------------------++mkWarningMap+ :: MonadIO m+ => DynFlags+ -> Warnings a+ -> GlobalRdrEnv+ -> [Name]+ -> IfM m WarningMap+mkWarningMap dflags warnings gre exps = case warnings of+ NoWarnings -> pure M.empty+ WarnAll _ -> pure M.empty+ WarnSome ws ->+ let ws' = [ (n, w)+ | (occ, w) <- ws+ , elt <- lookupGlobalRdrEnv gre occ+ , let n = greMangledName elt, n `elem` exps ]+ in M.fromList <$> traverse (bitraverse pure (parseWarning dflags gre)) ws'++moduleWarning+ :: MonadIO m+ => DynFlags+ -> GlobalRdrEnv+ -> Warnings a+ -> IfM m (Maybe (Doc Name))+moduleWarning _ _ NoWarnings = pure Nothing+moduleWarning _ _ (WarnSome _) = pure Nothing+moduleWarning dflags gre (WarnAll w) = Just <$> parseWarning dflags gre w++parseWarning+ :: MonadIO m+ => DynFlags+ -> GlobalRdrEnv+ -> WarningTxt a+ -> IfM m (Doc Name)+parseWarning dflags gre w = case w of+ DeprecatedTxt _ msg -> format "Deprecated: " (foldMap (unpackFS . sl_fs . hsDocString . unLoc) msg)+ WarningTxt _ msg -> format "Warning: " (foldMap (unpackFS . sl_fs . hsDocString . unLoc) msg)+ where+ format x bs = DocWarning . DocParagraph . DocAppend (DocString x)+ <$> processDocStringFromString dflags gre bs+++-------------------------------------------------------------------------------+-- Doc options+--+-- Haddock options that are embedded in the source file+-------------------------------------------------------------------------------++mkDocOpts :: MonadIO m => Maybe String -> [Flag] -> Module -> IfM m [DocOption]+mkDocOpts mbOpts flags mdl = do+ opts <- case mbOpts of+ Just opts -> case words $ replace ',' ' ' opts of+ [] -> warn "No option supplied to DOC_OPTION/doc_option" >> return []+ xs -> fmap catMaybes (mapM parseOption xs)+ Nothing -> return []+ pure (foldl go opts flags)+ where+ mdlStr = moduleString mdl++ -- Later flags override earlier ones+ go os m | m == Flag_HideModule mdlStr = OptHide : os+ | m == Flag_ShowModule mdlStr = filter (/= OptHide) os+ | m == Flag_ShowAllModules = filter (/= OptHide) os+ | m == Flag_IgnoreAllExports = OptIgnoreExports : os+ | m == Flag_ShowExtensions mdlStr = OptIgnoreExports : os+ | otherwise = os++parseOption :: MonadIO m => String -> IfM m (Maybe DocOption)+parseOption "hide" = return (Just OptHide)+parseOption "prune" = return (Just OptPrune)+parseOption "ignore-exports" = return (Just OptIgnoreExports)+parseOption "not-home" = return (Just OptNotHome)+parseOption "show-extensions" = return (Just OptShowExtensions)+parseOption other = warn ("Unrecognised option: " ++ other) >> return Nothing++--------------------------------------------------------------------------------+-- Maps+--------------------------------------------------------------------------------+++type Maps = (DocMap Name, ArgMap Name, DeclMap, InstMap)++-- | Create 'Maps' by looping through the declarations. For each declaration,+-- find its names, its subordinates, and its doc strings. Process doc strings+-- into 'Doc's.+mkMaps+ :: MonadIO m+ => DynFlags+ -> Maybe Package -- this package+ -> GlobalRdrEnv+ -> [Name]+ -> [(LHsDecl GhcRn, [HsDoc GhcRn])]+ -> ExtractedTHDocs -- ^ Template Haskell putDoc docs+ -> IfM m Maps+mkMaps dflags pkgName gre instances decls thDocs = do+ (a, b, c) <- unzip3 <$> traverse mappings decls+ (th_a, th_b) <- thMappings+ pure ( force $+ th_a `M.union` f' (map (nubByName fst) a)+ , force $+ fmap intmap2mapint $+ th_b `unionArgMaps` (f (filterMapping (not . IM.null) b))+ , f c+ , instanceMap+ )+ where+ f :: (Ord a, Semigroup b) => [[(a, b)]] -> Map a b+ f = M.fromListWith (<>) . concat++ f' :: [[(Name, MDoc Name)]] -> Map Name (MDoc Name)+ f' = M.fromListWith metaDocAppend . concat++ filterMapping :: (b -> Bool) -> [[(a, b)]] -> [[(a, b)]]+ filterMapping p = map (filter (p . snd))++ -- Convert IntMap -> IntMap+ -- TODO: should ArgMap eventually be switched over to IntMap?+ intmap2mapint = M.fromList . IM.toList++ -- | Extract the mappings from template haskell.+ -- No DeclMap/InstMap is needed since we already have access to the+ -- doc strings+ thMappings+ :: MonadIO m+ => IfM m (Map Name (MDoc Name), Map Name (IntMap (MDoc Name)))+ thMappings = do+ let ExtractedTHDocs+ _+ declDocs+ argDocs+ instDocs = thDocs+ ds2mdoc :: MonadIO m => (HsDoc GhcRn) -> IfM m (MDoc Name)+ ds2mdoc = processDocStringParas dflags pkgName gre . hsDocString++ let cvt = M.fromList . nonDetEltsUniqMap++ declDocs' <- mapM ds2mdoc (cvt declDocs)+ argDocs' <- mapM (mapM ds2mdoc) (cvt argDocs)+ instDocs' <- mapM ds2mdoc (cvt instDocs)+ return (declDocs' <> instDocs', argDocs')+++ mappings+ :: MonadIO m+ => (LHsDecl GhcRn, [HsDoc GhcRn])+ -> IfM m+ ( [(Name, MDoc Name)]+ , [(Name, IntMap (MDoc Name))]+ , [(Name, DeclMapEntry)]+ )+ mappings (ldecl@(L (SrcSpanAnn _ (RealSrcSpan l _)) decl), hs_docStrs) = do+ let docStrs = map hsDocString hs_docStrs+ declDoc+ :: MonadIO m+ => [HsDocString]+ -> IntMap HsDocString+ -> IfM m (Maybe (MDoc Name), IntMap (MDoc Name))+ declDoc strs m = do+ doc' <- processDocStrings dflags pkgName gre strs+ m' <- traverse (processDocStringParas dflags pkgName gre) m+ pure (doc', m')++ (!doc, !args) <- force <$> declDoc docStrs (fmap hsDocString (declTypeDocs decl))++ let+ subs :: [(Name, [HsDocString], IntMap HsDocString)]+ subs = map (\(n, ds, im) -> (n, map hsDocString ds, fmap hsDocString im))+ $ subordinates emptyOccEnv instanceMap decl++ (subDocs, subArgs) <- unzip <$> traverse (\(_, strs, m) -> declDoc strs m) subs++ let+ ns = names l decl+ subNs = [ n | (n, _, _) <- subs ]+ dm = [ (n, d) | (n, Just d) <- zip ns (repeat doc) ++ zip subNs subDocs ]+ am = [ (n, args) | n <- ns ] ++ zip subNs subArgs+ cm = [ (n, toDeclMapEntry ldecl) | n <- ns ++ subNs ]++ seqList ns `seq`+ seqList subNs `seq`+ doc `seq`+ seqList subDocs `seq`+ seqList subArgs `seq`+ pure (dm, am, cm)+ mappings (L (SrcSpanAnn _ (UnhelpfulSpan _)) _, _) = pure ([], [], [])++ instanceMap :: Map RealSrcSpan Name+ instanceMap = M.fromList [(l, n) | n <- instances, RealSrcSpan l _ <- [getSrcSpan n] ]++ names :: RealSrcSpan -> HsDecl GhcRn -> [Name]+ names _ (InstD _ d) = maybeToList (SrcLoc.lookupSrcSpan loc instanceMap) -- See note [2].+ where loc = case d of+ -- The CoAx's loc is the whole line, but only for TFs. The+ -- workaround is to dig into the family instance declaration and+ -- get the identifier with the right location.+ TyFamInstD _ (TyFamInstDecl _ d') -> getLocA (feqn_tycon d')+ _ -> getInstLoc d+ names l (DerivD {}) = maybeToList (M.lookup l instanceMap) -- See note [2].+ names _ decl = getMainDeclBinder emptyOccEnv decl++-- | Unions together two 'ArgDocMaps' (or ArgMaps in haddock-api), such that two+-- maps with values for the same key merge the inner map as well.+-- Left biased so @unionArgMaps a b@ prefers @a@ over @b@.++unionArgMaps :: forall b . Map Name (IntMap b)+ -> Map Name (IntMap b)+ -> Map Name (IntMap b)+unionArgMaps a b = M.foldrWithKey go b a+ where+ go :: Name -> IntMap b+ -> Map Name (IntMap b) -> Map Name (IntMap b)+ go n newArgMap acc+ | Just oldArgMap <- M.lookup n acc =+ M.insert n (newArgMap `IM.union` oldArgMap) acc+ | otherwise = M.insert n newArgMap acc++-- Note [2]:+------------+-- We relate ClsInsts to InstDecls and DerivDecls using the SrcSpans buried+-- inside them. That should work for normal user-written instances (from+-- looking at GHC sources). We can assume that commented instances are+-- user-written. This lets us relate Names (from ClsInsts) to comments+-- (associated with InstDecls and DerivDecls).++--------------------------------------------------------------------------------+-- Declarations+--------------------------------------------------------------------------------++-- | Extract a map of fixity declarations only+mkFixMap :: HsGroup GhcRn -> FixMap+mkFixMap group_ =+ M.fromList [ (n,f)+ | L _ (FixitySig _ ns f) <- hsGroupTopLevelFixitySigs group_,+ L _ n <- ns ]+++-- | Build the list of items that will become the documentation, from the+-- export list. At this point, the list of ExportItems is in terms of+-- original names.+--+-- We create the export items even if the module is hidden, since they+-- might be useful when creating the export items for other modules.+mkExportItems+ :: MonadIO m+ => Bool -- is it a signature+ -> IfaceMap+ -> Maybe Package -- this package+ -> Module -- this module+ -> Module -- semantic module+ -> WarningMap+ -> GlobalRdrEnv+ -> [Name] -- exported names (orig)+ -> [LHsDecl GhcRn] -- renamed source declarations+ -> Maps+ -> FixMap+ -> M.Map ModuleName [ModuleName]+ -> [SrcSpan] -- splice locations+ -> Maybe [(IE GhcRn, Avails)]+ -> Avails -- exported stuff from this module+ -> InstIfaceMap+ -> DynFlags+ -> IfM m [ExportItem GhcRn]+mkExportItems+ is_sig modMap pkgName thisMod semMod warnings gre exportedNames decls+ maps fixMap unrestricted_imp_mods splices exportList allExports+ instIfaceMap dflags =+ case exportList of+ Nothing -> do+ fullModuleContents is_sig modMap pkgName thisMod semMod warnings gre+ exportedNames decls maps fixMap splices instIfaceMap dflags+ allExports+ Just exports -> fmap concat $ mapM lookupExport exports+ where+ lookupExport (IEGroup _ lev docStr, _) = do+ !doc <- force <$> processDocString dflags gre (hsDocString . unLoc $ docStr)+ return [ExportGroup lev "" doc]++ lookupExport (IEDoc _ docStr, _) = do+ !doc <- force <$> processDocStringParas dflags pkgName gre (hsDocString . unLoc $ docStr)+ return [ExportDoc doc]++ lookupExport (IEDocNamed _ str, _) =+ findNamedDoc str [ unL d | d <- decls ] >>= \case+ Nothing -> return []+ Just docStr -> do+ !doc <- force <$> processDocStringParas dflags pkgName gre docStr+ return [ExportDoc doc]++ lookupExport (IEModuleContents _ (L _ mod_name), _)+ -- only consider exporting a module if we are sure we+ -- are really exporting the whole module and not some+ -- subset. We also look through module aliases here.+ | Just mods <- M.lookup mod_name unrestricted_imp_mods+ , not (null mods)+ = concat <$> traverse (moduleExport thisMod dflags modMap instIfaceMap) mods++ lookupExport (_, avails) = concat <$> traverse availExport (nubAvails avails)++ availExport avail =+ availExportItem is_sig modMap thisMod semMod warnings exportedNames+ maps fixMap splices instIfaceMap dflags avail+++-- Extract the minimal complete definition of a Name, if one exists+minimalDef :: Monad m => Name -> IfM m (Maybe ClassMinimalDef)+minimalDef n = do+ mty <- lookupName n+ case mty of+ Just (ATyCon (tyConClass_maybe -> Just c)) ->+ return . Just $ classMinimalDef c+ _ ->+ return Nothing+++availExportItem+ :: forall m+ . MonadIO m+ => Bool -- is it a signature+ -> IfaceMap+ -> Module -- this module+ -> Module -- semantic module+ -> WarningMap+ -> [Name] -- exported names (orig)+ -> Maps+ -> FixMap+ -> [SrcSpan] -- splice locations+ -> InstIfaceMap+ -> DynFlags+ -> AvailInfo+ -> IfM m [ExportItem GhcRn]+availExportItem is_sig modMap thisMod semMod warnings exportedNames+ (docMap, argMap, declMap, _) fixMap splices instIfaceMap+ dflags availInfo = declWith availInfo+ where+ declWith :: AvailInfo -> IfM m [ ExportItem GhcRn ]+ declWith avail = do+ let t = availName avail+ r <- findDecl avail+ case r of+ (Just (EValD srcSpan), (doc, _)) -> do+ -- Since the DeclMapEntry is an 'EValD', we know the declaration is a+ -- top-level binding without a type signature. We get type information+ -- for the binding from the GHC interface file using the+ -- 'hiValExportItem' function+ export <- hiValExportItem dflags t srcSpan doc (srcSpan `elem` splices) $ M.lookup t fixMap+ return [export]++ (Just (EOther d), docs_) ->+ let declNames = getMainDeclBinder emptyOccEnv (unL d)+ in case () of+ _+ -- If 't' is not the main declaration binder, then it is a+ -- subordinate name in the declaration. If any of its parents are+ -- also exported, we do not want to show its documentation by+ -- itself. See note [1].+ | t `notElem` declNames,+ Just p <- find isExported (parents t $ unL d) -> do+ warn $+ "Warning: " ++ moduleString thisMod ++ ": " +++ pretty dflags (nameOccName t) ++ " is exported separately but " +++ "will be documented under " ++ pretty dflags (nameOccName p) +++ ". Consider exporting it together with its parent(s)" +++ " for code clarity."+ return []++ -- normal case+ | otherwise -> case d of+ -- A single signature might refer to many names, but we+ -- create an export item for a single name only. So we+ -- modify the signature to contain only that single name.+ L loc (SigD _ sig) ->+ -- fromJust is safe since we already checked in guards+ -- that 't' is a name declared in this declaration.+ let newDecl = L loc . SigD noExtField . fromJust $ filterSigNames (== t) sig+ in availExportDecl avail newDecl docs_++ L loc (TyClD _ ClassDecl {..}) -> do+ mdef <- minimalDef t+ let sig = maybeToList $ fmap (noLocA . MinimalSig (noAnn, NoSourceText) . noLocA . fmap noLocA) mdef+ availExportDecl avail+ (L loc $ TyClD noExtField ClassDecl { tcdSigs = sig ++ tcdSigs, .. }) docs_++ _ -> availExportDecl avail d docs_++ -- Declaration from another package+ (Nothing, _) -> do+ mayDecl <- hiDecl dflags t+ case mayDecl of+ Nothing -> return [ ExportNoDecl t [] ]+ Just decl ->+ -- We try to get the subs and docs+ -- from the installed .haddock file for that package.+ -- TODO: This needs to be more sophisticated to deal+ -- with signature inheritance+ case M.lookup (nameModule t) instIfaceMap of+ Nothing -> do+ warn $ "Warning: Couldn't find .haddock for export " ++ pretty dflags t+ let subs_ = availNoDocs avail+ availExportDecl avail decl (noDocForDecl, subs_)+ Just iface ->+ availExportDecl avail decl (lookupDocs avail warnings (instDocMap iface) (instArgMap iface))++ -- Tries 'extractDecl' first then falls back to 'hiDecl' if that fails+ availDecl :: Name -> LHsDecl GhcRn -> IfM m (LHsDecl GhcRn)+ availDecl declName parentDecl =+ case extractDecl declMap declName parentDecl of+ Right d -> pure d+ Left err -> do+ synifiedDeclOpt <- hiDecl dflags declName+ case synifiedDeclOpt of+ Just synifiedDecl -> pure synifiedDecl+ Nothing -> pprPanic "availExportItem" (O.text err)++ availExportDecl :: AvailInfo -> LHsDecl GhcRn+ -> (DocForDecl Name, [(Name, DocForDecl Name)])+ -> IfM m [ ExportItem GhcRn ]+ availExportDecl avail decl (doc, subs)+ | availExportsDecl avail = do+ extractedDecl <- availDecl (availName avail) decl++ -- bundled pattern synonyms only make sense if the declaration is+ -- exported (otherwise there would be nothing to bundle to)+ bundledPatSyns <- findBundledPatterns avail++ let+ !patSynNames = force $+ concatMap (getMainDeclBinder emptyOccEnv . fst) bundledPatSyns++ !doc' = force doc+ !subs' = force subs++ !restrictToNames = force $ fmap fst subs'++ !fixities = force+ [ (n, f)+ | n <- availName avail : fmap fst subs' ++ patSynNames+ , Just f <- [M.lookup n fixMap]+ ]++ return+ [ ExportDecl ExportD+ { expDDecl = restrictTo restrictToNames extractedDecl+ , expDPats = bundledPatSyns+ , expDMbDoc = doc'+ , expDSubDocs = subs'+ , expDInstances = []+ , expDFixities = fixities+ , expDSpliced = False+ }+ ]++ | otherwise = for subs $ \(sub, sub_doc) -> do+ extractedDecl <- availDecl sub decl++ let+ !fixities = force [ (sub, f) | Just f <- [M.lookup sub fixMap] ]+ !subDoc = force sub_doc++ return $+ ExportDecl ExportD+ { expDDecl = extractedDecl+ , expDPats = []+ , expDMbDoc = subDoc+ , expDSubDocs = []+ , expDInstances = []+ , expDFixities = fixities+ , expDSpliced = False+ }++ exportedNameSet = mkNameSet exportedNames+ isExported n = elemNameSet n exportedNameSet++ findDecl :: AvailInfo -> IfM m (Maybe DeclMapEntry, (DocForDecl Name, [(Name, DocForDecl Name)]))+ findDecl avail+ | m == semMod =+ case M.lookup n declMap of+ Just d -> return (Just d, lookupDocs avail warnings docMap argMap)+ Nothing+ | is_sig -> do+ -- OK, so it wasn't in the local declaration map. It could+ -- have been inherited from a signature. Reconstitute it+ -- from the type.+ mb_r <- hiDecl dflags n+ case mb_r of+ Nothing -> return (Nothing, (noDocForDecl, availNoDocs avail))+ -- TODO: If we try harder, we might be able to find+ -- a Haddock! Look in the Haddocks for each thing in+ -- requirementContext (unitState)+ Just decl -> return (Just $ toDeclMapEntry decl, (noDocForDecl, availNoDocs avail))+ | otherwise ->+ return (Nothing, (noDocForDecl, availNoDocs avail))+ | Just iface <- M.lookup (semToIdMod (moduleUnit thisMod) m) modMap+ , Just d <- M.lookup n (ifaceDeclMap iface) =+ return (Just d, lookupDocs avail warnings+ (ifaceDocMap iface)+ (ifaceArgMap iface))+ | otherwise = return (Nothing, (noDocForDecl, availNoDocs avail))+ where+ n = availName avail+ m = nameModule n++ findBundledPatterns :: AvailInfo -> IfM m [(HsDecl GhcRn, DocForDecl Name)]+ findBundledPatterns avail = do+ patsyns <- for constructor_names $ \name -> do+ mtyThing <- lookupName name+ case mtyThing of+ Just (AConLike PatSynCon{}) -> do+ export_items <- declWith (Avail.avail name)+ pure [ (unLoc patsyn_decl, patsyn_doc)+ | ExportDecl ExportD+ { expDDecl = patsyn_decl+ , expDMbDoc = patsyn_doc+ } <- export_items+ ]+ _ -> pure []+ pure (concat patsyns)+ where+ constructor_names =+ filter isDataConName (availSubordinates avail)++availSubordinates :: AvailInfo -> [Name]+availSubordinates = map greNameMangledName . availSubordinateGreNames++availNoDocs :: AvailInfo -> [(Name, DocForDecl Name)]+availNoDocs avail =+ zip (availSubordinates avail) (repeat noDocForDecl)++-- | Given a 'Module' from a 'Name', convert it into a 'Module' that+-- we can actually find in the 'IfaceMap'.+semToIdMod :: Unit -> Module -> Module+semToIdMod this_uid m+ | Module.isHoleModule m = mkModule this_uid (moduleName m)+ | otherwise = m++hiDecl :: MonadIO m => DynFlags -> Name -> IfM m (Maybe (LHsDecl GhcRn))+hiDecl dflags t = do+ mayTyThing <- lookupName t+ case mayTyThing of+ Nothing -> do+ warn $ "Warning: Not found in environment: " ++ pretty dflags t+ return Nothing+ Just x -> case tyThingToLHsDecl ShowRuntimeRep x of+ Left m -> (warn $ bugWarn m) >> return Nothing+ Right (m, t') -> mapM (warn . bugWarn) m >> return (Just $ noLocA t')+ where+ warnLine x = O.text "haddock-bug:" O.<+> O.text x O.<>+ O.comma O.<+> O.quotes (O.ppr t) O.<+>+ O.text "-- Please report this on Haddock issue tracker!"+ bugWarn = showSDoc dflags . warnLine++-- | This function is called for top-level bindings without type signatures.+-- It gets the type signature from GHC and that means it's not going to+-- have a meaningful 'SrcSpan'. So we pass down 'SrcSpan' for the+-- declaration and use it instead - 'nLoc' here.+hiValExportItem+ :: MonadIO m => DynFlags -> Name -> SrcSpan -> DocForDecl Name -> Bool+ -> Maybe Fixity -> IfM m (ExportItem GhcRn)+hiValExportItem dflags name nLoc doc splice fixity = do+ mayDecl <- hiDecl dflags name+ case mayDecl of+ Nothing -> return (ExportNoDecl name [])+ Just decl -> return (ExportDecl $ ExportD (fixSpan decl) [] doc [] [] fixities splice)+ where+ fixSpan (L (SrcSpanAnn a l) t) = L (SrcSpanAnn a (SrcLoc.combineSrcSpans l nLoc)) t+ fixities = case fixity of+ Just f -> [(name, f)]+ Nothing -> []+++-- | Lookup docs for a declaration from maps.+lookupDocs :: AvailInfo -> WarningMap -> DocMap Name -> ArgMap Name+ -> (DocForDecl Name, [(Name, DocForDecl Name)])+lookupDocs avail warningMap docMap argMap =+ let n = availName avail in+ let lookupArgDoc x = M.findWithDefault M.empty x argMap in+ let doc = (lookupDoc n, lookupArgDoc n) in+ let subDocs = [ (s, (lookupDoc s, lookupArgDoc s))+ | s <- availSubordinates avail+ ] in+ (doc, subDocs)+ where+ lookupDoc name = Documentation (M.lookup name docMap) (M.lookup name warningMap)+++-- | Export the given module as `ExportModule`. We are not concerned with the+-- single export items of the given module.+moduleExport+ :: MonadIO m+ => Module -- ^ Module A (identity, NOT semantic)+ -> DynFlags -- ^ The flags used when typechecking A+ -> IfaceMap -- ^ Already created interfaces+ -> InstIfaceMap -- ^ Interfaces in other packages+ -> ModuleName -- ^ The exported module+ -> IfM m [ExportItem GhcRn] -- ^ Resulting export items+moduleExport thisMod dflags ifaceMap instIfaceMap expMod =+ -- NB: we constructed the identity module when looking up in+ -- the IfaceMap.+ case M.lookup m ifaceMap of+ Just iface+ | OptHide `elem` ifaceOptions iface -> return (ifaceExportItems iface)+ | otherwise -> return [ ExportModule m ]++ Nothing -> -- We have to try to find it in the installed interfaces+ -- (external packages).+ case M.lookup expMod (M.mapKeys moduleName instIfaceMap) of+ Just iface -> return [ ExportModule (instMod iface) ]+ Nothing -> do+ warn $+ "Warning: " ++ pretty dflags thisMod ++ ": Could not find " +++ "documentation for exported module: " ++ pretty dflags expMod+ return []+ where+ m = mkModule (moduleUnit thisMod) expMod -- Identity module!++-- Note [1]:+------------+-- It is unnecessary to document a subordinate by itself at the top level if+-- any of its parents is also documented. Furthermore, if the subordinate is a+-- record field or a class method, documenting it under its parent+-- indicates its special status.+--+-- A user might expect that it should show up separately, so we issue a+-- warning. It's a fine opportunity to also tell the user she might want to+-- export the subordinate through the parent export item for clarity.+--+-- The code removes top-level subordinates also when the parent is exported+-- through a 'module' export. I think that is fine.+--+-- (For more information, see Trac #69)+++-- | Simplified variant of 'mkExportItems', where we can assume that+-- every locally defined declaration is exported; thus, we just+-- zip through the renamed declarations.++fullModuleContents+ :: MonadIO m+ => Bool -- is it a signature+ -> IfaceMap+ -> Maybe Package -- this package+ -> Module -- this module+ -> Module -- semantic module+ -> WarningMap+ -> GlobalRdrEnv -- ^ The renaming environment+ -> [Name] -- exported names (orig)+ -> [LHsDecl GhcRn] -- renamed source declarations+ -> Maps+ -> FixMap+ -> [SrcSpan] -- splice locations+ -> InstIfaceMap+ -> DynFlags+ -> Avails+ -> IfM m [ExportItem GhcRn]+fullModuleContents is_sig modMap pkgName thisMod semMod warnings gre exportedNames+ decls maps@(_, _, declMap, _) fixMap splices instIfaceMap dflags avails = do+ let availEnv = availsToNameEnv (nubAvails avails)+ (concat . concat) `fmap` (for decls $ \decl -> do+ case decl of+ (L _ (DocD _ (DocGroup lev docStr))) -> do+ !doc <- force <$> processDocString dflags gre (hsDocString . unLoc $ docStr)+ return [[ExportGroup lev "" doc]]+ (L _ (DocD _ (DocCommentNamed _ docStr))) -> do+ !doc <- force <$> processDocStringParas dflags pkgName gre (hsDocString . unLoc $ docStr)+ return [[ExportDoc doc]]+ (L _ (ValD _ valDecl))+ | name:_ <- collectHsBindBinders CollNoDictBinders valDecl+ , Just (EOther (L _ SigD{})) <- M.lookup name declMap+ -> return []+ _ ->+ for (getMainDeclBinder emptyOccEnv (unLoc decl)) $ \nm -> do+ case lookupNameEnv availEnv nm of+ Just avail ->+ availExportItem is_sig modMap thisMod+ semMod warnings exportedNames maps fixMap+ splices instIfaceMap dflags avail+ Nothing -> pure [])++-- | Sometimes the declaration we want to export is not the "main" declaration:+-- it might be an individual record selector or a class method. In these+-- cases we have to extract the required declaration (and somehow cobble+-- together a type signature for it...).+--+-- This function looks through the declarations in this module to try to find+-- the one with the right name.+extractDecl+ :: HasCallStack+ => DeclMap -- ^ all declarations in the file+ -> Name -- ^ name of the declaration to extract+ -> LHsDecl GhcRn -- ^ parent declaration+ -> Either String (LHsDecl GhcRn)+extractDecl declMap name decl+ | name `elem` getMainDeclBinder emptyOccEnv (unLoc decl) = pure decl+ | otherwise =+ case unLoc decl of+ TyClD _ d@ClassDecl { tcdLName = L _ clsNm+ , tcdSigs = clsSigs+ , tcdATs = clsATs } ->+ let+ matchesMethod =+ [ lsig+ | lsig <- clsSigs+ , ClassOpSig _ False _ _ <- pure $ unLoc lsig+ -- Note: exclude `default` declarations (see #505)+ , name `elem` sigName lsig+ ]++ matchesAssociatedType =+ [ lfam_decl+ | lfam_decl <- clsATs+ , name == unLoc (fdLName (unLoc lfam_decl))+ ]++ -- TODO: document fixity+ in case (matchesMethod, matchesAssociatedType) of+ ([s0], _) -> let tyvar_names = tyClDeclTyVars d+ L pos sig = addClassContext clsNm tyvar_names s0+ in pure (L pos (SigD noExtField sig))+ (_, [L pos fam_decl]) -> pure (L pos (TyClD noExtField (FamDecl noExtField fam_decl)))++ ([], [])+ | Just (EOther famInstDecl) <- M.lookup name declMap+ -> extractDecl declMap name famInstDecl+ _ -> Left (concat [ "Ambiguous decl for ", getOccString name+ , " in class ", getOccString clsNm ])++ TyClD _ d@DataDecl { tcdLName = L _ dataNm+ , tcdDataDefn = HsDataDefn { dd_cons = dataCons } } -> do+ let ty_args = lHsQTyVarsToTypes (tyClDeclTyVars d)+ lsig <- if isDataConName name+ then extractPatternSyn name dataNm ty_args (toList dataCons)+ else extractRecSel name dataNm ty_args (toList dataCons)+ pure (SigD noExtField <$> lsig)++ TyClD _ FamDecl {}+ | isValName name+ , Just (EOther famInst) <- M.lookup name declMap+ -> extractDecl declMap name famInst+ InstD _ (DataFamInstD _ (DataFamInstDecl+ (FamEqn { feqn_tycon = L _ n+ , feqn_pats = tys+ , feqn_rhs = defn }))) ->+ if isDataConName name+ then fmap (SigD noExtField) <$> extractPatternSyn name n tys (toList $ dd_cons defn)+ else fmap (SigD noExtField) <$> extractRecSel name n tys (toList $ dd_cons defn)+ InstD _ (ClsInstD _ ClsInstDecl { cid_datafam_insts = insts })+ | isDataConName name ->+ let matches = [ d' | L _ d'@(DataFamInstDecl (FamEqn { feqn_rhs = dd })) <- insts+ , name `elem` map unLoc (concatMap (toList . getConNames . unLoc) (dd_cons dd))+ ]+ in case matches of+ [d0] -> extractDecl declMap name (noLocA (InstD noExtField (DataFamInstD noExtField d0)))+ _ -> Left "internal: extractDecl (ClsInstD)"+ | otherwise ->+ let matches = [ d' | L _ d'@(DataFamInstDecl d )+ <- insts+ -- , L _ ConDecl { con_details = RecCon rec } <- toList $ dd_cons (feqn_rhs d)+ , Just rec <- toList $ getRecConArgs_maybe . unLoc <$> dd_cons (feqn_rhs d)+ , ConDeclField { cd_fld_names = ns } <- map unLoc (unLoc rec)+ , L _ n <- ns+ , foExt n == name+ ]+ in case matches of+ [d0] -> extractDecl declMap name (noLocA . InstD noExtField $ DataFamInstD noExtField d0)+ _ -> Left "internal: extractDecl (ClsInstD)"+ _ -> Left ("extractDecl: Unhandled decl for " ++ getOccString name)++extractPatternSyn :: Name -> Name+ -> [LHsTypeArg GhcRn] -> [LConDecl GhcRn]+ -> Either String (LSig GhcRn)+extractPatternSyn nm t tvs cons =+ case filter matches cons of+ [] -> Left . O.showSDocOneLine O.defaultSDocContext $+ O.text "constructor pattern " O.<+> O.ppr nm O.<+> O.text "not found in type" O.<+> O.ppr t+ con:_ -> pure (extract <$> con)+ where+ matches :: LConDecl GhcRn -> Bool+ matches (L _ con) = nm `elem` (unLoc <$> getConNames con)+ extract :: ConDecl GhcRn -> Sig GhcRn+ extract con =+ let args =+ case con of+ ConDeclH98 { con_args = con_args' } -> case con_args' of+ PrefixCon _ args' -> map hsScaledThing args'+ RecCon (L _ fields) -> cd_fld_type . unLoc <$> fields+ InfixCon arg1 arg2 -> map hsScaledThing [arg1, arg2]+ ConDeclGADT { con_g_args = con_args' } -> case con_args' of+ PrefixConGADT args' -> map hsScaledThing args'+ RecConGADT (L _ fields) _ -> cd_fld_type . unLoc <$> fields+ typ = longArrow args (data_ty con)+ typ' =+ case con of+ ConDeclH98 { con_mb_cxt = Just cxt } -> noLocA (HsQualTy noExtField cxt typ)+ _ -> typ+ typ'' = noLocA (HsQualTy noExtField (noLocA []) typ')+ in PatSynSig noAnn [noLocA nm] (mkEmptySigType typ'')++ longArrow :: [LHsType GhcRn] -> LHsType GhcRn -> LHsType GhcRn+ longArrow inputs output = foldr (\x y -> noLocA (HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) x y)) output inputs++ data_ty con+ | ConDeclGADT{} <- con = con_res_ty con+ | otherwise = foldl' (\x y -> noLocA (mkAppTyArg x y)) (noLocA (HsTyVar noAnn NotPromoted (noLocA t))) tvs+ where mkAppTyArg :: LHsType GhcRn -> LHsTypeArg GhcRn -> HsType GhcRn+ mkAppTyArg f (HsValArg ty) = HsAppTy noExtField f ty+ mkAppTyArg f (HsTypeArg l ki) = HsAppKindTy l f ki+ mkAppTyArg f (HsArgPar _) = HsParTy noAnn f++extractRecSel :: Name -> Name -> [LHsTypeArg GhcRn] -> [LConDecl GhcRn]+ -> Either String (LSig GhcRn)+extractRecSel _ _ _ [] = Left "extractRecSel: selector not found"++extractRecSel nm t tvs (L _ con : rest) =+ case getRecConArgs_maybe con of+ Just (L _ fields) | ((l,L _ (ConDeclField _ _nn ty _)) : _) <- matching_fields fields ->+ pure (L (noAnnSrcSpan l) (TypeSig noAnn [noLocA nm] (mkEmptyWildCardBndrs $ mkEmptySigType (noLocA (HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) data_ty (getBangType ty))))))+ _ -> extractRecSel nm t tvs rest+ where+ matching_fields :: [LConDeclField GhcRn] -> [(SrcSpan, LConDeclField GhcRn)]+ matching_fields flds = [ (locA l,f) | f@(L _ (ConDeclField _ ns _ _)) <- flds+ , L l n <- ns, foExt n == nm ]+ data_ty+ -- ResTyGADT _ ty <- con_res con = ty+ | ConDeclGADT{} <- con = con_res_ty con+ | otherwise = foldl' (\x y -> noLocA (mkAppTyArg x y)) (noLocA (HsTyVar noAnn NotPromoted (noLocA t))) tvs+ where mkAppTyArg :: LHsType GhcRn -> LHsTypeArg GhcRn -> HsType GhcRn+ mkAppTyArg f (HsValArg ty) = HsAppTy noExtField f ty+ mkAppTyArg f (HsTypeArg l ki) = HsAppKindTy l f ki+ mkAppTyArg f (HsArgPar _) = HsParTy noAnn f++-- | Keep export items with docs.+pruneExportItems :: [ExportItem GhcRn] -> [ExportItem GhcRn]+pruneExportItems = filter hasDoc+ where+ hasDoc (ExportDecl ExportD {expDMbDoc = (Documentation d _, _)}) = isJust d+ hasDoc _ = True+++mkVisibleNames :: Maps -> [ExportItem GhcRn] -> [DocOption] -> [Name]+mkVisibleNames (_, _, _, instMap) exports opts+ | OptHide `elem` opts = []+ | otherwise = let ns = concatMap exportName exports+ in seqList ns `seq` ns+ where+ exportName (ExportDecl e@ExportD{}) = name ++ subs ++ patsyns+ where subs = map fst (expDSubDocs e)+ patsyns = concatMap (getMainDeclBinder emptyOccEnv . fst) (expDPats e)+ name = case unLoc $ expDDecl e of+ InstD _ d -> maybeToList $ SrcLoc.lookupSrcSpan (getInstLoc d) instMap+ decl -> getMainDeclBinder emptyOccEnv decl+ exportName ExportNoDecl {} = [] -- we don't count these as visible, since+ -- we don't want links to go to them.+ exportName _ = []++seqList :: [a] -> ()+seqList [] = ()+seqList (x : xs) = x `seq` seqList xs++-- | Find a stand-alone documentation comment by its name.+findNamedDoc :: MonadIO m => String -> [HsDecl GhcRn] -> IfM m (Maybe HsDocString)+findNamedDoc name = search+ where+ search [] = do+ -- TODO: Make sure this isn't duplicating messages+ warn $ "Cannot find documentation for: $" ++ name+ return Nothing+ search (DocD _ (DocCommentNamed name' doc) : rest)+ | name == name' = return (Just (hsDocString . unLoc $ doc))++ | otherwise = search rest+ search (_other_decl : rest) = search rest
@@ -0,0 +1,268 @@+{-# LANGUAGE RecordWildCards #-}+module Haddock.Interface.Json (+ jsonInstalledInterface+ , jsonInterfaceFile+ , renderJson+ ) where++import GHC.Types.Fixity+import GHC.Utils.Json+import GHC.Unit.Module+import GHC.Types.Name+import GHC.Utils.Outputable++import Control.Arrow+import Data.Map (Map)+import qualified Data.Map as Map++import Haddock.Types+import Haddock.InterfaceFile++jsonInterfaceFile :: InterfaceFile -> JsonDoc+jsonInterfaceFile InterfaceFile{..} =+ jsonObject [ ("link_env" , jsonMap nameStableString (jsonString . moduleNameString . moduleName) ifLinkEnv)+ , ("inst_ifaces", jsonArray (map jsonInstalledInterface ifInstalledIfaces))+ ]++jsonInstalledInterface :: InstalledInterface -> JsonDoc+jsonInstalledInterface InstalledInterface{..} = jsonObject properties+ where+ properties =+ [ ("module" , jsonModule instMod)+ , ("is_sig" , jsonBool instIsSig)+ , ("info" , jsonHaddockModInfo instInfo)+ , ("doc_map" , jsonMap nameStableString jsonMDoc instDocMap)+ , ("arg_map" , jsonMap nameStableString (jsonMap show jsonMDoc) instArgMap)+ , ("exports" , jsonArray (map jsonName instExports))+ , ("visible_exports" , jsonArray (map jsonName instVisibleExports))+ , ("options" , jsonArray (map (jsonString . show) instOptions))+ , ("fix_map" , jsonMap nameStableString jsonFixity instFixMap)+ ]++jsonHaddockModInfo :: HaddockModInfo Name -> JsonDoc+jsonHaddockModInfo HaddockModInfo{..} =+ jsonObject [ ("description" , jsonMaybe jsonDoc hmi_description)+ , ("copyright" , jsonMaybe jsonString hmi_copyright)+ , ("maintainer" , jsonMaybe jsonString hmi_maintainer)+ , ("stability" , jsonMaybe jsonString hmi_stability)+ , ("protability" , jsonMaybe jsonString hmi_portability)+ , ("safety" , jsonMaybe jsonString hmi_safety)+ , ("language" , jsonMaybe (jsonString . show) hmi_language)+ , ("extensions" , jsonArray (map (jsonString . show) hmi_extensions))+ ]++jsonMap :: (a -> String) -> (b -> JsonDoc) -> Map a b -> JsonDoc+jsonMap f g = jsonObject . map (f *** g) . Map.toList++jsonMDoc :: MDoc Name -> JsonDoc+jsonMDoc MetaDoc{..} =+ jsonObject [ ("meta", jsonObject [("version", jsonMaybe (jsonString . show) (_version _meta))])+ , ("document", jsonDoc _doc)+ ]++showModName :: Wrap (ModuleName, OccName) -> String+showModName = showWrapped (moduleNameString . fst)++showName :: Wrap Name -> String+showName = showWrapped nameStableString+++jsonDoc :: Doc Name -> JsonDoc++jsonDoc DocEmpty = jsonObject+ [ ("tag", jsonString "DocEmpty") ]++jsonDoc (DocAppend x y) = jsonObject+ [ ("tag", jsonString "DocAppend")+ , ("first", jsonDoc x)+ , ("second", jsonDoc y)+ ]++jsonDoc (DocString s) = jsonObject+ [ ("tag", jsonString "DocString")+ , ("string", jsonString s)+ ]++jsonDoc (DocParagraph x) = jsonObject+ [ ("tag", jsonString "DocParagraph")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocIdentifier name) = jsonObject+ [ ("tag", jsonString "DocIdentifier")+ , ("name", jsonString (showName name))+ ]++jsonDoc (DocIdentifierUnchecked modName) = jsonObject+ [ ("tag", jsonString "DocIdentifierUnchecked")+ , ("modName", jsonString (showModName modName))+ ]++jsonDoc (DocModule (ModLink m _l)) = jsonObject+ [ ("tag", jsonString "DocModule")+ , ("string", jsonString m)+ ]++jsonDoc (DocWarning x) = jsonObject+ [ ("tag", jsonString "DocWarning")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocEmphasis x) = jsonObject+ [ ("tag", jsonString "DocEmphasis")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocMonospaced x) = jsonObject+ [ ("tag", jsonString "DocMonospaced")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocBold x) = jsonObject+ [ ("tag", jsonString "DocBold")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocUnorderedList xs) = jsonObject+ [ ("tag", jsonString "DocUnorderedList")+ , ("documents", jsonArray (fmap jsonDoc xs))+ ]++jsonDoc (DocOrderedList xs) = jsonObject+ [ ("tag", jsonString "DocOrderedList")+ , ("items", jsonArray (fmap jsonItem xs))+ ]+ where+ jsonItem (index, a) = jsonObject [("document", jsonDoc a), ("seq", jsonInt index)]++jsonDoc (DocDefList xys) = jsonObject+ [ ("tag", jsonString "DocDefList")+ , ("definitions", jsonArray (fmap jsonDef xys))+ ]+ where+ jsonDef (x, y) = jsonObject [("document", jsonDoc x), ("y", jsonDoc y)]++jsonDoc (DocCodeBlock x) = jsonObject+ [ ("tag", jsonString "DocCodeBlock")+ , ("document", jsonDoc x)+ ]++jsonDoc (DocHyperlink hyperlink) = jsonObject+ [ ("tag", jsonString "DocHyperlink")+ , ("hyperlink", jsonHyperlink hyperlink)+ ]+ where+ jsonHyperlink Hyperlink{..} = jsonObject+ [ ("hyperlinkUrl", jsonString hyperlinkUrl)+ , ("hyperlinkLabel", jsonMaybe jsonDoc hyperlinkLabel)+ ]++jsonDoc (DocPic picture) = jsonObject+ [ ("tag", jsonString "DocPic")+ , ("picture", jsonPicture picture)+ ]+ where+ jsonPicture Picture{..} = jsonObject+ [ ("pictureUrl", jsonString pictureUri)+ , ("pictureLabel", jsonMaybe jsonString pictureTitle)+ ]++jsonDoc (DocMathInline s) = jsonObject+ [ ("tag", jsonString "DocMathInline")+ , ("string", jsonString s)+ ]++jsonDoc (DocMathDisplay s) = jsonObject+ [ ("tag", jsonString "DocMathDisplay")+ , ("string", jsonString s)+ ]++jsonDoc (DocAName s) = jsonObject+ [ ("tag", jsonString "DocAName")+ , ("string", jsonString s)+ ]++jsonDoc (DocProperty s) = jsonObject+ [ ("tag", jsonString "DocProperty")+ , ("string", jsonString s)+ ]++jsonDoc (DocExamples examples) = jsonObject+ [ ("tag", jsonString "DocExamples")+ , ("examples", jsonArray (fmap jsonExample examples))+ ]+ where+ jsonExample Example{..} = jsonObject+ [ ("exampleExpression", jsonString exampleExpression)+ , ("exampleResult", jsonArray (fmap jsonString exampleResult))+ ]++jsonDoc (DocHeader header) = jsonObject+ [ ("tag", jsonString "DocHeader")+ , ("header", jsonHeader header)+ ]+ where+ jsonHeader Header{..} = jsonObject+ [ ("headerLevel", jsonInt headerLevel)+ , ("headerTitle", jsonDoc headerTitle)+ ]++jsonDoc (DocTable table) = jsonObject+ [ ("tag", jsonString "DocTable")+ , ("table", jsonTable table)+ ]+ where+ jsonTable Table{..} = jsonObject+ [ ("tableHeaderRows", jsonArray (fmap jsonTableRow tableHeaderRows))+ , ("tableBodyRows", jsonArray (fmap jsonTableRow tableBodyRows))+ ]++ jsonTableRow TableRow{..} = jsonArray (fmap jsonTableCell tableRowCells)++ jsonTableCell TableCell{..} = jsonObject+ [ ("tableCellColspan", jsonInt tableCellColspan)+ , ("tableCellRowspan", jsonInt tableCellRowspan)+ , ("tableCellContents", jsonDoc tableCellContents)+ ]+++jsonModule :: Module -> JsonDoc+jsonModule = JSString . moduleStableString++jsonName :: Name -> JsonDoc+jsonName = JSString . nameStableString++jsonFixity :: Fixity -> JsonDoc+jsonFixity (Fixity _ prec dir) =+ jsonObject [ ("prec" , jsonInt prec)+ , ("direction" , jsonFixityDirection dir)+ ]++jsonFixityDirection :: FixityDirection -> JsonDoc+jsonFixityDirection InfixL = jsonString "infixl"+jsonFixityDirection InfixR = jsonString "infixr"+jsonFixityDirection InfixN = jsonString "infix"++renderJson :: JsonDoc -> SDoc+renderJson = renderJSON++jsonMaybe :: (a -> JsonDoc) -> Maybe a -> JsonDoc+jsonMaybe = maybe jsonNull++jsonString :: String -> JsonDoc+jsonString = JSString++jsonObject :: [(String, JsonDoc)] -> JsonDoc+jsonObject = JSObject++jsonArray :: [JsonDoc] -> JsonDoc+jsonArray = JSArray++jsonNull :: JsonDoc+jsonNull = JSNull++jsonInt :: Int -> JsonDoc+jsonInt = JSInt++jsonBool :: Bool -> JsonDoc+jsonBool = JSBool
@@ -0,0 +1,312 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -Wwarn #-}+ -----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface.LexParseRn+-- Copyright : (c) Isaac Dupree 2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Interface.LexParseRn+ ( processDocString+ , processDocStringFromString+ , processDocStringParas+ , processDocStrings+ , processModuleHeader+ ) where++import Control.Arrow+import Control.Monad+import Control.Monad.State.Strict+import Data.Functor+import Data.List ((\\), maximumBy)+import Data.Ord+import qualified Data.Set as Set+import Documentation.Haddock.Doc (metaDocConcat)+import GHC.Driver.Session (languageExtensions)+import qualified GHC.LanguageExtensions as LangExt+import GHC+import Haddock.Interface.ParseModuleHeader+import Haddock.Parser+import Haddock.Types+import GHC.Data.EnumSet as EnumSet+import GHC.Driver.Ppr ( showPpr, showSDoc )+import GHC.Parser.PostProcess+import GHC.Types.Name+import GHC.Types.Avail ( availName )+import GHC.Types.Name.Reader+import GHC.Utils.Outputable (Outputable)++processDocStrings+ :: MonadIO m+ => DynFlags+ -> Maybe Package+ -> GlobalRdrEnv+ -> [HsDocString]+ -> IfM m (Maybe (MDoc Name))+processDocStrings dflags pkg gre strs = do+ mdoc <- metaDocConcat <$> traverse (processDocStringParas dflags pkg gre) strs+ case mdoc of+ -- We check that we don't have any version info to render instead+ -- of just checking if there is no comment: there may not be a+ -- comment but we still want to pass through any meta data.+ MetaDoc { _meta = Meta Nothing Nothing, _doc = DocEmpty } -> pure Nothing+ x -> pure (Just x)++processDocStringParas+ :: MonadIO m+ => DynFlags+ -> Maybe Package+ -> GlobalRdrEnv+ -> HsDocString+ -> IfM m (MDoc Name)+processDocStringParas dflags pkg gre hds =+ overDocF (rename dflags gre) (parseParas dflags pkg (renderHsDocString hds))++processDocString+ :: MonadIO m+ => DynFlags+ -> GlobalRdrEnv+ -> HsDocString+ -> IfM m (Doc Name)+processDocString dflags gre hds =+ processDocStringFromString dflags gre (renderHsDocString hds)++processDocStringFromString+ :: MonadIO m+ => DynFlags+ -> GlobalRdrEnv+ -> String+ -> IfM m (Doc Name)+processDocStringFromString dflags gre hds =+ rename dflags gre (parseString dflags hds)++processModuleHeader+ :: MonadIO m+ => DynFlags+ -> Maybe Package+ -> GlobalRdrEnv+ -> SafeHaskellMode+ -> Maybe HsDocString+ -> IfM m (HaddockModInfo Name, Maybe (MDoc Name))+processModuleHeader dflags pkgName gre safety mayStr = do+ (hmi, doc) <-+ case mayStr of+ Nothing -> return failure+ Just hds -> do+ let str = renderHsDocString hds+ (hmi, doc) = parseModuleHeader dflags pkgName str+ !descr <- case hmi_description hmi of+ Just hmi_descr -> Just <$> rename dflags gre hmi_descr+ Nothing -> pure Nothing+ let hmi' = hmi { hmi_description = descr }+ doc' <- overDocF (rename dflags gre) doc+ return (hmi', Just doc')++ let flags :: [LangExt.Extension]+ -- We remove the flags implied by the language setting and we display the language instead+ flags = EnumSet.toList (extensionFlags dflags) \\ languageExtensions (language dflags)+ return+ (hmi { hmi_safety = Just $ showPpr dflags safety+ , hmi_language = language dflags+ , hmi_extensions = flags+ }+ , doc+ )+ where+ failure = (emptyHaddockModInfo, Nothing)++traverseSnd :: (Traversable t, Applicative f) => (a -> f b) -> t (x, a) -> f (t (x, b))+traverseSnd f = traverse (\(x, a) ->+ (\b -> (x, b)) <$> f a)++-- | Takes a 'GlobalRdrEnv' which (hopefully) contains all the+-- definitions and a parsed comment and we attempt to make sense of+-- where the identifiers in the comment point to. We're in effect+-- trying to convert 'RdrName's to 'Name's, with some guesswork and+-- fallbacks in case we can't locate the identifiers.+--+-- See the comments in the source for implementation commentary.+rename+ :: MonadIO m+ => DynFlags+ -> GlobalRdrEnv+ -> Doc NsRdrName+ -> IfM m (Doc Name)+rename dflags gre = rn+ where+ rn :: MonadIO m => Doc NsRdrName -> IfM m (Doc Name)+ rn d = case d of+ DocAppend a b -> DocAppend <$> rn a <*> rn b+ DocParagraph p -> DocParagraph <$> rn p+ DocIdentifier i -> do+ let NsRdrName ns x = unwrap i+ occ = rdrNameOcc x+ isValueName = isDataOcc occ || isVarOcc occ++ let valueNsChoices | isValueName = [x]+ | otherwise = [] -- is this ever possible?+ typeNsChoices | isValueName = [setRdrNameSpace x tcName]+ | otherwise = [x]++ -- Generate the choices for the possible kind of thing this+ -- is. We narrow down the possibilities with the namespace (if+ -- there is one).+ let choices = case ns of+ Value -> valueNsChoices+ Type -> typeNsChoices+ None -> valueNsChoices ++ typeNsChoices++ -- Lookup any GlobalRdrElts that match the choices.+ case concatMap (\c -> lookupGRE_RdrName c gre) choices of+ -- We found no names in the env so we start guessing.+ [] ->+ case choices of+ -- The only way this can happen is if a value namespace was+ -- specified on something that cannot be a value.+ [] -> invalidValue dflags i++ -- There was nothing in the environment so we need to+ -- pick some default from what's available to us. We+ -- diverge here from the old way where we would default+ -- to type constructors as we're much more likely to+ -- actually want anchors to regular definitions than+ -- type constructor names (such as in #253). So now we+ -- only get type constructor links if they are actually+ -- in scope.+ a:_ -> outOfScope dflags ns (i $> a)++ -- There is only one name in the environment that matches so+ -- use it.+ [a] -> pure $ DocIdentifier (i $> greMangledName a)++ -- There are multiple names available.+ gres -> ambiguous dflags i gres++ DocWarning dw -> DocWarning <$> rn dw+ DocEmphasis de -> DocEmphasis <$> rn de+ DocBold db -> DocBold <$> rn db+ DocMonospaced dm -> DocMonospaced <$> rn dm+ DocUnorderedList docs -> DocUnorderedList <$> traverse rn docs+ DocOrderedList docs -> DocOrderedList <$> traverseSnd rn docs+ DocDefList list -> DocDefList <$> traverse (\(a, b) -> (,) <$> rn a <*> rn b) list+ DocCodeBlock dcb -> DocCodeBlock <$> rn dcb+ DocIdentifierUnchecked x -> pure (DocIdentifierUnchecked x)+ DocModule (ModLink m l) -> DocModule . ModLink m <$> traverse rn l+ DocHyperlink (Hyperlink u l) -> DocHyperlink . Hyperlink u <$> traverse rn l+ DocPic str -> pure (DocPic str)+ DocMathInline str -> pure (DocMathInline str)+ DocMathDisplay str -> pure (DocMathDisplay str)+ DocAName str -> pure (DocAName str)+ DocProperty p -> pure (DocProperty p)+ DocExamples e -> pure (DocExamples e)+ DocEmpty -> pure (DocEmpty)+ DocString str -> pure (DocString str)+ DocHeader (Header l t) -> DocHeader . Header l <$> rn t+ DocTable t -> DocTable <$> traverse rn t++-- | Wrap an identifier that's out of scope (i.e. wasn't found in+-- 'GlobalReaderEnv' during 'rename') in an appropriate doc. Currently+-- we simply monospace the identifier in most cases except when the+-- identifier is qualified: if the identifier is qualified then we can+-- still try to guess and generate anchors across modules but the+-- users shouldn't rely on this doing the right thing. See tickets+-- #253 and #375 on the confusion this causes depending on which+-- default we pick in 'rename'.+outOfScope :: MonadIO m => DynFlags -> Namespace -> Wrap RdrName -> IfM m (Doc a)+outOfScope dflags ns x =+ case unwrap x of+ Unqual occ -> warnAndMonospace (x $> occ)+ Qual mdl occ -> pure (DocIdentifierUnchecked (x $> (mdl, occ)))+ Orig _ occ -> warnAndMonospace (x $> occ)+ Exact name -> warnAndMonospace (x $> name) -- Shouldn't happen since x is out of scope+ where+ prefix =+ case ns of+ Value -> "the value "+ Type -> "the type "+ None -> ""++ warnAndMonospace :: (MonadIO m, Outputable a) => Wrap a -> IfM m (DocH mod id)+ warnAndMonospace a = do+ let a' = showWrapped (showPpr dflags) a++ -- If we have already warned for this identifier, don't warn again+ firstWarn <- Set.notMember a' <$> gets ifeOutOfScopeNames+ when firstWarn $ do+ warn $+ "Warning: " ++ prefix ++ "'" ++ a' ++ "' is out of scope.\n" +++ " If you qualify the identifier, haddock can try to link it anyway."+ modify' (\env -> env { ifeOutOfScopeNames = Set.insert a' (ifeOutOfScopeNames env) })++ pure (monospaced a')+ monospaced = DocMonospaced . DocString++-- | Handle ambiguous identifiers.+--+-- Prefers local names primarily and type constructors or class names secondarily.+--+-- Emits a warning if the 'GlobalRdrElts's don't belong to the same type or class.+ambiguous+ :: MonadIO m+ => DynFlags+ -> Wrap NsRdrName+ -> [GlobalRdrElt] -- ^ More than one @gre@s sharing the same `RdrName` above.+ -> IfM m (Doc Name)+ambiguous dflags x gres = do+ let noChildren = map availName (gresToAvailInfo gres)+ dflt = maximumBy (comparing (isLocalName &&& isTyConName)) noChildren+ nameStr = showNsRdrName dflags x+ msg = "Warning: " ++ nameStr ++ " is ambiguous. It is defined\n" +++ concatMap (\n -> " * " ++ defnLoc n ++ "\n") (map greMangledName gres) +++ " You may be able to disambiguate the identifier by qualifying it or\n" +++ " by specifying the type/value namespace explicitly.\n" +++ " Defaulting to the one defined " ++ defnLoc dflt++ -- TODO: Once we have a syntax for namespace qualification (#667) we may also+ -- want to emit a warning when an identifier is a data constructor for a type+ -- of the same name, but not the only constructor.+ -- For example, for @data D = C | D@, someone may want to reference the @D@+ -- constructor.++ -- If we have already warned for this name, do not warn again+ firstWarn <- Set.notMember nameStr <$> gets ifeAmbiguousNames+ when (length noChildren > 1 && firstWarn) $ do+ warn msg+ modify' (\env -> env { ifeAmbiguousNames = Set.insert nameStr (ifeAmbiguousNames env) })++ pure (DocIdentifier (x $> dflt))+ where+ isLocalName (nameSrcLoc -> RealSrcLoc {}) = True+ isLocalName _ = False+ defnLoc = showSDoc dflags . pprNameDefnLoc++-- | Handle value-namespaced names that cannot be for values.+--+-- Emits a warning that the value-namespace is invalid on a non-value identifier.+invalidValue :: MonadIO m => DynFlags -> Wrap NsRdrName -> IfM m (Doc a)+invalidValue dflags x = do+ let nameStr = showNsRdrName dflags x++ -- If we have already warned for this name, do not warn again+ firstWarn <- Set.notMember nameStr <$> gets ifeInvalidValues+ when firstWarn $ do+ warn $+ "Warning: " ++ nameStr ++ " cannot be value, yet it is\n" +++ " namespaced as such. Did you mean to specify a type namespace\n" +++ " instead?"+ modify' (\env -> env { ifeInvalidValues = Set.insert nameStr (ifeInvalidValues env) })+ pure (DocMonospaced (DocString (showNsRdrName dflags x)))++-- | Printable representation of a wrapped and namespaced name+showNsRdrName :: DynFlags -> Wrap NsRdrName -> String+showNsRdrName dflags = (\p i -> p ++ "'" ++ i ++ "'") <$> prefix <*> ident+ where+ ident = showWrapped (showPpr dflags . rdrName)+ prefix = renderNs . namespace . unwrap
@@ -0,0 +1,189 @@+{-# OPTIONS_GHC -Wwarn #-}+{-# LANGUAGE DeriveFunctor #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface.ParseModuleHeader+-- Copyright : (c) Simon Marlow 2006, Isaac Dupree 2009+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Interface.ParseModuleHeader (parseModuleHeader) where++import Control.Applicative (Alternative (..))+import Control.Monad (ap)+import Data.Char+import GHC.Driver.Session+import Haddock.Parser+import Haddock.Types++-- -----------------------------------------------------------------------------+-- Parsing module headers++-- NB. The headers must be given in the order Module, Description,+-- Copyright, License, Maintainer, Stability, Portability, except that+-- any or all may be omitted.+parseModuleHeader :: DynFlags -> Maybe Package -> String -> (HaddockModInfo NsRdrName, MDoc NsRdrName)+parseModuleHeader dflags pkgName str0 =+ let+ kvs :: [(String, String)]+ str1 :: String++ (kvs, str1) = maybe ([], str0) id $ runP fields str0++ -- trim whitespaces+ trim :: String -> String+ trim = dropWhile isSpace . reverse . dropWhile isSpace . reverse++ getKey :: String -> Maybe String+ getKey key = fmap trim (lookup key kvs)++ descriptionOpt = getKey "Description"+ copyrightOpt = getKey "Copyright"+ licenseOpt = getKey "License"+ licenceOpt = getKey "Licence"+ spdxLicenceOpt = getKey "SPDX-License-Identifier"+ maintainerOpt = getKey "Maintainer"+ stabilityOpt = getKey "Stability"+ portabilityOpt = getKey "Portability"++ in (HaddockModInfo {+ hmi_description = parseString dflags <$> descriptionOpt,+ hmi_copyright = copyrightOpt,+ hmi_license = spdxLicenceOpt <|> licenseOpt <|> licenceOpt,+ hmi_maintainer = maintainerOpt,+ hmi_stability = stabilityOpt,+ hmi_portability = portabilityOpt,+ hmi_safety = Nothing,+ hmi_language = Nothing, -- set in LexParseRn+ hmi_extensions = [] -- also set in LexParseRn+ }, parseParas dflags pkgName str1)++-------------------------------------------------------------------------------+-- Small parser to parse module header.+-------------------------------------------------------------------------------++-- | The below is a small parser framework how we read keys.+--+-- all fields in the header are optional and have the form+--+-- [spaces1][field name][spaces] ":"+-- [text]"\n" ([spaces2][space][text]"\n" | [spaces]"\n")*+-- where each [spaces2] should have [spaces1] as a prefix.+--+-- Thus for the key "Description",+--+-- > Description : this is a+-- > rather long+-- >+-- > description+-- >+-- > The module comment starts here+--+-- the value will be "this is a .. description" and the rest will begin+-- at "The module comment".++-- | 'C' is a 'Char' carrying its column.+--+-- This let us make an indentation-aware parser, as we know current indentation.+-- by looking at the next character in the stream ('curInd').+--+-- Thus we can munch all spaces but only not-spaces which are indented.+--+data C = C {-# UNPACK #-} !Int Char++newtype P a = P { unP :: [C] -> Maybe ([C], a) }+ deriving Functor++instance Applicative P where+ pure x = P $ \s -> Just (s, x)+ (<*>) = ap++instance Monad P where+ return = pure+ m >>= k = P $ \s0 -> do+ (s1, x) <- unP m s0+ unP (k x) s1++instance Alternative P where+ empty = P $ \_ -> Nothing+ a <|> b = P $ \s -> unP a s <|> unP b s++runP :: P a -> String -> Maybe a+runP p input = fmap snd (unP p input')+ where+ input' = concat+ [ zipWith C [0..] l ++ [C (length l) '\n']+ | l <- lines input+ ]++-------------------------------------------------------------------------------+--+-------------------------------------------------------------------------------++curInd :: P Int+curInd = P $ \s -> Just . (,) s $ case s of+ [] -> 0+ C i _ : _ -> i++rest :: P String+rest = P $ \cs -> Just ([], [ c | C _ c <- cs ])++munch :: (Int -> Char -> Bool) -> P String+munch p = P $ \cs ->+ let (xs,ys) = takeWhileMaybe p' cs in Just (ys, xs)+ where+ p' (C i c)+ | p i c = Just c+ | otherwise = Nothing++munch1 :: (Int -> Char -> Bool) -> P String+munch1 p = P $ \s -> case s of+ [] -> Nothing+ (c:cs) | Just c' <- p' c -> let (xs,ys) = takeWhileMaybe p' cs in Just (ys, c' : xs)+ | otherwise -> Nothing+ where+ p' (C i c)+ | p i c = Just c+ | otherwise = Nothing++char :: Char -> P Char+char c = P $ \s -> case s of+ [] -> Nothing+ (C _ c' : cs) | c == c' -> Just (cs, c)+ | otherwise -> Nothing++skipSpaces :: P ()+skipSpaces = P $ \cs -> Just (dropWhile (\(C _ c) -> isSpace c) cs, ())++takeWhileMaybe :: (a -> Maybe b) -> [a] -> ([b], [a])+takeWhileMaybe f = go where+ go xs0@[] = ([], xs0)+ go xs0@(x:xs) = case f x of+ Just y -> let (ys, zs) = go xs in (y : ys, zs)+ Nothing -> ([], xs0)++-------------------------------------------------------------------------------+-- Fields+-------------------------------------------------------------------------------++field :: Int -> P (String, String)+field i = do+ fn <- munch1 $ \_ c -> isAlpha c || c == '-'+ skipSpaces+ _ <- char ':'+ skipSpaces+ val <- munch $ \j c -> isSpace c || j > i+ return (fn, val)++fields :: P ([(String, String)], String)+fields = do+ skipSpaces+ i <- curInd+ fs <- many (field i)+ r <- rest+ return (fs, r)+
@@ -0,0 +1,819 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++----------------------------------------------------------------------------+-- |+-- Module : Haddock.Interface.Rename+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Interface.Rename (renameInterface) where+++import Data.Traversable (mapM)++import Haddock.Backends.Hoogle (ppExportD)+import Haddock.GhcUtils+import Haddock.Types++import GHC.Data.Bag (emptyBag)+import GHC hiding (NoLink)+import GHC.Types.Name+import GHC.Types.Name.Reader (RdrName(Exact))+import GHC.Builtin.Types (eqTyCon_RDR)++import Control.Applicative+import Control.DeepSeq (force)+import Control.Monad hiding (mapM)+import Control.Monad.Reader+import Control.Monad.Writer.CPS+import Data.Foldable (traverse_)+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set+import Prelude hiding (mapM)+import GHC.Types.Basic ( TopLevelFlag(..) )++-- | Traverse docstrings and ASTs in the Haddock interface, renaming 'Name' to+-- 'DocName'.+--+-- What this really boils down to is: for each 'Name', figure out which of the+-- modules that export the name is the preferred place to link to.+--+-- The renamed output gets written into fields in the Haddock interface record+-- that were previously left empty.+renameInterface+ :: DynFlags+ -- ^ GHC session dyn flags+ -> Map.Map (Maybe String) (Set.Set String)+ -- ^ Ignored symbols. A map from module names to unqualified names. Module+ -- 'Just M' mapping to name 'f' means that link warnings should not be+ -- generated for occurances of specifically 'M.f'. Module 'Nothing' mapping to+ -- name 'f' means that link warnings should not be generated for any 'f'.+ -> LinkEnv+ -- ^ Link environment. A map from 'Name' to 'Module', where name 'n' maps to+ -- module 'M' if 'M' is the preferred link destination for name 'n'.+ -> Bool+ -- ^ Are warnings enabled?+ -> Bool+ -- ^ Is Hoogle output enabled?+ -> Interface+ -- ^ The interface we are renaming.+ -> Ghc Interface+ -- ^ The renamed interface. Note that there is nothing really special about+ -- this being in the 'Ghc' monad. This could very easily be any 'MonadIO' or+ -- even pure, depending on the link warnings are reported.+renameInterface dflags ignoreSet renamingEnv warnings hoogle iface = do+ let (iface', warnedNames) =+ runRnM+ dflags+ mdl+ localLinkEnv+ warnName+ (hoogle && not (OptHide `elem` ifaceOptions iface))+ (renameInterfaceRn iface)+ reportMissingLinks mdl warnedNames+ return iface'+ where+ -- The current module+ mdl :: Module+ mdl = ifaceMod iface++ -- The local link environment, where every name exported by this module is+ -- mapped to the module itself, and everything else comes from the global+ -- renaming env+ localLinkEnv :: LinkEnv+ localLinkEnv = foldr f renamingEnv (ifaceVisibleExports iface)+ where f name !env = Map.insert name mdl env++ -- The function used to determine whether we should warn about a name+ -- which we do not find in the renaming environment+ warnName name =+ -- Warnings must be enabled+ warnings++ -- Current module must not be hidden from Haddock+ && not (OptHide `elem` ifaceOptions iface)++ -- Must be an external name that is not built-in syntax, not a type+ -- variable, and not '~'+ && isExternalName name+ && not (isBuiltInSyntax name)+ && not (isTyVarName name)+ && Exact name /= eqTyCon_RDR++ -- Must not be in the set of ignored symbols for the module or the+ -- unqualified ignored symbols+ && not (getOccString name `Set.member` ignoreSet')+ where+ -- The set of ignored symbols within the module this name is located+ -- in unioned with the set of globally ignored symbols+ ignoreSet' :: Set.Set String+ ignoreSet' =+ Set.union+ (Map.findWithDefault Set.empty (Just $ modString name) ignoreSet)+ (Map.findWithDefault Set.empty Nothing ignoreSet)++ modString :: Name -> String+ modString = moduleString . nameModule++-- | Output warning messages indicating that the renamer could not find link+-- destinations for the names in the given set as they occur in the given+-- module.+reportMissingLinks :: Module -> Set.Set Name -> Ghc ()+reportMissingLinks mdl names+ | Set.null names = return ()+ | otherwise =+ liftIO $ do+ putStrLn $ "Warning: " ++ moduleString mdl ++ ": could not find link destinations for: "+ traverse_ (putStrLn . ("\t- " ++) . qualifiedName) names+ where+ qualifiedName :: Name -> String+ qualifiedName name = moduleString (nameModule name) ++ "." ++ getOccString name++--------------------------------------------------------------------------------+-- Monad for renaming+--------------------------------------------------------------------------------++-- | A renaming monad which provides 'MonadReader' access to a renaming+-- environment, and 'MonadWriter' access to a 'Set' of names for which link+-- warnings should be generated, based on the renaming environment.+newtype RnM a = RnM { unRnM :: ReaderT RnMEnv (Writer (Set.Set Name)) a }+ deriving newtype (Functor, Applicative, Monad, MonadReader RnMEnv, MonadWriter (Set.Set Name))++-- | The renaming monad environment. Stores the linking environment (mapping+-- names to modules), the link warning predicate, and the current module.+data RnMEnv = RnMEnv+ { -- | The linking environment (map from names to modules)+ rnLinkEnv :: LinkEnv++ -- | Link warning predicate (whether failing to find a link destination+ -- for a given name should result in a warning)+ , rnWarnName :: (Name -> Bool)++ -- | The current module+ , rnModuleString :: String++ -- | Should Hoogle output be generated for this module?+ , rnHoogleOutput :: Bool++ -- | GHC Session DynFlags, necessary for Hoogle output generation+ , rnDynFlags :: DynFlags+ }++-- | Run the renamer action in a renaming environment built using the given+-- module, link env, and link warning predicate. Returns the renamed value along+-- with a set of 'Name's that were not renamed and should be warned for (i.e.+-- they satisfied the link warning predicate).+runRnM :: DynFlags -> Module -> LinkEnv -> (Name -> Bool) -> Bool -> RnM a -> (a, Set.Set Name)+runRnM dflags mdl linkEnv warnName hoogleOutput rn =+ runWriter $ runReaderT (unRnM rn) rnEnv+ where+ rnEnv :: RnMEnv+ rnEnv = RnMEnv+ { rnLinkEnv = linkEnv+ , rnWarnName = warnName+ , rnModuleString = moduleString mdl+ , rnHoogleOutput = hoogleOutput+ , rnDynFlags = dflags+ }++--------------------------------------------------------------------------------+-- Renaming+--------------------------------------------------------------------------------++-- | Rename an `Interface` in the renaming environment.+renameInterfaceRn :: Interface -> RnM Interface+renameInterfaceRn iface = do+ exportItems <- renameExportItems (ifaceExportItems iface)+ orphans <- mapM renameDocInstance (ifaceOrphanInstances iface)+ finalModDoc <- renameDocumentation (ifaceDoc iface)+ pure $! iface+ { ifaceRnDoc = finalModDoc++ -- The un-renamed export items are not used after renaming+ , ifaceRnExportItems = exportItems+ , ifaceExportItems = []++ -- The un-renamed orphan instances are not used after renaming+ , ifaceRnOrphanInstances = orphans+ , ifaceOrphanInstances = []+ }++-- | Lookup a 'Name' in the renaming environment.+lookupRn :: Name -> RnM DocName+lookupRn name = RnM $ do+ linkEnv <- asks rnLinkEnv+ case Map.lookup name linkEnv of+ Nothing -> return $ Undocumented name+ Just mdl -> return $ Documented name mdl++-- | Rename a 'Name' in the renaming environment. This is very similar to+-- 'lookupRn', but tracks any names not found in the renaming environment if the+-- `rnWarnName` predicate is true.+renameName :: Name -> RnM DocName+renameName name = do+ warnName <- asks rnWarnName+ docName <- lookupRn name+ case docName of+ Undocumented _ -> do+ when (warnName name) $+ tell $ Set.singleton name+ return docName+ _ -> return docName++-- | Rename a located 'Name' in the current renaming environment.+renameNameL :: GenLocated l Name -> RnM (GenLocated l DocName)+renameNameL = mapM renameName++-- | Rename a list of export items in the current renaming environment.+renameExportItems :: [ExportItem GhcRn] -> RnM [ExportItem DocNameI]+renameExportItems = mapM renameExportItem++-- | Rename an 'ExportItem' in the current renaming environment.+renameExportItem :: ExportItem GhcRn -> RnM (ExportItem DocNameI)+renameExportItem item = case item of+ ExportModule mdl -> return (ExportModule mdl)+ ExportGroup lev id_ doc -> do+ doc' <- renameDoc doc+ return (ExportGroup lev id_ doc')+ ExportDecl ed@(ExportD decl pats doc subs instances fixities splice) -> do+ -- If Hoogle output should be generated, generate it+ RnMEnv{..} <- ask+ let !hoogleOut = force $+ if rnHoogleOutput then+ ppExportD rnDynFlags ed+ else+ []++ decl' <- renameLDecl decl+ pats' <- renamePats pats+ doc' <- renameDocForDecl doc+ subs' <- mapM renameSub subs+ instances' <- forM instances renameDocInstance+ fixities' <- forM fixities $ \(name, fixity) -> do+ name' <- lookupRn name+ return (name', fixity)++ return $+ ExportDecl RnExportD+ { rnExpDExpD = ExportD decl' pats' doc' subs' instances' fixities' splice+ , rnExpDHoogle = hoogleOut+ }+ ExportNoDecl x subs -> do+ x' <- lookupRn x+ subs' <- mapM lookupRn subs+ return (ExportNoDecl x' subs')+ ExportDoc doc -> do+ doc' <- renameDoc doc+ return (ExportDoc doc')++renameDocForDecl :: DocForDecl Name -> RnM (DocForDecl DocName)+renameDocForDecl (doc, fnArgsDoc) =+ (,) <$> renameDocumentation doc <*> renameFnArgsDoc fnArgsDoc++renameDocumentation :: Documentation Name -> RnM (Documentation DocName)+renameDocumentation (Documentation mDoc mWarning) =+ Documentation <$> mapM renameDoc mDoc <*> mapM renameDoc mWarning++renameLDocHsSyn :: Located (WithHsDocIdentifiers HsDocString a) -> RnM (Located (WithHsDocIdentifiers HsDocString b))+renameLDocHsSyn (L l doc) = return (L l (WithHsDocIdentifiers (hsDocString doc) []))++renameDoc :: Traversable t => t (Wrap Name) -> RnM (t (Wrap DocName))+renameDoc = traverse (traverse renameName)++renameFnArgsDoc :: FnArgsDoc Name -> RnM (FnArgsDoc DocName)+renameFnArgsDoc = mapM renameDoc++renameLType :: LHsType GhcRn -> RnM (LHsType DocNameI)+renameLType = mapM renameType++renameLTypeArg :: LHsTypeArg GhcRn -> RnM (LHsTypeArg DocNameI)+renameLTypeArg (HsValArg ty) = do { ty' <- renameLType ty+ ; return $ HsValArg ty' }+renameLTypeArg (HsTypeArg l ki) = do { ki' <- renameLKind ki+ ; return $ HsTypeArg l ki' }+renameLTypeArg (HsArgPar sp) = return $ HsArgPar sp++renameLSigType :: LHsSigType GhcRn -> RnM (LHsSigType DocNameI)+renameLSigType = mapM renameSigType++renameLSigWcType :: LHsSigWcType GhcRn -> RnM (LHsSigWcType DocNameI)+renameLSigWcType = renameWc renameLSigType++renameLKind :: LHsKind GhcRn -> RnM (LHsKind DocNameI)+renameLKind = renameLType++renameMaybeLKind :: Maybe (LHsKind GhcRn) -> RnM (Maybe (LHsKind DocNameI))+renameMaybeLKind = traverse renameLKind++renameFamilyResultSig :: LFamilyResultSig GhcRn -> RnM (LFamilyResultSig DocNameI)+renameFamilyResultSig (L loc (NoSig _))+ = return (L loc (NoSig noExtField))+renameFamilyResultSig (L loc (KindSig _ ki))+ = do { ki' <- renameLKind ki+ ; return (L loc (KindSig noExtField ki')) }+renameFamilyResultSig (L loc (TyVarSig _ bndr))+ = do { bndr' <- renameLTyVarBndr bndr+ ; return (L loc (TyVarSig noExtField bndr')) }++renameInjectivityAnn :: LInjectivityAnn GhcRn -> RnM (LInjectivityAnn DocNameI)+renameInjectivityAnn (L loc (InjectivityAnn _ lhs rhs))+ = do { lhs' <- renameNameL lhs+ ; rhs' <- mapM renameNameL rhs+ ; return (L loc (InjectivityAnn noExtField lhs' rhs')) }++renameMaybeInjectivityAnn :: Maybe (LInjectivityAnn GhcRn)+ -> RnM (Maybe (LInjectivityAnn DocNameI))+renameMaybeInjectivityAnn = traverse renameInjectivityAnn++renameArrow :: HsArrow GhcRn -> RnM (HsArrow DocNameI)+renameArrow (HsUnrestrictedArrow arr) = return (HsUnrestrictedArrow arr)+renameArrow (HsLinearArrow (HsPct1 pct1 arr)) = return (HsLinearArrow (HsPct1 pct1 arr))+renameArrow (HsLinearArrow (HsLolly arr)) = return (HsLinearArrow (HsLolly arr))+renameArrow (HsExplicitMult pct p arr) = (\p' -> HsExplicitMult pct p' arr) <$> renameLType p++renameType :: HsType GhcRn -> RnM (HsType DocNameI)+renameType t = case t of+ HsForAllTy { hst_tele = tele, hst_body = ltype } -> do+ tele' <- renameHsForAllTelescope tele+ ltype' <- renameLType ltype+ return (HsForAllTy { hst_xforall = noAnn+ , hst_tele = tele', hst_body = ltype' })++ HsQualTy { hst_ctxt = lcontext , hst_body = ltype } -> do+ lcontext' <- renameLContext lcontext+ ltype' <- renameLType ltype+ return (HsQualTy { hst_xqual = noAnn, hst_ctxt = lcontext', hst_body = ltype' })++ HsTyVar _ ip (L l n) -> return . HsTyVar noAnn ip . L l =<< renameName n+ HsBangTy _ b ltype -> return . HsBangTy noAnn b =<< renameLType ltype++ HsStarTy _ isUni -> return (HsStarTy noAnn isUni)++ HsAppTy _ a b -> do+ a' <- renameLType a+ b' <- renameLType b+ return (HsAppTy noAnn a' b')++ HsAppKindTy _ a b -> do+ a' <- renameLType a+ b' <- renameLKind b+ return (HsAppKindTy noAnn a' b')++ HsFunTy _ w a b -> do+ a' <- renameLType a+ b' <- renameLType b+ w' <- renameArrow w+ return (HsFunTy noAnn w' a' b')++ HsListTy _ ty -> return . (HsListTy noAnn) =<< renameLType ty+ HsIParamTy _ n ty -> liftM (HsIParamTy noAnn n) (renameLType ty)++ HsTupleTy _ b ts -> return . HsTupleTy noAnn b =<< mapM renameLType ts+ HsSumTy _ ts -> HsSumTy noAnn <$> mapM renameLType ts++ HsOpTy _ prom a (L loc op) b -> do+ op' <- renameName op+ a' <- renameLType a+ b' <- renameLType b+ return (HsOpTy noAnn prom a' (L loc op') b')++ HsParTy _ ty -> return . (HsParTy noAnn) =<< renameLType ty++ HsKindSig _ ty k -> do+ ty' <- renameLType ty+ k' <- renameLKind k+ return (HsKindSig noAnn ty' k')++ HsDocTy _ ty doc -> do+ ty' <- renameLType ty+ doc' <- renameLDocHsSyn doc+ return (HsDocTy noAnn ty' doc')++ HsTyLit _ x -> return (HsTyLit noAnn (renameTyLit x))++ HsRecTy _ a -> HsRecTy noAnn <$> mapM renameConDeclFieldField a+ XHsType a -> pure (XHsType a)+ HsExplicitListTy _ a b -> HsExplicitListTy noAnn a <$> mapM renameLType b+ HsExplicitTupleTy _ b -> HsExplicitTupleTy noAnn <$> mapM renameLType b+ HsSpliceTy (HsUntypedSpliceTop _ st) _ -> renameType (unLoc st)+ HsSpliceTy (HsUntypedSpliceNested _) _ -> error "renameType: not an top level type splice"+ HsWildCardTy _ -> pure (HsWildCardTy noAnn)++renameTyLit :: HsTyLit GhcRn -> HsTyLit DocNameI+renameTyLit t = case t of+ HsNumTy _ v -> HsNumTy noExtField v+ HsStrTy _ v -> HsStrTy noExtField v+ HsCharTy _ v -> HsCharTy noExtField v+++renameSigType :: HsSigType GhcRn -> RnM (HsSigType DocNameI)+renameSigType (HsSig { sig_bndrs = bndrs, sig_body = body }) = do+ bndrs' <- renameOuterTyVarBndrs bndrs+ body' <- renameLType body+ pure $ HsSig { sig_ext = noExtField, sig_bndrs = bndrs', sig_body = body' }++renameLHsQTyVars :: LHsQTyVars GhcRn -> RnM (LHsQTyVars DocNameI)+renameLHsQTyVars (HsQTvs { hsq_explicit = tvs })+ = do { tvs' <- mapM renameLTyVarBndr tvs+ ; return (HsQTvs { hsq_ext = noExtField+ , hsq_explicit = tvs' }) }++renameHsForAllTelescope :: HsForAllTelescope GhcRn -> RnM (HsForAllTelescope DocNameI)+renameHsForAllTelescope tele = case tele of+ HsForAllVis _ bndrs -> do bndrs' <- mapM renameLTyVarBndr bndrs+ pure $ HsForAllVis noExtField bndrs'+ HsForAllInvis _ bndrs -> do bndrs' <- mapM renameLTyVarBndr bndrs+ pure $ HsForAllInvis noExtField bndrs'++renameLTyVarBndr :: LHsTyVarBndr flag GhcRn -> RnM (LHsTyVarBndr flag DocNameI)+renameLTyVarBndr (L loc (UserTyVar _ fl (L l n)))+ = do { n' <- renameName n+ ; return (L loc (UserTyVar noExtField fl (L l n'))) }+renameLTyVarBndr (L loc (KindedTyVar _ fl (L lv n) kind))+ = do { n' <- renameName n+ ; kind' <- renameLKind kind+ ; return (L loc (KindedTyVar noExtField fl (L lv n') kind')) }++renameLContext :: LocatedC [LHsType GhcRn] -> RnM (LocatedC [LHsType DocNameI])+renameLContext (L loc context) = do+ context' <- mapM renameLType context+ return (L loc context')++renameInstHead :: InstHead GhcRn -> RnM (InstHead DocNameI)+renameInstHead InstHead {..} = do+ cname <- renameName ihdClsName+ types <- mapM renameType ihdTypes+ itype <- case ihdInstType of+ ClassInst { .. } -> ClassInst+ <$> mapM renameType clsiCtx+ <*> renameLHsQTyVars clsiTyVars+ <*> mapM renameSig clsiSigs+ <*> mapM renamePseudoFamilyDecl clsiAssocTys+ TypeInst ts -> TypeInst <$> traverse renameType ts+ DataInst dd -> DataInst <$> renameTyClD dd+ return InstHead+ { ihdClsName = cname+ , ihdTypes = types+ , ihdInstType = itype+ }++renameLDecl :: LHsDecl GhcRn -> RnM (LHsDecl DocNameI)+renameLDecl (L loc d) = return . L loc =<< renameDecl d++renamePats :: [(HsDecl GhcRn, DocForDecl Name)] -> RnM [(HsDecl DocNameI, DocForDecl DocName)]+renamePats = mapM+ (\(d,doc) -> do { d' <- renameDecl d+ ; doc' <- renameDocForDecl doc+ ; return (d',doc')})++renameDecl :: HsDecl GhcRn -> RnM (HsDecl DocNameI)+renameDecl decl = case decl of+ TyClD _ d -> do+ d' <- renameTyClD d+ return (TyClD noExtField d')+ SigD _ s -> do+ s' <- renameSig s+ return (SigD noExtField s')+ ForD _ d -> do+ d' <- renameForD d+ return (ForD noExtField d')+ InstD _ d -> do+ d' <- renameInstD d+ return (InstD noExtField d')+ DerivD _ d -> do+ d' <- renameDerivD d+ return (DerivD noExtField d')+ _ -> error "renameDecl"++renameLThing :: (a GhcRn -> RnM (a DocNameI)) -> LocatedAn an (a GhcRn) -> RnM (Located (a DocNameI))+renameLThing fn (L loc x) = return . L (locA loc) =<< fn x++renameTyClD :: TyClDecl GhcRn -> RnM (TyClDecl DocNameI)+renameTyClD d = case d of+-- TyFamily flav lname ltyvars kind tckind -> do+ FamDecl { tcdFam = decl } -> do+ decl' <- renameFamilyDecl decl+ return (FamDecl { tcdFExt = noExtField, tcdFam = decl' })++ SynDecl { tcdLName = lname, tcdTyVars = tyvars, tcdFixity = fixity, tcdRhs = rhs } -> do+ lname' <- renameNameL lname+ tyvars' <- renameLHsQTyVars tyvars+ rhs' <- renameLType rhs+ return (SynDecl { tcdSExt = noExtField, tcdLName = lname', tcdTyVars = tyvars'+ , tcdFixity = fixity, tcdRhs = rhs' })++ DataDecl { tcdLName = lname, tcdTyVars = tyvars, tcdFixity = fixity, tcdDataDefn = defn } -> do+ lname' <- renameNameL lname+ tyvars' <- renameLHsQTyVars tyvars+ defn' <- renameDataDefn defn+ return (DataDecl { tcdDExt = noExtField, tcdLName = lname', tcdTyVars = tyvars'+ , tcdFixity = fixity, tcdDataDefn = defn' })++ ClassDecl { tcdLayout = layout+ , tcdCtxt = lcontext, tcdLName = lname, tcdTyVars = ltyvars, tcdFixity = fixity+ , tcdFDs = lfundeps, tcdSigs = lsigs, tcdATs = ats, tcdATDefs = at_defs } -> do+ lcontext' <- traverse renameLContext lcontext+ lname' <- renameNameL lname+ ltyvars' <- renameLHsQTyVars ltyvars+ lfundeps' <- mapM renameLFunDep lfundeps+ lsigs' <- mapM renameLSig lsigs+ ats' <- mapM (renameLThing renameFamilyDecl) ats+ at_defs' <- mapM (mapM renameTyFamDefltD) at_defs+ -- we don't need the default methods or the already collected doc entities+ return (ClassDecl { tcdCExt = noExtField+ , tcdLayout = renameLayoutInfo layout+ , tcdCtxt = lcontext', tcdLName = lname', tcdTyVars = ltyvars'+ , tcdFixity = fixity+ , tcdFDs = lfundeps', tcdSigs = lsigs', tcdMeths= emptyBag+ , tcdATs = ats', tcdATDefs = at_defs', tcdDocs = [] })++ where+ renameLFunDep :: LHsFunDep GhcRn -> RnM (LHsFunDep DocNameI)+ renameLFunDep (L loc (FunDep _ xs ys)) = do+ xs' <- mapM renameName (map unLoc xs)+ ys' <- mapM renameName (map unLoc ys)+ return (L (locA loc) (FunDep noExtField (map noLocA xs') (map noLocA ys')))++ renameLSig (L loc sig) = return . L (locA loc) =<< renameSig sig++renameLayoutInfo :: LayoutInfo GhcRn -> LayoutInfo DocNameI+renameLayoutInfo (ExplicitBraces ob cb) = ExplicitBraces ob cb+renameLayoutInfo (VirtualBraces n) = VirtualBraces n+renameLayoutInfo NoLayoutInfo = NoLayoutInfo++renameFamilyDecl :: FamilyDecl GhcRn -> RnM (FamilyDecl DocNameI)+renameFamilyDecl (FamilyDecl { fdInfo = info, fdLName = lname+ , fdTyVars = ltyvars+ , fdFixity = fixity+ , fdResultSig = result+ , fdInjectivityAnn = injectivity }) = do+ info' <- renameFamilyInfo info+ lname' <- renameNameL lname+ ltyvars' <- renameLHsQTyVars ltyvars+ result' <- renameFamilyResultSig result+ injectivity' <- renameMaybeInjectivityAnn injectivity+ return (FamilyDecl { fdExt = noExtField, fdInfo = info', fdTopLevel = TopLevel+ , fdLName = lname'+ , fdTyVars = ltyvars'+ , fdFixity = fixity+ , fdResultSig = result'+ , fdInjectivityAnn = injectivity' })+++renamePseudoFamilyDecl :: PseudoFamilyDecl GhcRn+ -> RnM (PseudoFamilyDecl DocNameI)+renamePseudoFamilyDecl (PseudoFamilyDecl { .. }) = PseudoFamilyDecl+ <$> renameFamilyInfo pfdInfo+ <*> renameNameL pfdLName+ <*> mapM renameLType pfdTyVars+ <*> renameFamilyResultSig pfdKindSig+++renameFamilyInfo :: FamilyInfo GhcRn -> RnM (FamilyInfo DocNameI)+renameFamilyInfo DataFamily = return DataFamily+renameFamilyInfo OpenTypeFamily = return OpenTypeFamily+renameFamilyInfo (ClosedTypeFamily eqns)+ = do { eqns' <- mapM (mapM (mapM renameTyFamInstEqn)) eqns+ ; return $ ClosedTypeFamily eqns' }++renameDataDefn :: HsDataDefn GhcRn -> RnM (HsDataDefn DocNameI)+renameDataDefn (HsDataDefn { dd_ctxt = lcontext, dd_cType = cType+ , dd_kindSig = k, dd_cons = cons }) = do+ lcontext' <- traverse renameLContext lcontext+ k' <- renameMaybeLKind k+ cons' <- mapM (mapMA renameCon) cons+ -- I don't think we need the derivings, so we return Nothing+ return (HsDataDefn { dd_ext = noExtField+ , dd_ctxt = lcontext', dd_cType = cType+ , dd_kindSig = k', dd_cons = cons'+ , dd_derivs = [] })++renameCon :: ConDecl GhcRn -> RnM (ConDecl DocNameI)+renameCon decl@(ConDeclH98 { con_name = lname, con_ex_tvs = ltyvars+ , con_mb_cxt = lcontext, con_args = details+ , con_doc = mbldoc+ , con_forall = forall_ }) = do+ lname' <- renameNameL lname+ ltyvars' <- mapM renameLTyVarBndr ltyvars+ lcontext' <- traverse renameLContext lcontext+ details' <- renameH98Details details+ mbldoc' <- mapM (renameLDocHsSyn) mbldoc+ return (decl { con_ext = noExtField, con_name = lname', con_ex_tvs = ltyvars'+ , con_mb_cxt = lcontext'+ , con_forall = forall_ -- Remove when #18311 is fixed+ , con_args = details', con_doc = mbldoc' })++renameCon ConDeclGADT { con_names = lnames, con_bndrs = bndrs+ , con_dcolon = dcol+ , con_mb_cxt = lcontext, con_g_args = details+ , con_res_ty = res_ty+ , con_doc = mbldoc } = do+ lnames' <- mapM renameNameL lnames+ bndrs' <- mapM renameOuterTyVarBndrs bndrs+ lcontext' <- traverse renameLContext lcontext+ details' <- renameGADTDetails details+ res_ty' <- renameLType res_ty+ mbldoc' <- mapM renameLDocHsSyn mbldoc+ return (ConDeclGADT+ { con_g_ext = noExtField, con_names = lnames'+ , con_dcolon = dcol, con_bndrs = bndrs'+ , con_mb_cxt = lcontext', con_g_args = details'+ , con_res_ty = res_ty', con_doc = mbldoc' })++renameHsScaled :: HsScaled GhcRn (LHsType GhcRn)+ -> RnM (HsScaled DocNameI (LHsType DocNameI))+renameHsScaled (HsScaled w ty) = HsScaled <$> renameArrow w <*> renameLType ty++renameH98Details :: HsConDeclH98Details GhcRn+ -> RnM (HsConDeclH98Details DocNameI)+renameH98Details (RecCon (L l fields)) = do+ fields' <- mapM renameConDeclFieldField fields+ return (RecCon (L (locA l) fields'))+renameH98Details (PrefixCon ts ps) = PrefixCon ts <$> mapM renameHsScaled ps+renameH98Details (InfixCon a b) = do+ a' <- renameHsScaled a+ b' <- renameHsScaled b+ return (InfixCon a' b')++renameGADTDetails :: HsConDeclGADTDetails GhcRn+ -> RnM (HsConDeclGADTDetails DocNameI)+renameGADTDetails (RecConGADT (L l fields) arr) = do+ fields' <- mapM renameConDeclFieldField fields+ return (RecConGADT (L (locA l) fields') arr)+renameGADTDetails (PrefixConGADT ps) = PrefixConGADT <$> mapM renameHsScaled ps++renameConDeclFieldField :: LConDeclField GhcRn -> RnM (LConDeclField DocNameI)+renameConDeclFieldField (L l (ConDeclField _ names t doc)) = do+ names' <- mapM renameLFieldOcc names+ t' <- renameLType t+ doc' <- mapM renameLDocHsSyn doc+ return $ L (locA l) (ConDeclField noExtField names' t' doc')++renameLFieldOcc :: LFieldOcc GhcRn -> RnM (LFieldOcc DocNameI)+renameLFieldOcc (L l (FieldOcc sel lbl)) = do+ sel' <- renameName sel+ return $ L l (FieldOcc sel' lbl)++renameSig :: Sig GhcRn -> RnM (Sig DocNameI)+renameSig sig = case sig of+ TypeSig _ lnames ltype -> do+ lnames' <- mapM renameNameL lnames+ ltype' <- renameLSigWcType ltype+ return (TypeSig noExtField lnames' ltype')+ ClassOpSig _ is_default lnames sig_ty -> do+ lnames' <- mapM renameNameL lnames+ ltype' <- renameLSigType sig_ty+ return (ClassOpSig noExtField is_default lnames' ltype')+ PatSynSig _ lnames sig_ty -> do+ lnames' <- mapM renameNameL lnames+ sig_ty' <- renameLSigType sig_ty+ return $ PatSynSig noExtField lnames' sig_ty'+ FixSig _ (FixitySig _ lnames fixity) -> do+ lnames' <- mapM renameNameL lnames+ return $ FixSig noExtField (FixitySig noExtField lnames' fixity)+ MinimalSig _ (L l s) -> do+ s' <- traverse (traverse lookupRn) s+ return $ MinimalSig noExtField (L l s')+ -- we have filtered out all other kinds of signatures in Interface.Create+ _ -> error "expected TypeSig"+++renameForD :: ForeignDecl GhcRn -> RnM (ForeignDecl DocNameI)+renameForD (ForeignImport _ lname ltype x) = do+ lname' <- renameNameL lname+ ltype' <- renameLSigType ltype+ return (ForeignImport noExtField lname' ltype' (renameForI x))+renameForD (ForeignExport _ lname ltype x) = do+ lname' <- renameNameL lname+ ltype' <- renameLSigType ltype+ return (ForeignExport noExtField lname' ltype' (renameForE x))++renameForI :: ForeignImport GhcRn -> ForeignImport DocNameI+renameForI (CImport _ cconv safety mHeader spec) = CImport noExtField cconv safety mHeader spec++renameForE :: ForeignExport GhcRn -> ForeignExport DocNameI+renameForE (CExport _ spec) = CExport noExtField spec+++renameInstD :: InstDecl GhcRn -> RnM (InstDecl DocNameI)+renameInstD (ClsInstD { cid_inst = d }) = do+ d' <- renameClsInstD d+ return (ClsInstD { cid_d_ext = noExtField, cid_inst = d' })+renameInstD (TyFamInstD { tfid_inst = d }) = do+ d' <- renameTyFamInstD d+ return (TyFamInstD { tfid_ext = noExtField, tfid_inst = d' })+renameInstD (DataFamInstD { dfid_inst = d }) = do+ d' <- renameDataFamInstD d+ return (DataFamInstD { dfid_ext = noExtField, dfid_inst = d' })++renameDerivD :: DerivDecl GhcRn -> RnM (DerivDecl DocNameI)+renameDerivD (DerivDecl { deriv_type = ty+ , deriv_strategy = strat+ , deriv_overlap_mode = omode }) = do+ ty' <- renameLSigWcType ty+ strat' <- mapM (mapM renameDerivStrategy) strat+ return (DerivDecl { deriv_ext = noExtField+ , deriv_type = ty'+ , deriv_strategy = strat'+ , deriv_overlap_mode = omode })++renameDerivStrategy :: DerivStrategy GhcRn -> RnM (DerivStrategy DocNameI)+renameDerivStrategy (StockStrategy a) = pure (StockStrategy a)+renameDerivStrategy (AnyclassStrategy a) = pure (AnyclassStrategy a)+renameDerivStrategy (NewtypeStrategy a) = pure (NewtypeStrategy a)+renameDerivStrategy (ViaStrategy ty) = ViaStrategy <$> renameLSigType ty++renameClsInstD :: ClsInstDecl GhcRn -> RnM (ClsInstDecl DocNameI)+renameClsInstD (ClsInstDecl { cid_overlap_mode = omode+ , cid_poly_ty =ltype, cid_tyfam_insts = lATs+ , cid_datafam_insts = lADTs }) = do+ ltype' <- renameLSigType ltype+ lATs' <- mapM (mapM renameTyFamInstD) lATs+ lADTs' <- mapM (mapM renameDataFamInstD) lADTs+ return (ClsInstDecl { cid_ext = noExtField, cid_overlap_mode = omode+ , cid_poly_ty = ltype', cid_binds = emptyBag+ , cid_sigs = []+ , cid_tyfam_insts = lATs', cid_datafam_insts = lADTs' })+++renameTyFamInstD :: TyFamInstDecl GhcRn -> RnM (TyFamInstDecl DocNameI)+renameTyFamInstD (TyFamInstDecl { tfid_eqn = eqn })+ = do { eqn' <- renameTyFamInstEqn eqn+ ; return (TyFamInstDecl { tfid_xtn = noExtField, tfid_eqn = eqn' }) }++renameTyFamInstEqn :: TyFamInstEqn GhcRn -> RnM (TyFamInstEqn DocNameI)+renameTyFamInstEqn (FamEqn { feqn_tycon = tc, feqn_bndrs = bndrs+ , feqn_pats = pats, feqn_fixity = fixity+ , feqn_rhs = rhs })+ = do { tc' <- renameNameL tc+ ; bndrs' <- renameOuterTyVarBndrs bndrs+ ; pats' <- mapM renameLTypeArg pats+ ; rhs' <- renameLType rhs+ ; return (FamEqn { feqn_ext = noExtField+ , feqn_tycon = tc'+ , feqn_bndrs = bndrs'+ , feqn_pats = pats'+ , feqn_fixity = fixity+ , feqn_rhs = rhs' }) }++renameTyFamDefltD :: TyFamDefltDecl GhcRn -> RnM (TyFamDefltDecl DocNameI)+renameTyFamDefltD = renameTyFamInstD++renameDataFamInstD :: DataFamInstDecl GhcRn -> RnM (DataFamInstDecl DocNameI)+renameDataFamInstD (DataFamInstDecl { dfid_eqn = eqn })+ = do { eqn' <- rename_data_fam_eqn eqn+ ; return (DataFamInstDecl { dfid_eqn = eqn' }) }+ where+ rename_data_fam_eqn+ :: FamEqn GhcRn (HsDataDefn GhcRn)+ -> RnM (FamEqn DocNameI (HsDataDefn DocNameI))+ rename_data_fam_eqn (FamEqn { feqn_tycon = tc, feqn_bndrs = bndrs+ , feqn_pats = pats, feqn_fixity = fixity+ , feqn_rhs = defn })+ = do { tc' <- renameNameL tc+ ; bndrs' <- renameOuterTyVarBndrs bndrs+ ; pats' <- mapM renameLTypeArg pats+ ; defn' <- renameDataDefn defn+ ; return (FamEqn { feqn_ext = noExtField+ , feqn_tycon = tc'+ , feqn_bndrs = bndrs'+ , feqn_pats = pats'+ , feqn_fixity = fixity+ , feqn_rhs = defn' }) }++renameOuterTyVarBndrs :: HsOuterTyVarBndrs flag GhcRn+ -> RnM (HsOuterTyVarBndrs flag DocNameI)+renameOuterTyVarBndrs (HsOuterImplicit{}) =+ pure $ HsOuterImplicit{hso_ximplicit = noExtField}+renameOuterTyVarBndrs (HsOuterExplicit{hso_bndrs = exp_bndrs}) =+ HsOuterExplicit noExtField <$> mapM renameLTyVarBndr exp_bndrs++renameWc :: (in_thing -> RnM out_thing)+ -> HsWildCardBndrs GhcRn in_thing+ -> RnM (HsWildCardBndrs DocNameI out_thing)+renameWc rn_thing (HsWC { hswc_body = thing })+ = do { thing' <- rn_thing thing+ ; return (HsWC { hswc_body = thing'+ , hswc_ext = noExtField }) }++renameDocInstance :: DocInstance GhcRn -> RnM (DocInstance DocNameI)+renameDocInstance (inst, idoc, L l n, m) = do+ inst' <- renameInstHead inst+ n' <- renameName n+ idoc' <- mapM renameDoc idoc+ return (inst', idoc', L l n', m)++renameSub :: (Name, DocForDecl Name) -> RnM (DocName, DocForDecl DocName)+renameSub (n,doc) = do+ n' <- renameName n+ doc' <- renameDocForDecl doc+ return (n', doc')
@@ -0,0 +1,407 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE GADTs #-}+{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}++module Haddock.Interface.Specialize+ ( specializeInstHead+ ) where+++import Haddock.GhcUtils ( hsTyVarBndrName )+import Haddock.Syb+import Haddock.Types++import GHC+import GHC.Types.Name+import GHC.Data.FastString+import GHC.Builtin.Types ( listTyConName, unrestrictedFunTyConName )++import Control.Monad+import Control.Monad.Trans.State++import Data.Data+import qualified Data.List as List+import Data.Maybe+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set++-- | Instantiate all occurrences of given names with corresponding types.+specialize :: Data a => [(Name, HsType GhcRn)] -> a -> a+specialize specs = go spec_map0+ where+ go :: forall x. Data x => Map Name (HsType GhcRn) -> x -> x+ go spec_map = everywhereButType @Name $ mkT $ sugar . strip_kind_sig . specialize_ty_var spec_map++ strip_kind_sig :: HsType GhcRn -> HsType GhcRn+ strip_kind_sig (HsKindSig _ (L _ t) _) = t+ strip_kind_sig typ = typ++ specialize_ty_var :: Map Name (HsType GhcRn) -> HsType GhcRn -> HsType GhcRn+ specialize_ty_var spec_map (HsTyVar _ _ (L _ name'))+ | Just t <- Map.lookup name' spec_map = t+ specialize_ty_var _ typ = typ++ -- This is a tricky recursive definition. By adding in the specializations+ -- one by one, we should avoid infinite loops.+ spec_map0 = foldr (\(n,t) acc -> Map.insert n (go acc t) acc) mempty specs++{-# SPECIALIZE specialize :: [(Name, HsType GhcRn)] -> HsType GhcRn -> HsType GhcRn #-}++-- | Instantiate given binders with corresponding types.+--+-- Again, it is just a convenience function around 'specialize'. Note that+-- length of type list should be the same as the number of binders.+specializeTyVarBndrs :: Data a => LHsQTyVars GhcRn -> [HsType GhcRn] -> a -> a+specializeTyVarBndrs bndrs typs = specialize $ zip bndrs' typs+ where+ bndrs' = map (hsTyVarBndrName . unLoc) . hsq_explicit $ bndrs++++specializePseudoFamilyDecl :: LHsQTyVars GhcRn -> [HsType GhcRn]+ -> PseudoFamilyDecl GhcRn+ -> PseudoFamilyDecl GhcRn+specializePseudoFamilyDecl bndrs typs decl =+ decl {pfdTyVars = map (fmap (specializeTyVarBndrs bndrs typs)) (pfdTyVars decl)}++specializeSig :: LHsQTyVars GhcRn -> [HsType GhcRn]+ -> Sig GhcRn+ -> Sig GhcRn+specializeSig bndrs typs (TypeSig _ lnames typ) =+ TypeSig noAnn lnames (typ {hswc_body = noLocA typ'})+ where+ true_type :: HsSigType GhcRn+ true_type = unLoc (dropWildCards typ)+ typ' :: HsSigType GhcRn+ typ' = rename fv $ specializeTyVarBndrs bndrs typs true_type+ fv = foldr Set.union Set.empty . map freeVariablesType $ typs+specializeSig _ _ sig = sig+++-- | Make all details of instance head (signatures, associated types)+-- specialized to that particular instance type.+specializeInstHead :: InstHead GhcRn -> InstHead GhcRn+specializeInstHead ihd@InstHead { ihdInstType = clsi@ClassInst { .. }, .. } =+ ihd { ihdInstType = instType' }+ where+ instType' = clsi+ { clsiSigs = map specializeSig' clsiSigs+ , clsiAssocTys = map specializeFamilyDecl' clsiAssocTys+ }+ specializeSig' = specializeSig clsiTyVars ihdTypes+ specializeFamilyDecl' = specializePseudoFamilyDecl clsiTyVars ihdTypes+specializeInstHead ihd = ihd+++-- | Make given type use tuple and list literals where appropriate.+--+-- After applying 'specialize' function some terms may not use idiomatic list+-- and tuple literals resulting in types like @[] a@ or @(,,) a b c@. This+-- can be fixed using 'sugar' function, that will turn such types into @[a]@+-- and @(a, b, c)@.+sugar :: HsType GhcRn -> HsType GhcRn+sugar = sugarOperators . sugarTuples . sugarLists++sugarLists :: NamedThing (IdP (GhcPass p)) => HsType (GhcPass p) -> HsType (GhcPass p)+sugarLists (HsAppTy _ (L _ (HsTyVar _ _ (L _ name))) ltyp)+ | getName name == listTyConName = HsListTy noAnn ltyp+sugarLists typ = typ+++sugarTuples :: NamedThing (IdP (GhcPass p)) => HsType (GhcPass p) -> HsType (GhcPass p)+sugarTuples typ =+ aux [] typ+ where+ aux apps (HsAppTy _ (L _ ftyp) atyp) = aux (atyp:apps) ftyp+ aux apps (HsParTy _ (L _ typ')) = aux apps typ'+ aux apps (HsTyVar _ _ (L _ name))+ | isBuiltInSyntax name' && suitable = HsTupleTy noAnn HsBoxedOrConstraintTuple apps+ where+ name' = getName name+ strName = getOccString name+ suitable = case parseTupleArity strName of+ Just arity -> arity == length apps+ Nothing -> False+ aux _ _ = typ+++sugarOperators :: HsType GhcRn -> HsType GhcRn+sugarOperators (HsAppTy _ (L _ (HsAppTy _ (L _ (HsTyVar _ prom (L l name))) la)) lb)+ | isSymOcc $ getOccName name' = mkHsOpTy prom la (L l name) lb+ | unrestrictedFunTyConName == name' = HsFunTy noAnn (HsUnrestrictedArrow noHsUniTok) la lb+ where+ name' = getName name+sugarOperators typ = typ+++-- | Compute arity of given tuple operator.+--+-- >>> parseTupleArity "(,,)"+-- Just 3+--+-- >>> parseTupleArity "(,,,,)"+-- Just 5+--+-- >>> parseTupleArity "abc"+-- Nothing+--+-- >>> parseTupleArity "()"+-- Nothing+parseTupleArity :: String -> Maybe Int+parseTupleArity ('(':commas) = do+ n <- parseCommas commas+ guard $ n /= 0+ return $ n + 1+ where+ parseCommas (',':rest) = (+ 1) <$> parseCommas rest+ parseCommas ")" = Just 0+ parseCommas _ = Nothing+parseTupleArity _ = Nothing+++-- | Haskell AST type representation.+--+-- This type is used for renaming (more below), essentially the ambiguous (!)+-- version of 'Name'. So, why is this 'FastString' instead of 'OccName'? Well,+-- it was 'OccName' before, but turned out that 'OccName' sometimes also+-- contains namespace information, differentiating visually same types.+--+-- And 'FastString' is used because it is /visual/ part of 'OccName' - it is+-- not converted to 'String' or alike to avoid new allocations. Additionally,+-- since it is stored mostly in 'Set', fast comparison of 'FastString' is also+-- quite nice.+newtype NameRep+ = NameRep FastString+ deriving (Eq)++instance Ord NameRep where+ compare (NameRep fs1) (NameRep fs2) = uniqCompareFS fs1 fs2+++getNameRep :: NamedThing name => name -> NameRep+getNameRep = NameRep . getOccFS++nameRepString :: NameRep -> String+nameRepString (NameRep fs) = unpackFS fs++stringNameRep :: String -> NameRep+stringNameRep = NameRep . mkFastString++setInternalNameRep :: SetName name => NameRep -> name -> name+setInternalNameRep (NameRep fs) = setInternalOccName (mkVarOccFS fs)++setInternalOccName :: SetName name => OccName -> name -> name+setInternalOccName occ name =+ setName nname' name+ where+ nname = getName name+ nname' = mkInternalName (nameUnique nname) occ (nameSrcSpan nname)+++-- | Compute set of free variables of a given 'HsType'.+freeVariablesType :: HsType GhcRn -> Set Name+freeVariablesType =+ everythingWithState Set.empty Set.union+ (mkQ (\ctx -> (Set.empty, ctx)) queryType)++-- | Compute set of free variables of a given 'HsType'.+freeVariablesSigType :: HsSigType GhcRn -> Set Name+freeVariablesSigType =+ everythingWithState Set.empty Set.union+ (mkQ (\ctx -> (Set.empty, ctx)) queryType `extQ` querySigType)++queryType :: HsType GhcRn -> Set Name -> (Set Name, Set Name)+queryType term ctx = case term of+ HsForAllTy _ tele _ ->+ (Set.empty, Set.union ctx (teleNames tele))+ HsTyVar _ _ (L _ name)+ | getName name `Set.member` ctx -> (Set.empty, ctx)+ | otherwise -> (Set.singleton $ getName name, ctx)+ _ -> (Set.empty, ctx)+ where+ teleNames :: HsForAllTelescope GhcRn -> Set Name+ teleNames (HsForAllVis _ bndrs) = bndrsNames bndrs+ teleNames (HsForAllInvis _ bndrs) = bndrsNames bndrs++querySigType :: HsSigType GhcRn -> Set Name -> (Set Name, Set Name)+querySigType (HsSig { sig_bndrs = outer_bndrs }) ctx =+ (Set.empty, Set.union ctx (bndrsNames (hsOuterExplicitBndrs outer_bndrs)))++bndrsNames :: [LHsTyVarBndr flag GhcRn] -> Set Name+bndrsNames = Set.fromList . map (getName . tyVarName . unLoc)+++-- | Make given type visually unambiguous.+--+-- After applying 'specialize' method, some free type variables may become+-- visually ambiguous - for example, having @a -> b@ and specializing @a@ to+-- @(a -> b)@ we get @(a -> b) -> b@ where first occurrence of @b@ refers to+-- different type variable than latter one. Applying 'rename' function+-- will fix that type to be visually unambiguous again (making it something+-- like @(a -> b0) -> b@).+rename :: Set Name -> HsSigType GhcRn -> HsSigType GhcRn+rename fv typ = evalState (renameSigType typ) env+ where+ env = RenameEnv+ { rneHeadFVs = Map.fromList . map mkPair . Set.toList $ fv+ , rneSigFVs = Set.map getNameRep $ freeVariablesSigType typ+ , rneCtx = Map.empty+ }+ mkPair name = (getNameRep name, name)++-- | Renaming monad.+type Rename name = State (RenameEnv name)++data RenameEnv name = RenameEnv+ { rneHeadFVs :: Map NameRep Name+ , rneSigFVs :: Set NameRep+ , rneCtx :: Map Name name+ }+++renameSigType :: HsSigType GhcRn -> Rename (IdP GhcRn) (HsSigType GhcRn)+renameSigType (HsSig x bndrs body) =+ HsSig x <$> renameOuterTyVarBndrs bndrs <*> renameLType body++renameOuterTyVarBndrs :: HsOuterTyVarBndrs flag GhcRn+ -> Rename (IdP GhcRn) (HsOuterTyVarBndrs flag GhcRn)+renameOuterTyVarBndrs (HsOuterImplicit imp_tvs) =+ HsOuterImplicit <$> mapM renameName imp_tvs+renameOuterTyVarBndrs (HsOuterExplicit x exp_bndrs) =+ HsOuterExplicit x <$> mapM renameLBinder exp_bndrs++renameType :: HsType GhcRn -> Rename (IdP GhcRn) (HsType GhcRn)+renameType (HsForAllTy x tele lt) =+ HsForAllTy x+ <$> renameForAllTelescope tele+ <*> renameLType lt+renameType (HsQualTy x lctxt lt) =+ HsQualTy x+ <$> renameLContext lctxt+ <*> renameLType lt+renameType (HsTyVar x ip name) = HsTyVar x ip <$> locatedN renameName name+renameType t@(HsStarTy _ _) = pure t+renameType (HsAppTy x lf la) = HsAppTy x <$> renameLType lf <*> renameLType la+renameType (HsAppKindTy x lt lk) = HsAppKindTy x <$> renameLType lt <*> renameLKind lk+renameType (HsFunTy x w la lr) = HsFunTy x <$> renameHsArrow w <*> renameLType la <*> renameLType lr+renameType (HsListTy x lt) = HsListTy x <$> renameLType lt+renameType (HsTupleTy x srt lt) = HsTupleTy x srt <$> mapM renameLType lt+renameType (HsSumTy x lt) = HsSumTy x <$> mapM renameLType lt+renameType (HsOpTy x prom la lop lb) =+ HsOpTy x prom <$> renameLType la <*> locatedN renameName lop <*> renameLType lb+renameType (HsParTy x lt) = HsParTy x <$> renameLType lt+renameType (HsIParamTy x ip lt) = HsIParamTy x ip <$> renameLType lt+renameType (HsKindSig x lt lk) = HsKindSig x <$> renameLType lt <*> pure lk+renameType t@(HsSpliceTy _ _) = pure t+renameType (HsDocTy x lt doc) = HsDocTy x <$> renameLType lt <*> pure doc+renameType (HsBangTy x bang lt) = HsBangTy x bang <$> renameLType lt+renameType t@(HsRecTy _ _) = pure t+renameType t@(XHsType _) = pure t+renameType (HsExplicitListTy x ip ltys) =+ HsExplicitListTy x ip <$> renameLTypes ltys+renameType (HsExplicitTupleTy x ltys) =+ HsExplicitTupleTy x <$> renameLTypes ltys+renameType t@(HsTyLit _ _) = pure t+renameType (HsWildCardTy wc) = pure (HsWildCardTy wc)++renameHsArrow :: HsArrow GhcRn -> Rename (IdP GhcRn) (HsArrow GhcRn)+renameHsArrow (HsExplicitMult pct p arr) = (\p' -> HsExplicitMult pct p' arr) <$> renameLType p+renameHsArrow mult = pure mult+++renameLType :: LHsType GhcRn -> Rename (IdP GhcRn) (LHsType GhcRn)+renameLType = located renameType++renameLKind :: LHsKind GhcRn -> Rename (IdP GhcRn) (LHsKind GhcRn)+renameLKind = renameLType++renameLTypes :: [LHsType GhcRn] -> Rename (IdP GhcRn) [LHsType GhcRn]+renameLTypes = mapM renameLType++renameLContext :: LHsContext GhcRn -> Rename (IdP GhcRn) (LHsContext GhcRn)+renameLContext (L l ctxt) = do+ ctxt' <- renameContext ctxt+ return (L l ctxt')++renameContext :: HsContext GhcRn -> Rename (IdP GhcRn) (HsContext GhcRn)+renameContext = renameLTypes++renameForAllTelescope :: HsForAllTelescope GhcRn+ -> Rename (IdP GhcRn) (HsForAllTelescope GhcRn)+renameForAllTelescope (HsForAllVis x bndrs) =+ HsForAllVis x <$> mapM renameLBinder bndrs+renameForAllTelescope (HsForAllInvis x bndrs) =+ HsForAllInvis x <$> mapM renameLBinder bndrs++renameBinder :: HsTyVarBndr flag GhcRn -> Rename (IdP GhcRn) (HsTyVarBndr flag GhcRn)+renameBinder (UserTyVar x fl lname) = UserTyVar x fl <$> locatedN renameName lname+renameBinder (KindedTyVar x fl lname lkind) =+ KindedTyVar x fl <$> locatedN renameName lname <*> located renameType lkind++renameLBinder :: LHsTyVarBndr flag GhcRn -> Rename (IdP GhcRn) (LHsTyVarBndr flag GhcRn)+renameLBinder = located renameBinder++-- | Core renaming logic.+renameName :: SetName name => name -> Rename name name+renameName name = do+ RenameEnv { .. } <- get+ case Map.lookup (getName name) rneCtx of+ Nothing+ | Just headTv <- Map.lookup (getNameRep name) rneHeadFVs+ , headTv /= getName name -> freshName name+ Just name' -> return name'+ _ -> return name+++-- | Generate fresh occurrence name, put it into context and return.+freshName :: SetName name => name -> Rename name name+freshName name = do+ taken <- takenNames+ let name' = setInternalNameRep (findFreshName taken rep) name+ modify $ \rne -> rne+ { rneCtx = Map.insert (getName name) name' (rneCtx rne) }+ return name'+ where+ nname = getName name+ rep = getNameRep nname+++takenNames :: NamedThing name => Rename name (Set NameRep)+takenNames = do+ RenameEnv { .. } <- get+ return $ Set.unions [headReps rneHeadFVs, rneSigFVs, ctxElems rneCtx]+ where+ headReps = Set.fromList . Map.keys+ ctxElems = Set.fromList . map getNameRep . Map.elems+++findFreshName :: Set NameRep -> NameRep -> NameRep+findFreshName taken =+ fromJust . List.find isFresh . alternativeNames+ where+ isFresh = not . flip Set.member taken+++alternativeNames :: NameRep -> [NameRep]+alternativeNames name =+ [ stringNameRep $ str ++ show i | i :: Int <- [0..] ]+ where+ str = nameRepString name+++located :: Functor f => (a -> f b) -> GenLocated l a -> f (GenLocated l b)+located f (L loc e) = L loc <$> f e++locatedN :: Functor f => (a -> f b) -> LocatedN a -> f (LocatedN b)+locatedN f (L loc e) = L loc <$> f e+++tyVarName :: HsTyVarBndr flag GhcRn -> IdP GhcRn+tyVarName (UserTyVar _ _ name) = unLoc name+tyVarName (KindedTyVar _ _ (L _ name) _) = name
@@ -0,0 +1,682 @@+{-# LANGUAGE CPP, RankNTypes, ScopedTypeVariables #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.InterfaceFile+-- Copyright : (c) David Waern 2006-2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Reading and writing the .haddock interface file+-----------------------------------------------------------------------------+module Haddock.InterfaceFile (+ InterfaceFile(..), PackageInfo(..), ifUnitId, ifModule,+ PackageInterfaces(..), mkPackageInterfaces, ppPackageInfo,+ readInterfaceFile, writeInterfaceFile,+ freshNameCache,+ binaryInterfaceVersion, binaryInterfaceVersionCompatibility+) where+++import Haddock.Types++import Data.IORef+import qualified Data.Map as Map+import Data.Map (Map)+import Data.Version+import Data.Word+import Text.ParserCombinators.ReadP (readP_to_S)++import GHC.Iface.Binary (getWithUserData, putSymbolTable)+import GHC.Unit.State+import GHC.Utils.Binary+import GHC.Data.FastMutInt+import GHC.Data.FastString+import GHC hiding (NoLink)+import GHC.Types.Name.Cache+import GHC.Types.Unique.FM+import GHC.Types.Unique++import Haddock.Options (Visibility (..))++data InterfaceFile = InterfaceFile {+ ifLinkEnv :: LinkEnv,+ -- | Package meta data. Currently it only consist of a package name, which+ -- is not read from the interface file, but inferred from its name.+ --+ -- issue #+ ifPackageInfo :: PackageInfo,+ ifInstalledIfaces :: [InstalledInterface]+}++data PackageInfo = PackageInfo {+ piPackageName :: PackageName,+ piPackageVersion :: Data.Version.Version+}++ppPackageInfo :: PackageInfo -> String+ppPackageInfo (PackageInfo name version) | version == makeVersion []+ = unpackFS (unPackageName name)+ppPackageInfo (PackageInfo name version) = unpackFS (unPackageName name) ++ "-" ++ showVersion version++data PackageInterfaces = PackageInterfaces {+ piPackageInfo :: PackageInfo,+ piVisibility :: Visibility,+ piInstalledInterfaces :: [InstalledInterface]+}++mkPackageInterfaces :: Visibility -> InterfaceFile -> PackageInterfaces+mkPackageInterfaces piVisibility+ InterfaceFile { ifPackageInfo+ , ifInstalledIfaces+ } =+ PackageInterfaces { piPackageInfo = ifPackageInfo+ , piVisibility+ , piInstalledInterfaces = ifInstalledIfaces+ }++ifModule :: InterfaceFile -> Module+ifModule if_ =+ case ifInstalledIfaces if_ of+ [] -> error "empty InterfaceFile"+ iface:_ -> instMod iface++ifUnitId :: InterfaceFile -> Unit+ifUnitId if_ =+ case ifInstalledIfaces if_ of+ [] -> error "empty InterfaceFile"+ iface:_ -> moduleUnit $ instMod iface+++binaryInterfaceMagic :: Word32+binaryInterfaceMagic = 0xD0Cface++-- Note [The DocModule story]+--+-- Breaking changes to the DocH type result in Haddock being unable to read+-- existing interfaces. This is especially painful for interfaces shipped+-- with GHC distributions since there is no easy way to regenerate them!+--+-- PR #1315 introduced a breaking change to the DocModule constructor. To+-- maintain backward compatibility we+--+-- Parse the old DocModule constructor format (tag 5) and parse the contained+-- string into a proper ModLink structure. When writing interfaces we exclusively+-- use the new DocModule format (tag 24)++-- IMPORTANT: Since datatypes in the GHC API might change between major+-- versions, and because we store GHC datatypes in our interface files, we need+-- to make sure we version our interface files accordingly.+--+-- If you change the interface file format or adapt Haddock to work with a new+-- major version of GHC (so that the format changes indirectly) *you* need to+-- follow these steps:+--+-- (1) increase `binaryInterfaceVersion`+--+-- (2) set `binaryInterfaceVersionCompatibility` to [binaryInterfaceVersion]+--+binaryInterfaceVersion :: Word16+#if MIN_VERSION_ghc(9,6,0) && !MIN_VERSION_ghc(9,7,0)+binaryInterfaceVersion = 42++binaryInterfaceVersionCompatibility :: [Word16]+binaryInterfaceVersionCompatibility = [binaryInterfaceVersion]+#else+#error Unsupported GHC version+#endif+++initBinMemSize :: Int+initBinMemSize = 1024*1024+++writeInterfaceFile :: FilePath -> InterfaceFile -> IO ()+writeInterfaceFile filename iface = do+ bh0 <- openBinMem initBinMemSize+ put_ bh0 binaryInterfaceMagic+ put_ bh0 binaryInterfaceVersion++ -- remember where the dictionary pointer will go+ dict_p_p <- tellBin bh0+ put_ bh0 dict_p_p++ -- remember where the symbol table pointer will go+ symtab_p_p <- tellBin bh0+ put_ bh0 symtab_p_p++ -- Make some intial state+ symtab_next <- newFastMutInt 0+ symtab_map <- newIORef emptyUFM+ let bin_symtab = BinSymbolTable {+ bin_symtab_next = symtab_next,+ bin_symtab_map = symtab_map }+ dict_next_ref <- newFastMutInt 0+ dict_map_ref <- newIORef emptyUFM+ let bin_dict = BinDictionary {+ bin_dict_next = dict_next_ref,+ bin_dict_map = dict_map_ref }++ -- put the main thing+ let bh = setUserData bh0 $ newWriteState (putName bin_symtab)+ (putName bin_symtab)+ (putFastString bin_dict)+ putInterfaceFile_ bh iface++ -- write the symtab pointer at the front of the file+ symtab_p <- tellBin bh+ putAt bh symtab_p_p symtab_p+ seekBin bh symtab_p++ -- write the symbol table itself+ symtab_next' <- readFastMutInt symtab_next+ symtab_map' <- readIORef symtab_map+ putSymbolTable bh symtab_next' symtab_map'++ -- write the dictionary pointer at the fornt of the file+ dict_p <- tellBin bh+ putAt bh dict_p_p dict_p+ seekBin bh dict_p++ -- write the dictionary itself+ dict_next <- readFastMutInt dict_next_ref+ dict_map <- readIORef dict_map_ref+ putDictionary bh dict_next dict_map++ -- and send the result to the file+ writeBinMem bh filename+ return ()+++freshNameCache :: IO NameCache+freshNameCache = initNameCache 'a' -- ??+ []++-- | Read a Haddock (@.haddock@) interface file. Return either an+-- 'InterfaceFile' or an error message.+--+-- This function can be called in two ways. Within a GHC session it will+-- update the use and update the session's name cache. Outside a GHC session+-- a new empty name cache is used.+readInterfaceFile :: NameCache+ -> FilePath+ -> Bool -- ^ Disable version check. Can cause runtime crash.+ -> IO (Either String InterfaceFile)+readInterfaceFile name_cache filename bypass_checks = do+ bh <- readBinMem filename++ magic <- get bh+ if magic /= binaryInterfaceMagic+ then return . Left $ "Magic number mismatch: couldn't load interface file: " ++ filename+ else do+ version <- get bh+ if not bypass_checks && (version `notElem` binaryInterfaceVersionCompatibility)+ then return . Left $ "Interface file is of wrong version: " ++ filename+ else Right <$> getWithUserData name_cache bh++-------------------------------------------------------------------------------+-- * Symbol table+-------------------------------------------------------------------------------+++putName :: BinSymbolTable -> BinHandle -> Name -> IO ()+putName BinSymbolTable{+ bin_symtab_map = symtab_map_ref,+ bin_symtab_next = symtab_next } bh name+ = do+ symtab_map <- readIORef symtab_map_ref+ case lookupUFM symtab_map name of+ Just (off,_) -> put_ bh (fromIntegral off :: Word32)+ Nothing -> do+ off <- readFastMutInt symtab_next+ writeFastMutInt symtab_next (off+1)+ writeIORef symtab_map_ref+ $! addToUFM symtab_map name (off,name)+ put_ bh (fromIntegral off :: Word32)+++data BinSymbolTable = BinSymbolTable {+ bin_symtab_next :: !FastMutInt, -- The next index to use+ bin_symtab_map :: !(IORef (UniqFM Name (Int,Name)))+ -- indexed by Name+ }+++putFastString :: BinDictionary -> BinHandle -> FastString -> IO ()+putFastString BinDictionary { bin_dict_next = j_r,+ bin_dict_map = out_r} bh f+ = do+ out <- readIORef out_r+ let !unique = getUnique f+ case lookupUFM_Directly out unique of+ Just (j, _) -> put_ bh (fromIntegral j :: Word32)+ Nothing -> do+ j <- readFastMutInt j_r+ put_ bh (fromIntegral j :: Word32)+ writeFastMutInt j_r (j + 1)+ writeIORef out_r $! addToUFM_Directly out unique (j, f)+++data BinDictionary = BinDictionary {+ bin_dict_next :: !FastMutInt, -- The next index to use+ bin_dict_map :: !(IORef (UniqFM FastString (Int,FastString)))+ -- indexed by FastString+ }++-------------------------------------------------------------------------------+-- * GhcBinary instances+-------------------------------------------------------------------------------+++instance (Ord k, Binary k, Binary v) => Binary (Map k v) where+ put_ bh m = put_ bh (Map.toList m)+ get bh = fmap (Map.fromList) (get bh)++instance Binary PackageInfo where+ put_ bh PackageInfo { piPackageName, piPackageVersion } = do+ put_ bh (unPackageName piPackageName)+ put_ bh (showVersion piPackageVersion)+ get bh = do+ name <- PackageName <$> get bh+ versionString <- get bh+ let version = case readP_to_S parseVersion versionString of+ [] -> makeVersion []+ vs -> fst (last vs)+ return $ PackageInfo name version++instance Binary InterfaceFile where+ put_ bh (InterfaceFile env info ifaces) = do+ put_ bh env+ put_ bh info+ put_ bh ifaces++ get bh = do+ env <- get bh+ info <- get bh+ ifaces <- get bh+ return (InterfaceFile env info ifaces)+++putInterfaceFile_ :: BinHandle -> InterfaceFile -> IO ()+putInterfaceFile_ bh (InterfaceFile env info ifaces) = do+ put_ bh env+ put_ bh info+ put_ bh ifaces++instance Binary InstalledInterface where+ put_ bh (InstalledInterface modu is_sig info docMap argMap+ exps visExps opts fixMap) = do+ put_ bh modu+ put_ bh is_sig+ put_ bh info+ lazyPut bh (docMap, argMap)+ put_ bh exps+ put_ bh visExps+ put_ bh opts+ put_ bh fixMap++ get bh = do+ modu <- get bh+ is_sig <- get bh+ info <- get bh+ ~(docMap, argMap) <- lazyGet bh+ exps <- get bh+ visExps <- get bh+ opts <- get bh+ fixMap <- get bh+ return (InstalledInterface modu is_sig info docMap argMap+ exps visExps opts fixMap)+++instance Binary DocOption where+ put_ bh OptHide = do+ putByte bh 0+ put_ bh OptPrune = do+ putByte bh 1+ put_ bh OptIgnoreExports = do+ putByte bh 2+ put_ bh OptNotHome = do+ putByte bh 3+ put_ bh OptShowExtensions = do+ putByte bh 4+ get bh = do+ h <- getByte bh+ case h of+ 0 -> do+ return OptHide+ 1 -> do+ return OptPrune+ 2 -> do+ return OptIgnoreExports+ 3 -> do+ return OptNotHome+ 4 -> do+ return OptShowExtensions+ _ -> fail "invalid binary data found"+++instance Binary Example where+ put_ bh (Example expression result) = do+ put_ bh expression+ put_ bh result+ get bh = do+ expression <- get bh+ result <- get bh+ return (Example expression result)++instance Binary a => Binary (Hyperlink a) where+ put_ bh (Hyperlink url label) = do+ put_ bh url+ put_ bh label+ get bh = do+ url <- get bh+ label <- get bh+ return (Hyperlink url label)++instance Binary a => Binary (ModLink a) where+ put_ bh (ModLink m label) = do+ put_ bh m+ put_ bh label+ get bh = do+ m <- get bh+ label <- get bh+ return (ModLink m label)++instance Binary Picture where+ put_ bh (Picture uri title) = do+ put_ bh uri+ put_ bh title+ get bh = do+ uri <- get bh+ title <- get bh+ return (Picture uri title)++instance Binary a => Binary (Header a) where+ put_ bh (Header l t) = do+ put_ bh l+ put_ bh t+ get bh = do+ l <- get bh+ t <- get bh+ return (Header l t)++instance Binary a => Binary (Table a) where+ put_ bh (Table h b) = do+ put_ bh h+ put_ bh b+ get bh = do+ h <- get bh+ b <- get bh+ return (Table h b)++instance Binary a => Binary (TableRow a) where+ put_ bh (TableRow cs) = put_ bh cs+ get bh = do+ cs <- get bh+ return (TableRow cs)++instance Binary a => Binary (TableCell a) where+ put_ bh (TableCell i j c) = do+ put_ bh i+ put_ bh j+ put_ bh c+ get bh = do+ i <- get bh+ j <- get bh+ c <- get bh+ return (TableCell i j c)++instance Binary Meta where+ put_ bh (Meta v p) = do+ put_ bh v+ put_ bh p+ get bh = do+ v <- get bh+ p <- get bh+ return (Meta v p)++instance (Binary mod, Binary id) => Binary (MetaDoc mod id) where+ put_ bh MetaDoc { _meta = m, _doc = d } = do+ put_ bh m+ put_ bh d+ get bh = do+ m <- get bh+ d <- get bh+ return $ MetaDoc { _meta = m, _doc = d }++instance (Binary mod, Binary id) => Binary (DocH mod id) where+ put_ bh DocEmpty = do+ putByte bh 0+ put_ bh (DocAppend aa ab) = do+ putByte bh 1+ put_ bh aa+ put_ bh ab+ put_ bh (DocString ac) = do+ putByte bh 2+ put_ bh ac+ put_ bh (DocParagraph ad) = do+ putByte bh 3+ put_ bh ad+ put_ bh (DocIdentifier ae) = do+ putByte bh 4+ put_ bh ae+ put_ bh (DocEmphasis ag) = do+ putByte bh 6+ put_ bh ag+ put_ bh (DocMonospaced ah) = do+ putByte bh 7+ put_ bh ah+ put_ bh (DocUnorderedList ai) = do+ putByte bh 8+ put_ bh ai+ put_ bh (DocOrderedList aj) = do+ putByte bh 9+ put_ bh aj+ put_ bh (DocDefList ak) = do+ putByte bh 10+ put_ bh ak+ put_ bh (DocCodeBlock al) = do+ putByte bh 11+ put_ bh al+ put_ bh (DocHyperlink am) = do+ putByte bh 12+ put_ bh am+ put_ bh (DocPic x) = do+ putByte bh 13+ put_ bh x+ put_ bh (DocAName an) = do+ putByte bh 14+ put_ bh an+ put_ bh (DocExamples ao) = do+ putByte bh 15+ put_ bh ao+ put_ bh (DocIdentifierUnchecked x) = do+ putByte bh 16+ put_ bh x+ put_ bh (DocWarning ag) = do+ putByte bh 17+ put_ bh ag+ put_ bh (DocProperty x) = do+ putByte bh 18+ put_ bh x+ put_ bh (DocBold x) = do+ putByte bh 19+ put_ bh x+ put_ bh (DocHeader aa) = do+ putByte bh 20+ put_ bh aa+ put_ bh (DocMathInline x) = do+ putByte bh 21+ put_ bh x+ put_ bh (DocMathDisplay x) = do+ putByte bh 22+ put_ bh x+ put_ bh (DocTable x) = do+ putByte bh 23+ put_ bh x+ -- See note [The DocModule story]+ put_ bh (DocModule af) = do+ putByte bh 24+ put_ bh af++ get bh = do+ h <- getByte bh+ case h of+ 0 -> do+ return DocEmpty+ 1 -> do+ aa <- get bh+ ab <- get bh+ return (DocAppend aa ab)+ 2 -> do+ ac <- get bh+ return (DocString ac)+ 3 -> do+ ad <- get bh+ return (DocParagraph ad)+ 4 -> do+ ae <- get bh+ return (DocIdentifier ae)+ -- See note [The DocModule story]+ 5 -> do+ af <- get bh+ return $ DocModule ModLink+ { modLinkName = af+ , modLinkLabel = Nothing+ }+ 6 -> do+ ag <- get bh+ return (DocEmphasis ag)+ 7 -> do+ ah <- get bh+ return (DocMonospaced ah)+ 8 -> do+ ai <- get bh+ return (DocUnorderedList ai)+ 9 -> do+ aj <- get bh+ return (DocOrderedList aj)+ 10 -> do+ ak <- get bh+ return (DocDefList ak)+ 11 -> do+ al <- get bh+ return (DocCodeBlock al)+ 12 -> do+ am <- get bh+ return (DocHyperlink am)+ 13 -> do+ x <- get bh+ return (DocPic x)+ 14 -> do+ an <- get bh+ return (DocAName an)+ 15 -> do+ ao <- get bh+ return (DocExamples ao)+ 16 -> do+ x <- get bh+ return (DocIdentifierUnchecked x)+ 17 -> do+ ag <- get bh+ return (DocWarning ag)+ 18 -> do+ x <- get bh+ return (DocProperty x)+ 19 -> do+ x <- get bh+ return (DocBold x)+ 20 -> do+ aa <- get bh+ return (DocHeader aa)+ 21 -> do+ x <- get bh+ return (DocMathInline x)+ 22 -> do+ x <- get bh+ return (DocMathDisplay x)+ 23 -> do+ x <- get bh+ return (DocTable x)+ -- See note [The DocModule story]+ 24 -> do+ af <- get bh+ return (DocModule af)+ _ -> error "invalid binary data found in the interface file"+++instance Binary name => Binary (HaddockModInfo name) where+ put_ bh hmi = do+ put_ bh (hmi_description hmi)+ put_ bh (hmi_copyright hmi)+ put_ bh (hmi_license hmi)+ put_ bh (hmi_maintainer hmi)+ put_ bh (hmi_stability hmi)+ put_ bh (hmi_portability hmi)+ put_ bh (hmi_safety hmi)+ put_ bh (fromEnum <$> hmi_language hmi)+ put_ bh (map fromEnum $ hmi_extensions hmi)++ get bh = do+ descr <- get bh+ copyr <- get bh+ licen <- get bh+ maint <- get bh+ stabi <- get bh+ porta <- get bh+ safet <- get bh+ langu <- fmap toEnum <$> get bh+ exten <- map toEnum <$> get bh+ return (HaddockModInfo descr copyr licen maint stabi porta safet langu exten)++instance Binary DocName where+ put_ bh (Documented name modu) = do+ putByte bh 0+ put_ bh name+ put_ bh modu+ put_ bh (Undocumented name) = do+ putByte bh 1+ put_ bh name++ get bh = do+ h <- getByte bh+ case h of+ 0 -> do+ name <- get bh+ modu <- get bh+ return (Documented name modu)+ 1 -> do+ name <- get bh+ return (Undocumented name)+ _ -> error "get DocName: Bad h"++instance Binary n => Binary (Wrap n) where+ put_ bh (Unadorned n) = do+ putByte bh 0+ put_ bh n+ put_ bh (Parenthesized n) = do+ putByte bh 1+ put_ bh n+ put_ bh (Backticked n) = do+ putByte bh 2+ put_ bh n++ get bh = do+ h <- getByte bh+ case h of+ 0 -> do+ name <- get bh+ return (Unadorned name)+ 1 -> do+ name <- get bh+ return (Parenthesized name)+ 2 -> do+ name <- get bh+ return (Backticked name)+ _ -> error "get Wrap: Bad h"
@@ -0,0 +1,62 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.ModuleTree+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.ModuleTree ( ModuleTree(..), mkModuleTree ) where+++import Haddock.Types ( MDoc )++import GHC ( Name )+import GHC.Unit.Module ( Module, moduleNameString, moduleName, moduleUnit, unitString )+import GHC.Unit.State ( UnitState, lookupUnit, unitPackageIdString )++import qualified Control.Applicative as A+++data ModuleTree = Node String (Maybe Module) (Maybe String) (Maybe String) (Maybe (MDoc Name)) [ModuleTree]+++mkModuleTree :: UnitState -> Bool -> [(Module, Maybe (MDoc Name))] -> [ModuleTree]+mkModuleTree state showPkgs mods =+ foldr fn [] [ (mdl, splitModule mdl, modPkg mdl, modSrcPkg mdl, short) | (mdl, short) <- mods ]+ where+ modPkg mod_ | showPkgs = Just (unitString (moduleUnit mod_))+ | otherwise = Nothing+ modSrcPkg mod_ | showPkgs = fmap unitPackageIdString+ (lookupUnit state (moduleUnit mod_))+ | otherwise = Nothing+ fn (m,mod_,pkg,srcPkg,short) = addToTrees mod_ m pkg srcPkg short+++addToTrees :: [String] -> Module -> Maybe String -> Maybe String -> Maybe (MDoc Name) -> [ModuleTree] -> [ModuleTree]+addToTrees [] _ _ _ _ ts = ts+addToTrees ss m pkg srcPkg short [] = mkSubTree ss m pkg srcPkg short+addToTrees (s1:ss) m pkg srcPkg short (t@(Node s2 leaf node_pkg node_srcPkg node_short subs) : ts)+ | s1 > s2 = t : addToTrees (s1:ss) m pkg srcPkg short ts+ | s1 == s2 = Node s2 (leaf A.<|> (if null ss then Just m else Nothing)) this_pkg this_srcPkg this_short (addToTrees ss m pkg srcPkg short subs) : ts+ | otherwise = mkSubTree (s1:ss) m pkg srcPkg short ++ t : ts+ where+ this_pkg = if null ss then pkg else node_pkg+ this_srcPkg = if null ss then srcPkg else node_srcPkg+ this_short = if null ss then short else node_short+++mkSubTree :: [String] -> Module -> Maybe String -> Maybe String -> Maybe (MDoc Name) -> [ModuleTree]+mkSubTree [] _ _ _ _ = []+mkSubTree [s] m pkg srcPkg short = [Node s (Just m) pkg srcPkg short []]+mkSubTree (s:s':ss) m pkg srcPkg short = [Node s Nothing Nothing Nothing Nothing (mkSubTree (s':ss) m pkg srcPkg short)]+++splitModule :: Module -> [String]+splitModule mdl = split (moduleNameString (moduleName mdl))+ where split mod0 = case break (== '.') mod0 of+ (s1, '.':s2) -> s1 : split s2+ (s1, _) -> [s1]
@@ -0,0 +1,454 @@+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Options+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Definition of the command line interface of Haddock.+-----------------------------------------------------------------------------+module Haddock.Options (+ parseHaddockOpts,+ Flag(..),+ Visibility(..),+ getUsage,+ optTitle,+ outputDir,+ optContentsUrl,+ optIndexUrl,+ optCssFile,+ optSourceCssFile,+ sourceUrls,+ wikiUrls,+ baseUrl,+ optParCount,+ optDumpInterfaceFile,+ optShowInterfaceFile,+ optLaTeXStyle,+ optMathjax,+ qualification,+ sinceQualification,+ verbosity,+ ghcFlags,+ reexportFlags,+ readIfaceArgs,+ optPackageName,+ optPackageVersion,+ modulePackageInfo,+ ignoredSymbols+) where+++import qualified Data.Char as Char+import Data.List (dropWhileEnd)+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Data.Version+import Control.Applicative+import GHC.Data.FastString+import GHC ( Module, moduleUnit )+import GHC.Unit.State+import Haddock.Types+import Haddock.Utils+import System.Console.GetOpt+import qualified Text.ParserCombinators.ReadP as RP+++data Flag+ = Flag_BuiltInThemes+ | Flag_CSS String+-- | Flag_DocBook+ | Flag_ReadInterface String+ | Flag_DumpInterface String+ | Flag_ShowInterface String+ | Flag_Heading String+ | Flag_Html+ | Flag_Hoogle+ | Flag_Lib String+ | Flag_OutputDir FilePath+ | Flag_Prologue FilePath+ | Flag_SourceBaseURL String+ | Flag_SourceModuleURL String+ | Flag_SourceEntityURL String+ | Flag_SourceLEntityURL String+ | Flag_WikiBaseURL String+ | Flag_BaseURL String+ | Flag_WikiModuleURL String+ | Flag_WikiEntityURL String+ | Flag_LaTeX+ | Flag_LaTeXStyle String+ | Flag_QuickJumpIndex+ | Flag_HyperlinkedSource+ | Flag_SourceCss String+ | Flag_Mathjax String+ | Flag_Help+ | Flag_Verbosity String+ | Flag_Version+ | Flag_CompatibleInterfaceVersions+ | Flag_InterfaceVersion+ | Flag_BypassInterfaceVersonCheck+ | Flag_UseContents String+ | Flag_GenContents+ | Flag_UseIndex String+ | Flag_GenIndex+ | Flag_IgnoreAllExports+ | Flag_HideModule String+ | Flag_ShowModule String+ | Flag_ShowAllModules+ | Flag_ShowExtensions String+ | Flag_OptGhc String+ | Flag_GhcLibDir String+ | Flag_GhcVersion+ | Flag_PrintGhcPath+ | Flag_PrintGhcLibDir+ | Flag_NoWarnings+ | Flag_UseUnicode+ | Flag_NoTmpCompDir+ | Flag_Qualification String+ | Flag_PrettyHtml+ | Flag_NoPrintMissingDocs+ | Flag_PackageName String+ | Flag_PackageVersion String+ | Flag_Reexport String+ | Flag_SinceQualification String+ | Flag_IgnoreLinkSymbol String+ | Flag_ParCount (Maybe Int)+ deriving (Eq, Show)+++options :: Bool -> [OptDescr Flag]+options backwardsCompat =+ [+ Option ['B'] [] (ReqArg Flag_GhcLibDir "DIR")+ "path to a GHC lib dir, to override the default path",+ Option ['o'] ["odir"] (ReqArg Flag_OutputDir "DIR")+ "directory in which to put the output files",+ Option ['l'] ["lib"] (ReqArg Flag_Lib "DIR")+ "location of Haddock's auxiliary files",+ Option ['i'] ["read-interface"] (ReqArg Flag_ReadInterface "FILE")+ "read an interface from FILE",+ Option ['D'] ["dump-interface"] (ReqArg Flag_DumpInterface "FILE")+ "write the resulting interface to FILE",+ Option [] ["show-interface"] (ReqArg Flag_ShowInterface "FILE")+ "print the interface in a human readable form",+-- Option ['S'] ["docbook"] (NoArg Flag_DocBook)+-- "output in DocBook XML",+ Option ['h'] ["html"] (NoArg Flag_Html)+ "output in HTML (XHTML 1.0)",+ Option [] ["latex"] (NoArg Flag_LaTeX) "use experimental LaTeX rendering",+ Option [] ["latex-style"] (ReqArg Flag_LaTeXStyle "FILE") "provide your own LaTeX style in FILE",+ Option [] ["mathjax"] (ReqArg Flag_Mathjax "URL") "URL FOR mathjax",+ Option ['U'] ["use-unicode"] (NoArg Flag_UseUnicode) "use Unicode in HTML output",+ Option [] ["hoogle"] (NoArg Flag_Hoogle)+ "output for Hoogle; you may want --package-name and --package-version too",+ Option [] ["quickjump"] (NoArg Flag_QuickJumpIndex)+ "generate an index for interactive documentation navigation",+ Option [] ["hyperlinked-source"] (NoArg Flag_HyperlinkedSource)+ "generate highlighted and hyperlinked source code (for use with --html)",+ Option [] ["source-css"] (ReqArg Flag_SourceCss "FILE")+ "use custom CSS file instead of default one in hyperlinked source",+ Option [] ["source-base"] (ReqArg Flag_SourceBaseURL "URL")+ "URL for a source code link on the contents\nand index pages",+ Option ['s'] (if backwardsCompat then ["source", "source-module"] else ["source-module"])+ (ReqArg Flag_SourceModuleURL "URL")+ "URL for a source code link for each module\n(using the %{FILE} or %{MODULE} vars)",+ Option [] ["source-entity"] (ReqArg Flag_SourceEntityURL "URL")+ "URL for a source code link for each entity\n(using the %{FILE}, %{MODULE}, %{NAME},\n%{KIND} or %{LINE} vars)",+ Option [] ["source-entity-line"] (ReqArg Flag_SourceLEntityURL "URL")+ "URL for a source code link for each entity.\nUsed if name links are unavailable, eg. for TH splices.",+ Option [] ["comments-base"] (ReqArg Flag_WikiBaseURL "URL")+ "URL for a comments link on the contents\nand index pages",+ Option [] ["base-url"] (ReqArg Flag_BaseURL "URL")+ "Base URL for static assets (eg. css, javascript, json files etc.).\nWhen given statis assets will not be copied.",+ Option [] ["comments-module"] (ReqArg Flag_WikiModuleURL "URL")+ "URL for a comments link for each module\n(using the %{MODULE} var)",+ Option [] ["comments-entity"] (ReqArg Flag_WikiEntityURL "URL")+ "URL for a comments link for each entity\n(using the %{FILE}, %{MODULE}, %{NAME},\n%{KIND} or %{LINE} vars)",+ Option ['c'] ["css", "theme"] (ReqArg Flag_CSS "PATH")+ "the CSS file or theme directory to use for HTML output",+ Option [] ["built-in-themes"] (NoArg Flag_BuiltInThemes)+ "include all the built-in haddock themes",+ Option ['p'] ["prologue"] (ReqArg Flag_Prologue "FILE")+ "file containing prologue text",+ Option ['t'] ["title"] (ReqArg Flag_Heading "TITLE")+ "page heading",+ Option ['q'] ["qual"] (ReqArg Flag_Qualification "QUAL")+ "qualification of names, one of \n'none' (default), 'full', 'local'\n'relative' or 'aliased'",+ Option ['?'] ["help"] (NoArg Flag_Help)+ "display this help and exit",+ Option ['V'] ["version"] (NoArg Flag_Version)+ "output version information and exit",+ Option [] ["compatible-interface-versions"] (NoArg Flag_CompatibleInterfaceVersions)+ "output compatible interface file versions and exit",+ Option [] ["interface-version"] (NoArg Flag_InterfaceVersion)+ "output interface file version and exit",+ Option [] ["bypass-interface-version-check"] (NoArg Flag_BypassInterfaceVersonCheck)+ "bypass the interface file version check (dangerous)",+ Option ['v'] ["verbosity"] (ReqArg Flag_Verbosity "VERBOSITY")+ "set verbosity level",+ Option [] ["use-contents"] (ReqArg Flag_UseContents "URL")+ "use a separately-generated HTML contents page",+ Option [] ["gen-contents"] (NoArg Flag_GenContents)+ "generate an HTML contents from specified\ninterfaces",+ Option [] ["use-index"] (ReqArg Flag_UseIndex "URL")+ "use a separately-generated HTML index",+ Option [] ["gen-index"] (NoArg Flag_GenIndex)+ "generate an HTML index from specified\ninterfaces",+ Option [] ["ignore-all-exports"] (NoArg Flag_IgnoreAllExports)+ "behave as if all modules have the\nignore-exports attribute",+ Option [] ["hide"] (ReqArg Flag_HideModule "MODULE")+ "behave as if MODULE has the hide attribute",+ Option [] ["show"] (ReqArg Flag_ShowModule "MODULE")+ "behave as if MODULE does not have the hide attribute",+ Option [] ["show-all"] (NoArg Flag_ShowAllModules)+ "behave as if not modules have the hide attribute",+ Option [] ["show-extensions"] (ReqArg Flag_ShowExtensions "MODULE")+ "behave as if MODULE has the show-extensions attribute",+ Option [] ["optghc"] (ReqArg Flag_OptGhc "OPTION")+ "option to be forwarded to GHC",+ Option [] ["ghc-version"] (NoArg Flag_GhcVersion)+ "output GHC version in numeric format",+ Option [] ["print-ghc-path"] (NoArg Flag_PrintGhcPath)+ "output path to GHC binary",+ Option [] ["print-ghc-libdir"] (NoArg Flag_PrintGhcLibDir)+ "output GHC lib dir",+ Option ['w'] ["no-warnings"] (NoArg Flag_NoWarnings) "turn off all warnings",+ Option [] ["no-tmp-comp-dir"] (NoArg Flag_NoTmpCompDir)+ "do not re-direct compilation output to a temporary directory",+ Option [] ["pretty-html"] (NoArg Flag_PrettyHtml)+ "generate html with newlines and indenting (for use with --html)",+ Option [] ["no-print-missing-docs"] (NoArg Flag_NoPrintMissingDocs)+ "don't print information about any undocumented entities",+ Option [] ["reexport"] (ReqArg Flag_Reexport "MOD")+ "reexport the module MOD, adding it to the index",+ Option [] ["package-name"] (ReqArg Flag_PackageName "NAME")+ "name of the package being documented",+ Option [] ["package-version"] (ReqArg Flag_PackageVersion "VERSION")+ "version of the package being documented in usual x.y.z.w format",+ Option [] ["since-qual"] (ReqArg Flag_SinceQualification "QUAL")+ "package qualification of @since, one of\n'always' (default) or 'only-external'",+ Option [] ["ignore-link-symbol"] (ReqArg Flag_IgnoreLinkSymbol "SYMBOL")+ "name of a symbol which does not trigger a warning in case of link issue",+ Option ['j'] [] (OptArg (\count -> Flag_ParCount (fmap read count)) "n")+ "load modules in parallel"+ ]+++getUsage :: IO String+getUsage = do+ prog <- getProgramName+ return $ usageInfo (usageHeader prog) (options False)+ where+ usageHeader :: String -> String+ usageHeader prog = "Usage: " ++ prog ++ " [OPTION...] file...\n"+++parseHaddockOpts :: [String] -> IO ([Flag], [String])+parseHaddockOpts params =+ case getOpt Permute (options True) params of+ (flags, args, []) -> return (flags, args)+ (_, _, errors) -> do+ usage <- getUsage+ throwE (concat errors ++ usage)++optPackageVersion :: [Flag] -> Maybe Data.Version.Version+optPackageVersion flags =+ let ver = optLast [ v | Flag_PackageVersion v <- flags ]+ in ver >>= fmap fst . optLast . RP.readP_to_S parseVersion++optPackageName :: [Flag] -> Maybe PackageName+optPackageName flags =+ optLast [ PackageName $ mkFastString n | Flag_PackageName n <- flags ]+++optTitle :: [Flag] -> Maybe String+optTitle flags =+ case [str | Flag_Heading str <- flags] of+ [] -> Nothing+ (t:_) -> Just t+++outputDir :: [Flag] -> FilePath+outputDir flags =+ case [ path | Flag_OutputDir path <- flags ] of+ [] -> "."+ paths -> last paths+++optContentsUrl :: [Flag] -> Maybe String+optContentsUrl flags = optLast [ url | Flag_UseContents url <- flags ]+++optIndexUrl :: [Flag] -> Maybe String+optIndexUrl flags = optLast [ url | Flag_UseIndex url <- flags ]+++optCssFile :: [Flag] -> Maybe FilePath+optCssFile flags = optLast [ str | Flag_CSS str <- flags ]++optSourceCssFile :: [Flag] -> Maybe FilePath+optSourceCssFile flags = optLast [ str | Flag_SourceCss str <- flags ]++sourceUrls :: [Flag] -> (Maybe String, Maybe String, Maybe String, Maybe String)+sourceUrls flags =+ (optLast [str | Flag_SourceBaseURL str <- flags]+ ,optLast [str | Flag_SourceModuleURL str <- flags]+ ,optLast [str | Flag_SourceEntityURL str <- flags]+ ,optLast [str | Flag_SourceLEntityURL str <- flags])+++wikiUrls :: [Flag] -> (Maybe String, Maybe String, Maybe String)+wikiUrls flags =+ (optLast [str | Flag_WikiBaseURL str <- flags]+ ,optLast [str | Flag_WikiModuleURL str <- flags]+ ,optLast [str | Flag_WikiEntityURL str <- flags])+++baseUrl :: [Flag] -> Maybe String+baseUrl flags = optLast [str | Flag_BaseURL str <- flags]++optDumpInterfaceFile :: [Flag] -> Maybe FilePath+optDumpInterfaceFile flags = optLast [ str | Flag_DumpInterface str <- flags ]++optShowInterfaceFile :: [Flag] -> Maybe FilePath+optShowInterfaceFile flags = optLast [ str | Flag_ShowInterface str <- flags ]++optLaTeXStyle :: [Flag] -> Maybe String+optLaTeXStyle flags = optLast [ str | Flag_LaTeXStyle str <- flags ]++optMathjax :: [Flag] -> Maybe String+optMathjax flags = optLast [ str | Flag_Mathjax str <- flags ]++optParCount :: [Flag] -> Maybe (Maybe Int)+optParCount flags = optLast [ n | Flag_ParCount n <- flags ]++qualification :: [Flag] -> Either String QualOption+qualification flags =+ case map (map Char.toLower) [ str | Flag_Qualification str <- flags ] of+ [] -> Right OptNoQual+ ["none"] -> Right OptNoQual+ ["full"] -> Right OptFullQual+ ["local"] -> Right OptLocalQual+ ["relative"] -> Right OptRelativeQual+ ["aliased"] -> Right OptAliasedQual+ [arg] -> Left $ "unknown qualification type " ++ show arg+ _:_ -> Left "qualification option given multiple times"++sinceQualification :: [Flag] -> Either String SinceQual+sinceQualification flags =+ case map (map Char.toLower) [ str | Flag_SinceQualification str <- flags ] of+ [] -> Right Always+ ["always"] -> Right Always+ ["external"] -> Right External+ [arg] -> Left $ "unknown since-qualification type " ++ show arg+ _:_ -> Left "since-qualification option given multiple times"++verbosity :: [Flag] -> Verbosity+verbosity flags =+ case [ str | Flag_Verbosity str <- flags ] of+ [] -> Normal+ x:_ -> case parseVerbosity x of+ Left e -> throwE e+ Right v -> v++-- | Get the ignored symbols from the given flags. These are the symbols for+-- which no link warnings will be generated if their link destinations cannot be+-- determined.+--+-- Symbols may be provided as qualified or unqualified names (e.g.+-- 'Data.Map.dropWhileEnd' or 'dropWhileEnd', resp). If qualified, no link+-- warnings will be produced for occurances of that name when it is imported+-- from that module. If unqualified, no link warnings will be produced for any+-- occurances of that name from any module.+ignoredSymbols :: [Flag] -> Map (Maybe String) (Set String)+ignoredSymbols flags =+ foldr addToMap Map.empty [ splitSymbol symbol | Flag_IgnoreLinkSymbol symbol <- flags ]+ where+ -- Split a symbol into its module name and unqualified name, producing+ -- 'Nothing' for the module name if the given symbol is already unqualified+ splitSymbol :: String -> (Maybe String, String)+ splitSymbol s =+ -- Drop the longest suffix not containing a '.' character+ case dropWhileEnd (/= '.') s of++ -- If the longest suffix is empty, there was no '.'.+ -- Assume it is an unqualified name (no module string).+ "" -> (Nothing, s)++ -- If the longest suffix is not empty, there was a '.'.+ -- Assume it is a qualified name. `s'` will be the module string followed+ -- by the last '.', e.g. "Data.List.", so take `init s'` as the module+ -- string. Drop the length of `s'` from the original string `s` to+ -- obtain to the unqualified name.+ s' -> (Just $ init s', drop (length s') s)++ -- Add a (module name, name) pair to the map from modules to their ignored+ -- symbols+ addToMap :: (Maybe String, String) -> Map (Maybe String) (Set String) -> Map (Maybe String) (Set String)+ addToMap (m, name) symbs = Map.insertWith (Set.union) m (Set.singleton name) symbs++ghcFlags :: [Flag] -> [String]+ghcFlags flags = [ option | Flag_OptGhc option <- flags ]++reexportFlags :: [Flag] -> [String]+reexportFlags flags = [ option | Flag_Reexport option <- flags ]++data Visibility = Visible | Hidden+ deriving (Eq, Show)++readIfaceArgs :: [Flag] -> [(DocPaths, Visibility, FilePath)]+readIfaceArgs flags = [ parseIfaceOption s | Flag_ReadInterface s <- flags ]+ where+ parseIfaceOption :: String -> (DocPaths, Visibility, FilePath)+ parseIfaceOption str =+ case break (==',') str of+ (fpath, ',':rest) ->+ case break (==',') rest of+ (src, ',':rest') ->+ let src' = case src of+ "" -> Nothing+ _ -> Just src+ in+ case break (==',') rest' of+ (visibility, ',':file) | visibility == "hidden" ->+ ((fpath, src'), Hidden, file)+ | otherwise ->+ ((fpath, src'), Visible, file)+ (file, _) ->+ ((fpath, src'), Visible, file)+ (file, _) -> ((fpath, Nothing), Visible, file)+ (file, _) -> (("", Nothing), Visible, file)+++-- | Like 'listToMaybe' but returns the last element instead of the first.+optLast :: [a] -> Maybe a+optLast [] = Nothing+optLast xs = Just (last xs)+++-- | This function has a potential to return 'Nothing' because package name and+-- versions can no longer reliably be extracted in all cases: if the package is+-- not installed yet then this info is no longer available.+--+-- The @--package-name@ and @--package-version@ Haddock flags allow the user to+-- specify this information manually and it is returned here if present.+modulePackageInfo :: UnitState+ -> [Flag] -- ^ Haddock flags are checked as they may contain+ -- the package name or version provided by the user+ -- which we prioritise+ -> Maybe Module+ -> (Maybe PackageName, Maybe Data.Version.Version)+modulePackageInfo _unit_state _flags Nothing = (Nothing, Nothing)+modulePackageInfo unit_state flags (Just modu) =+ ( optPackageName flags <|> fmap unitPackageName pkgDb+ , optPackageVersion flags <|> fmap unitPackageVersion pkgDb+ )+ where+ pkgDb = lookupUnit unit_state (moduleUnit modu)
@@ -0,0 +1,56 @@+-- |+-- Module : Haddock.Parser+-- Copyright : (c) Mateusz Kowalczyk 2013,+-- Simon Hengel 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable++module Haddock.Parser ( parseParas+ , parseString+ , parseIdent+ ) where++import qualified Documentation.Haddock.Parser as P+import Documentation.Haddock.Types+import Haddock.Types++import GHC.Driver.Session ( DynFlags )+import GHC.Driver.Config.Parser (initParserOpts)+import GHC.Data.FastString ( fsLit )+import GHC.Parser.Lexer ( initParserState, unP, ParseResult(POk, PFailed) )+import GHC.Parser ( parseIdentifier )+import GHC.Types.Name.Occurrence ( occNameString )+import GHC.Types.Name.Reader ( RdrName(..) )+import GHC.Types.SrcLoc ( mkRealSrcLoc, GenLocated(..) )+import GHC.Data.StringBuffer ( stringToStringBuffer )+++parseParas :: DynFlags -> Maybe Package -> String -> MetaDoc mod (Wrap NsRdrName)+parseParas d p = overDoc (P.overIdentifier (parseIdent d)) . P.parseParas p++parseString :: DynFlags -> String -> DocH mod (Wrap NsRdrName)+parseString d = P.overIdentifier (parseIdent d) . P.parseString++parseIdent :: DynFlags -> Namespace -> String -> Maybe (Wrap NsRdrName)+parseIdent dflags ns str0 =+ case unP parseIdentifier (pstate str1) of+ POk _ (L _ name)+ -- Guards against things like 'Q.--', 'Q.case', etc.+ -- See https://github.com/haskell/haddock/issues/952 and Trac #14109+ | Qual _ occ <- name+ , PFailed{} <- unP parseIdentifier (pstate (occNameString occ))+ -> Nothing+ | otherwise+ -> Just (wrap (NsRdrName ns name))+ PFailed{} -> Nothing+ where+ realSrcLc = mkRealSrcLoc (fsLit "<unknown file>") 0 0+ pstate str = initParserState (initParserOpts dflags) (stringToStringBuffer str) realSrcLc+ (wrap,str1) = case str0 of+ '(' : s@(c : _) | c /= ',', c /= ')' -- rule out tuple names+ -> (Parenthesized, init s)+ '`' : s@(_ : _) -> (Backticked, init s)+ _ -> (Unadorned, str0)
@@ -0,0 +1,73 @@+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Haddock.Syb+ ( everythingWithState+ , everywhereButType+ , mkT+ , mkQ+ , extQ+ ) where+++import Data.Data+import Data.Maybe+import Data.Foldable++-- | Returns true if a == t.+-- requires AllowAmbiguousTypes+isType :: forall a b. (Typeable a, Typeable b) => b -> Bool+isType _ = isJust $ eqT @a @b++-- | Perform a query with state on each level of a tree.+--+-- This is the same as 'everything' but allows for stateful computations. In+-- SYB it is called @everythingWithContext@ but I find this name somewhat+-- nicer.+everythingWithState :: s -> (r -> r -> r)+ -> (forall a. Data a => a -> s -> (r, s))+ -> (forall a. Data a => a -> r)+everythingWithState s k f x =+ let (r, s') = f x s+ in foldl' k r (gmapQ (everythingWithState s' k f) x)++-- | Variation on everywhere with an extra stop condition+-- Just like 'everything', this is stolen from SYB package.+everywhereBut :: (forall a. Data a => a -> Bool)+ -> (forall a. Data a => a -> a)+ -> (forall a. Data a => a -> a)+everywhereBut q f x+ | q x = x+ | otherwise = f (gmapT (everywhereBut q f) x)++-- | Variation of "everywhere" that does not recurse into children of type t+-- requires AllowAmbiguousTypes+everywhereButType :: forall t . (Typeable t)+ => (forall a. Data a => a -> a)+ -> (forall a. Data a => a -> a)+everywhereButType = everywhereBut (isType @t)++-- | Create generic transformation.+--+-- Another function stolen from SYB package.+mkT :: (Typeable a, Typeable b) => (b -> b) -> (a -> a)+mkT f = case cast f of+ Just f' -> f'+ Nothing -> id++-- | Create generic query.+--+-- Another function stolen from SYB package.+mkQ :: (Typeable a, Typeable b) => r -> (b -> r) -> a -> r+(r `mkQ` br) a = case cast a of+ Just b -> br b+ Nothing -> r+++-- | Extend a generic query by a type-specific case.+--+-- Another function stolen from SYB package.+extQ :: (Typeable a, Typeable b) => (a -> q) -> (b -> q) -> a -> q+extQ f g a = maybe (f a) g (cast a)
@@ -0,0 +1,1142 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PartialTypeSignatures #-}+{-# LANGUAGE UndecidableInstances #-} -- Note [Pass sensitive types]+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Types+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskellorg+-- Stability : experimental+-- Portability : portable+--+-- Types that are commonly used through-out Haddock. Some of the most+-- important types are defined here, like 'Interface' and 'DocName'.+-----------------------------------------------------------------------------+module Haddock.Types (+ module Haddock.Types+ , HsDocString, LHsDocString+ , Fixity(..)+ , module Documentation.Haddock.Types+ ) where++import Control.DeepSeq+import Control.Exception (throw)+import Control.Monad.Catch+import Control.Monad.State.Strict+import Data.Typeable (Typeable)+import Data.Map (Map)+import Data.Data (Data)+import qualified Data.Set as Set+import Documentation.Haddock.Types+import qualified GHC.Data.Strict as Strict+import GHC.Types.Fixity (Fixity(..))+import GHC.Types.Name (stableNameCmp)+import GHC.Types.Name.Reader (RdrName(..))+import GHC.Types.SourceText (SourceText(..))+import GHC.Types.SrcLoc (BufSpan(..), BufPos(..))+import GHC.Types.Var (Specificity)++import GHC+import GHC.Driver.Session (Language)+import qualified GHC.LanguageExtensions as LangExt+import GHC.Types.Name.Occurrence+import GHC.Utils.Outputable++-----------------------------------------------------------------------------+-- * Convenient synonyms+-----------------------------------------------------------------------------+++type IfaceMap = Map Module Interface+type InstIfaceMap = Map Module InstalledInterface -- TODO: rename+type DocMap a = Map Name (MDoc a)+type ArgMap a = Map Name (Map Int (MDoc a))+type SubMap = Map Name [Name]+type DeclMap = Map Name DeclMapEntry+type InstMap = Map RealSrcSpan Name+type FixMap = Map Name Fixity+type DocPaths = (FilePath, Maybe FilePath) -- paths to HTML and sources+type WarningMap = Map Name (Doc Name)+++-----------------------------------------------------------------------------+-- * Interfaces and Interface creation+-----------------------------------------------------------------------------++-- | 'Interface' holds all information used to render a single Haddock page.+-- It represents the /interface/ of a module. The core business of Haddock+-- lies in creating this structure. Note that the record contains some fields+-- that are only used to create the final record, and that are not used by the+-- backends.+data Interface = Interface+ {+ -- | The module behind this interface.+ ifaceMod :: !Module++ -- | Is this a signature?+ , ifaceIsSig :: !Bool++ -- | Original file name of the module.+ , ifaceOrigFilename :: !FilePath++ -- | Textual information about the module.+ , ifaceInfo :: !(HaddockModInfo Name)++ -- | Documentation header.+ , ifaceDoc :: !(Documentation Name)++ -- | Documentation header with cross-reference information.+ , ifaceRnDoc :: !(Documentation DocName)++ -- | Haddock options for this module (prune, ignore-exports, etc).+ , ifaceOptions :: [DocOption]++ -- | Declarations originating from the module. Excludes declarations without+ -- names (instances and stand-alone documentation comments). Includes+ -- names of subordinate declarations mapped to their parent declarations.+ , ifaceDeclMap :: !DeclMap++ -- | Documentation of declarations originating from the module (including+ -- subordinates).+ , ifaceDocMap :: !(DocMap Name)+ , ifaceArgMap :: !(ArgMap Name)++ , ifaceFixMap :: !(Map Name Fixity)++ , ifaceExportItems :: [ExportItem GhcRn]+ , ifaceRnExportItems :: [ExportItem DocNameI]++ -- | All names exported by the module.+ , ifaceExports :: [Name]++ -- | All \"visible\" names exported by the module.+ -- A visible name is a name that will show up in the documentation of the+ -- module.+ , ifaceVisibleExports :: [Name]++ -- | Aliases of module imports as in @import A.B.C as C@.+ , ifaceModuleAliases :: !AliasMap++ -- | Instances exported by the module.+ , ifaceInstances :: [HaddockClsInst]++ -- | Orphan instances+ , ifaceOrphanInstances :: [DocInstance GhcRn]+ , ifaceRnOrphanInstances :: [DocInstance DocNameI]++ -- | The number of haddockable and haddocked items in the module, as a+ -- tuple. Haddockable items are the exports and the module itself.+ , ifaceHaddockCoverage :: (Int, Int)++ -- | Warnings for things defined in this module.+ , ifaceWarningMap :: WarningMap++ -- | Tokenized source code of module (available if Haddock is invoked with+ -- source generation flag).+ , ifaceHieFile :: !(Maybe FilePath)++ , ifaceDynFlags :: !DynFlags+ }++-- | A subset of the fields of 'Interface' that we store in the interface+-- files.+data InstalledInterface = InstalledInterface+ {+ -- | The module represented by this interface.+ instMod :: Module++ -- | Is this a signature?+ , instIsSig :: Bool++ -- | Textual information about the module.+ , instInfo :: HaddockModInfo Name++ -- | Documentation of declarations originating from the module (including+ -- subordinates).+ , instDocMap :: DocMap Name++ , instArgMap :: ArgMap Name++ -- | All names exported by this module.+ , instExports :: [Name]++ -- | All \"visible\" names exported by the module.+ -- A visible name is a name that will show up in the documentation of the+ -- module.+ , instVisibleExports :: [Name]++ -- | Haddock options for this module (prune, ignore-exports, etc).+ , instOptions :: [DocOption]++ , instFixMap :: Map Name Fixity+ }++-- | Convert an 'Interface' to an 'InstalledInterface'+toInstalledIface :: Interface -> InstalledInterface+toInstalledIface interface = InstalledInterface+ { instMod = ifaceMod interface+ , instIsSig = ifaceIsSig interface+ , instInfo = ifaceInfo interface+ , instDocMap = ifaceDocMap interface+ , instArgMap = ifaceArgMap interface+ , instExports = ifaceExports interface+ , instVisibleExports = ifaceVisibleExports interface+ , instOptions = ifaceOptions interface+ , instFixMap = ifaceFixMap interface+ }+++-- | A monad in which we create Haddock interfaces. Not to be confused with+-- `GHC.Tc.Types.IfM` which is used to write GHC interfaces.+--+-- In the past `createInterface` was running in the `Ghc` monad but proved hard+-- to sustain as soon as we moved over for Haddock to be a plugin. Also abstracting+-- over the Ghc specific clarifies where side effects happen.+newtype IfM m a = IfM { unIfM :: StateT (IfEnv m) m a }++deriving newtype instance Functor m => Functor (IfM m)+deriving newtype instance (Monad m, Applicative m) => Applicative (IfM m)+deriving newtype instance Monad m => Monad (IfM m)+deriving newtype instance MonadIO m => MonadIO (IfM m)+deriving newtype instance Monad m => MonadState (IfEnv m) (IfM m)++-- | Interface creation environment. The name sets are used primarily during+-- processing of doc strings to avoid emitting the same type of warning for the+-- same name twice. This was previously done using a Writer monad and then+-- nubbing the list of warning messages after accumulation. This new approach+-- was implemented to avoid the nubbing of potentially large lists of strings.+data IfEnv m = IfEnv+ {+ -- | Lookup names in the environment.+ ifeLookupName :: Name -> m (Maybe TyThing)++ -- | Names which we have warned about for being out of scope+ , ifeOutOfScopeNames :: !(Set.Set String)++ -- | Names which we have warned about for being ambiguous+ , ifeAmbiguousNames :: !(Set.Set String)++ -- | Named which we have warned about for being inappropriately namespaced+ -- as values+ , ifeInvalidValues :: !(Set.Set String)+ }++-- | Run an `IfM` action.+runIfM+ :: (Monad m)+ -- | Lookup a global name in the current session. Used in cases+ -- where declarations don't+ => (Name -> m (Maybe TyThing))+ -- | The action to run.+ -> IfM m a+ -- | Result and accumulated error/warning messages.+ -> m a+runIfM lookup_name action = do+ let+ if_env = IfEnv+ {+ ifeLookupName = lookup_name+ , ifeOutOfScopeNames = Set.empty+ , ifeAmbiguousNames = Set.empty+ , ifeInvalidValues = Set.empty+ }+ evalStateT (unIfM action) if_env++-- | Look up a name in the current environment+lookupName :: Monad m => Name -> IfM m (Maybe TyThing)+lookupName name = IfM $ do+ lookup_name <- gets ifeLookupName+ lift (lookup_name name)++-- | Very basic logging function that simply prints to stdout+warn :: MonadIO m => String -> IfM m ()+warn msg = liftIO $ putStrLn msg++-----------------------------------------------------------------------------+-- * Export items & declarations+-----------------------------------------------------------------------------+++data ExportItem name++ -- | An exported declaration.+ = ExportDecl (XExportDecl name)++ -- | An exported entity for which we have no documentation (perhaps because it+ -- resides in another package).+ | ExportNoDecl+ { expItemName :: !(IdP name)++ -- | Subordinate names.+ , expItemSubs :: [IdP name]+ }++ -- | A section heading.+ | ExportGroup+ {+ -- | Section level (1, 2, 3, ...).+ expItemSectionLevel :: !Int++ -- | Section id (for hyperlinks).+ , expItemSectionId :: !String++ -- | Section heading text.+ , expItemSectionText :: !(Doc (IdP name))+ }++ -- | Some documentation.+ | ExportDoc !(MDoc (IdP name))++ -- | A cross-reference to another module.+ | ExportModule !Module++-- | A type family mapping a name type index to types of export declarations.+-- The pre-renaming type index ('GhcRn') is mapped to the type of export+-- declarations which do not include Hoogle output ('ExportD'), since Hoogle output is+-- generated during the Haddock renaming step. The post-renaming type index+-- ('DocNameI') is mapped to the type of export declarations which do include+-- Hoogle output ('RnExportD').+type family XExportDecl x where+ XExportDecl GhcRn = ExportD GhcRn+ XExportDecl DocNameI = RnExportD++-- | Represents an export declaration that Haddock has discovered to be exported+-- from a module. The @name@ index indicated whether the declaration has been+-- renamed such that each 'Name' points to it's optimal link destination.+data ExportD name = ExportD+ {+ -- | A declaration.+ expDDecl :: !(LHsDecl name)++ -- | Bundled patterns for a data type declaration+ , expDPats :: [(HsDecl name, DocForDecl (IdP name))]++ -- | Maybe a doc comment, and possibly docs for arguments (if this+ -- decl is a function or type-synonym).+ , expDMbDoc :: !(DocForDecl (IdP name))++ -- | Subordinate names, possibly with documentation.+ , expDSubDocs :: [(IdP name, DocForDecl (IdP name))]++ -- | Instances relevant to this declaration, possibly with+ -- documentation.+ , expDInstances :: [DocInstance name]++ -- | Fixity decls relevant to this declaration (including subordinates).+ , expDFixities :: [(IdP name, Fixity)]++ -- | Whether the ExportD is from a TH splice or not, for generating+ -- the appropriate type of Source link.+ , expDSpliced :: !Bool+ }++-- | Represents export declarations that have undergone renaming such that every+-- 'Name' in the declaration points to an optimal link destination. Since Hoogle+-- output is also generated during the renaming step, each declaration is also+-- attached to its Hoogle textual database entries, /if/ Hoogle output is+-- enabled and the module is not hidden in the generated documentation using the+-- @{-# OPTIONS_HADDOCK hide #-}@ pragma.+data RnExportD = RnExportD+ {+ -- | The renamed export declaration+ rnExpDExpD :: !(ExportD DocNameI)++ -- | If Hoogle textbase (textual database) output is enabled, the text+ -- output lines for this declaration. If Hoogle output is not enabled, the+ -- list will be empty.+ , rnExpDHoogle :: [String]+ }++data Documentation name = Documentation+ { documentationDoc :: Maybe (MDoc name)+ , documentationWarning :: Maybe (Doc name)+ } deriving Functor++instance NFData name => NFData (Documentation name) where+ rnf (Documentation d w) = d `deepseq` w `deepseq` ()++-- | Arguments and result are indexed by Int, zero-based from the left,+-- because that's the easiest to use when recursing over types.+type FnArgsDoc name = Map Int (MDoc name)+type DocForDecl name = (Documentation name, FnArgsDoc name)++noDocForDecl :: DocForDecl name+noDocForDecl = (Documentation Nothing Nothing, mempty)++-- | As we build the declaration map, we really only care to track whether we+-- have only seen a value declaration for a 'Name', or anything else. This type+-- is used to represent those cases. If the only declaration attached to a+-- 'Name' is a 'ValD', we will consult the GHC interface file to determine the+-- type of the value, and attach the 'SrcSpan' from the 'EValD' constructor to+-- it. If we see any other type of declaration for the 'Name', we can just use+-- it.+--+-- This type saves us from storing /every/ declaration we see for a given 'Name'+-- in the map, which is unnecessary and very problematic for overall memory+-- usage.+data DeclMapEntry+ = EValD !SrcSpan+ | EOther (LHsDecl GhcRn)++instance Semigroup DeclMapEntry where+ (EValD _) <> e = e+ e <> _ = e++-- | Transform a declaration into a 'DeclMapEntry'. If it is a 'ValD'+-- declaration, only the source location will be noted (since that is all we+-- care to store in the 'DeclMap' due to the way top-level bindings with no type+-- signatures are handled). Otherwise, the entire declaration will be kept.+toDeclMapEntry :: LHsDecl GhcRn -> DeclMapEntry+toDeclMapEntry (L l (ValD _ _)) = EValD (locA l)+toDeclMapEntry d = EOther d++-----------------------------------------------------------------------------+-- * Cross-referencing+-----------------------------------------------------------------------------+++-- | Type of environment used to cross-reference identifiers in the syntax.+type LinkEnv = Map Name Module++-- | An 'RdrName' tagged with some type/value namespace information.+data NsRdrName = NsRdrName+ { namespace :: !Namespace+ , rdrName :: !RdrName+ }++instance NFData NsRdrName where+ rnf (NsRdrName ns rdrN) = ns `seq` rdrN `deepseq` ()++-- | Extends 'Name' with cross-reference information.+data DocName+ = Documented Name Module+ -- ^ This thing is part of the (existing or resulting)+ -- documentation. The 'Module' is the preferred place+ -- in the documentation to refer to.+ | Undocumented Name+ -- ^ This thing is not part of the (existing or resulting)+ -- documentation, as far as Haddock knows.+ deriving (Eq, Data)++data DocNameI++type instance NoGhcTc DocNameI = DocNameI++type instance IdP DocNameI = DocName++instance CollectPass DocNameI where+ collectXXPat _ ext = dataConCantHappen ext+ collectXXHsBindsLR ext = dataConCantHappen ext+ collectXSplicePat _ ext = dataConCantHappen ext++instance NamedThing DocName where+ getName (Documented name _) = name+ getName (Undocumented name) = name++-- | Useful for debugging+instance Outputable DocName where+ ppr = ppr . getName++instance OutputableBndr DocName where+ pprBndr _ = ppr . getName+ pprPrefixOcc = pprPrefixOcc . getName+ pprInfixOcc = pprInfixOcc . getName++class NamedThing name => SetName name where++ setName :: Name -> name -> name+++instance SetName Name where++ setName name' _ = name'+++instance SetName DocName where++ setName name' (Documented _ mdl) = Documented name' mdl+ setName name' (Undocumented _) = Undocumented name'++-- | Adds extra "wrapper" information to a name.+--+-- This is to work around the fact that most name types in GHC ('Name', 'RdrName',+-- 'OccName', ...) don't include backticks or parens.+data Wrap n+ = Unadorned { unwrap :: n } -- ^ don't do anything to the name+ | Parenthesized { unwrap :: n } -- ^ add parentheses around the name+ | Backticked { unwrap :: n } -- ^ add backticks around the name+ deriving (Show, Functor, Foldable, Traversable)++instance NFData n => NFData (Wrap n) where+ rnf w = case w of+ Unadorned n -> rnf n+ Parenthesized n -> rnf n+ Backticked n -> rnf n++-- | Useful for debugging+instance Outputable n => Outputable (Wrap n) where+ ppr (Unadorned n) = ppr n+ ppr (Parenthesized n) = hcat [ char '(', ppr n, char ')' ]+ ppr (Backticked n) = hcat [ char '`', ppr n, char '`' ]++showWrapped :: (a -> String) -> Wrap a -> String+showWrapped f (Unadorned n) = f n+showWrapped f (Parenthesized n) = "(" ++ f n ++ ")"+showWrapped f (Backticked n) = "`" ++ f n ++ "`"++instance HasOccName DocName where++ occName = occName . getName++-----------------------------------------------------------------------------+-- * Instances+-----------------------------------------------------------------------------++data HaddockClsInst = HaddockClsInst+ { haddockClsInstPprHoogle :: Maybe String+ , haddockClsInstName :: Name+ , haddockClsInstClsName :: Name+ , haddockClsInstIsOrphan :: Bool+ , haddockClsInstHead :: ([Int], SName, [SimpleType])+ , haddockClsInstSynified :: InstHead GhcRn+ , haddockClsInstTyNames :: Set.Set Name+ }++-- | TODO: This instance is not lawful. We leave the 'InstHead' segment of the+-- class instance evaluated only to WHNF. This should probably be fixed.+instance NFData HaddockClsInst where+ rnf (HaddockClsInst h n cn o hd s ns) =+ h+ `deepseq` n+ `deepseq` cn+ `deepseq` o+ `deepseq` hd+ `deepseq` s+ `seq` ns+ `deepseq` ()++-- | Stable name for stable comparisons. GHC's `Name` uses unstable+-- ordering based on their `Unique`'s.+newtype SName = SName Name+ deriving newtype NFData++instance Eq SName where+ SName n1 == SName n2 = n1 `stableNameCmp` n2 == EQ++instance Ord SName where+ SName n1 `compare` SName n2 = n1 `stableNameCmp` n2++-- | Simplified type for sorting types, ignoring qualification (not visible+-- in Haddock output) and unifying special tycons with normal ones.+-- For the benefit of the user (looks nice and predictable) and the+-- tests (which prefer output to be deterministic).+data SimpleType = SimpleType SName [SimpleType]+ | SimpleIntTyLit Integer+ | SimpleStringTyLit String+ | SimpleCharTyLit Char+ deriving (Eq,Ord)++instance NFData SimpleType where+ rnf st =+ case st of+ SimpleType sn sts -> sn `deepseq` sts `deepseq` ()+ SimpleIntTyLit i -> rnf i+ SimpleStringTyLit s -> rnf s+ SimpleCharTyLit c -> rnf c++-- | The three types of instances+data InstType name+ = ClassInst+ { clsiCtx :: [HsType name]+ , clsiTyVars :: LHsQTyVars name+ , clsiSigs :: [Sig name]+ , clsiAssocTys :: [PseudoFamilyDecl name]+ }+ | TypeInst (Maybe (HsType name)) -- ^ Body (right-hand side)+ | DataInst (TyClDecl name) -- ^ Data constructors++instance (OutputableBndrId p)+ => Outputable (InstType (GhcPass p)) where+ ppr (ClassInst { .. }) = text "ClassInst"+ <+> ppr clsiCtx+ <+> ppr clsiTyVars+ <+> ppr clsiSigs+ ppr (TypeInst a) = text "TypeInst" <+> ppr a+ ppr (DataInst a) = text "DataInst" <+> ppr a+++-- | Almost the same as 'FamilyDecl' except for type binders.+--+-- In order to perform type specialization for class instances, we need to+-- substitute class variables to appropriate type. However, type variables in+-- associated type are specified using 'LHsTyVarBndrs' instead of 'HsType'.+-- This makes type substitution impossible and to overcome this issue,+-- 'PseudoFamilyDecl' type is introduced.+data PseudoFamilyDecl name = PseudoFamilyDecl+ { pfdInfo :: FamilyInfo name+ , pfdLName :: LocatedN (IdP name)+ , pfdTyVars :: [LHsType name]+ , pfdKindSig :: LFamilyResultSig name+ }+++mkPseudoFamilyDecl :: FamilyDecl GhcRn -> PseudoFamilyDecl GhcRn+mkPseudoFamilyDecl (FamilyDecl { .. }) = PseudoFamilyDecl+ { pfdInfo = fdInfo+ , pfdLName = fdLName+ , pfdTyVars = [ L loc (mkType bndr) | L loc bndr <- hsq_explicit fdTyVars ]+ , pfdKindSig = fdResultSig+ }+ where+ mkType :: HsTyVarBndr flag GhcRn -> HsType GhcRn+ mkType (KindedTyVar _ _ (L loc name) lkind) =+ HsKindSig noAnn tvar lkind+ where+ tvar = L (na2la loc) (HsTyVar noAnn NotPromoted (L loc name))+ mkType (UserTyVar _ _ name) = HsTyVar noAnn NotPromoted name+++-- | An instance head that may have documentation and a source location.+type DocInstance name = (InstHead name, Maybe (MDoc (IdP name)), Located (IdP name), Maybe Module)++-- | The head of an instance. Consists of a class name, a list of type+-- parameters (which may be annotated with kinds), and an instance type+data InstHead name = InstHead+ { ihdClsName :: IdP name+ , ihdTypes :: [HsType name]+ , ihdInstType :: InstType name+ }+++-- | An instance origin information.+--+-- This is used primarily in HTML backend to generate unique instance+-- identifiers (for expandable sections).+data InstOrigin name+ = OriginClass name+ | OriginData name+ | OriginFamily name+++instance NamedThing name => NamedThing (InstOrigin name) where++ getName (OriginClass name) = getName name+ getName (OriginData name) = getName name+ getName (OriginFamily name) = getName name+++-----------------------------------------------------------------------------+-- * Documentation comments+-----------------------------------------------------------------------------+++type LDoc id = Located (Doc id)++type Doc id = DocH (Wrap (ModuleName, OccName)) (Wrap id)+type MDoc id = MetaDoc (Wrap (ModuleName, OccName)) (Wrap id)++type DocMarkup id a = DocMarkupH (Wrap (ModuleName, OccName)) id a++instance NFData Meta where+ rnf (Meta v p) = v `deepseq` p `deepseq` ()++instance NFData id => NFData (MDoc id) where+ rnf (MetaDoc m d) = m `deepseq` d `deepseq` ()++instance (NFData a, NFData mod)+ => NFData (DocH mod a) where+ rnf doc = case doc of+ DocEmpty -> ()+ DocAppend a b -> a `deepseq` b `deepseq` ()+ DocString a -> a `deepseq` ()+ DocParagraph a -> a `deepseq` ()+ DocIdentifier a -> a `deepseq` ()+ DocIdentifierUnchecked a -> a `deepseq` ()+ DocModule a -> a `deepseq` ()+ DocWarning a -> a `deepseq` ()+ DocEmphasis a -> a `deepseq` ()+ DocBold a -> a `deepseq` ()+ DocMonospaced a -> a `deepseq` ()+ DocUnorderedList a -> a `deepseq` ()+ DocOrderedList a -> a `deepseq` ()+ DocDefList a -> a `deepseq` ()+ DocCodeBlock a -> a `deepseq` ()+ DocHyperlink a -> a `deepseq` ()+ DocPic a -> a `deepseq` ()+ DocMathInline a -> a `deepseq` ()+ DocMathDisplay a -> a `deepseq` ()+ DocAName a -> a `deepseq` ()+ DocProperty a -> a `deepseq` ()+ DocExamples a -> a `deepseq` ()+ DocHeader a -> a `deepseq` ()+ DocTable a -> a `deepseq` ()++#if !MIN_VERSION_ghc(8,0,2)+-- These were added to GHC itself in 8.0.2+instance NFData Name where rnf x = seq x ()+instance NFData OccName where rnf x = seq x ()+instance NFData ModuleName where rnf x = seq x ()+#endif++instance NFData id => NFData (Header id) where+ rnf (Header a b) = a `deepseq` b `deepseq` ()++instance NFData id => NFData (Hyperlink id) where+ rnf (Hyperlink a b) = a `deepseq` b `deepseq` ()++instance NFData id => NFData (ModLink id) where+ rnf (ModLink a b) = a `deepseq` b `deepseq` ()++instance NFData Picture where+ rnf (Picture a b) = a `deepseq` b `deepseq` ()++instance NFData Example where+ rnf (Example a b) = a `deepseq` b `deepseq` ()++instance NFData id => NFData (Table id) where+ rnf (Table h b) = h `deepseq` b `deepseq` ()++instance NFData id => NFData (TableRow id) where+ rnf (TableRow cs) = cs `deepseq` ()++instance NFData id => NFData (TableCell id) where+ rnf (TableCell i j c) = i `deepseq` j `deepseq` c `deepseq` ()++exampleToString :: Example -> String+exampleToString (Example expression result) =+ ">>> " ++ expression ++ "\n" ++ unlines result++instance NFData name => NFData (HaddockModInfo name) where+ rnf (HaddockModInfo{..}) =+ hmi_description+ `deepseq` hmi_copyright+ `deepseq` hmi_license+ `deepseq` hmi_maintainer+ `deepseq` hmi_stability+ `deepseq` hmi_portability+ `deepseq` hmi_safety+ `deepseq` hmi_language+ `deepseq` hmi_extensions+ `deepseq` ()++instance NFData LangExt.Extension++data HaddockModInfo name = HaddockModInfo+ { hmi_description :: Maybe (Doc name)+ , hmi_copyright :: Maybe String+ , hmi_license :: Maybe String+ , hmi_maintainer :: Maybe String+ , hmi_stability :: Maybe String+ , hmi_portability :: Maybe String+ , hmi_safety :: Maybe String+ , hmi_language :: Maybe Language+ , hmi_extensions :: [LangExt.Extension]+ }++emptyHaddockModInfo :: HaddockModInfo a+emptyHaddockModInfo = HaddockModInfo+ { hmi_description = Nothing+ , hmi_copyright = Nothing+ , hmi_license = Nothing+ , hmi_maintainer = Nothing+ , hmi_stability = Nothing+ , hmi_portability = Nothing+ , hmi_safety = Nothing+ , hmi_language = Nothing+ , hmi_extensions = []+ }+++-----------------------------------------------------------------------------+-- * Options+-----------------------------------------------------------------------------+++-- | Source-level options for controlling the documentation.+data DocOption+ = OptHide -- ^ This module should not appear in the docs.+ | OptPrune+ | OptIgnoreExports -- ^ Pretend everything is exported.+ | OptNotHome -- ^ Not the best place to get docs for things+ -- exported by this module.+ | OptShowExtensions -- ^ Render enabled extensions for this module.+ deriving (Eq, Show)+++-- | Option controlling how to qualify names+data QualOption+ = OptNoQual -- ^ Never qualify any names.+ | OptFullQual -- ^ Qualify all names fully.+ | OptLocalQual -- ^ Qualify all imported names fully.+ | OptRelativeQual -- ^ Like local, but strip module prefix+ -- from modules in the same hierarchy.+ | OptAliasedQual -- ^ Uses aliases of module names+ -- as suggested by module import renamings.+ -- However, we are unfortunately not able+ -- to maintain the original qualifications.+ -- Image a re-export of a whole module,+ -- how could the re-exported identifiers be qualified?++type AliasMap = Map Module ModuleName++data Qualification+ = NoQual+ | FullQual+ | LocalQual Module+ | RelativeQual Module+ | AliasedQual AliasMap Module+ -- ^ @Module@ contains the current module.+ -- This way we can distinguish imported and local identifiers.++makeContentsQual :: QualOption -> Qualification+makeContentsQual qual =+ case qual of+ OptNoQual -> NoQual+ _ -> FullQual++makeModuleQual :: QualOption -> AliasMap -> Module -> Qualification+makeModuleQual qual aliases mdl =+ case qual of+ OptLocalQual -> LocalQual mdl+ OptRelativeQual -> RelativeQual mdl+ OptAliasedQual -> AliasedQual aliases mdl+ OptFullQual -> FullQual+ OptNoQual -> NoQual++-- | Whether to hide empty contexts+-- Since pattern synonyms have two contexts with different semantics, it is+-- important to all of them, even if one of them is empty.+data HideEmptyContexts+ = HideEmptyContexts+ | ShowEmptyToplevelContexts++-- | When to qualify @since@ annotations with their package+data SinceQual+ = Always+ | External -- ^ only qualify when the thing being annotated is from+ -- an external package++-----------------------------------------------------------------------------+-- * Error handling+-----------------------------------------------------------------------------++-- | Haddock's own exception type.+data HaddockException+ = HaddockException String+ | WithContext [String] SomeException+ deriving Typeable++instance Show HaddockException where+ show (HaddockException str) = str+ show (WithContext ctxts se) = unlines $ ["While " ++ ctxt ++ ":\n" | ctxt <- reverse ctxts] ++ [show se]++throwE :: String -> a+instance Exception HaddockException+throwE str = throw (HaddockException str)++withExceptionContext :: MonadCatch m => String -> m a -> m a+withExceptionContext ctxt =+ handle (\ex ->+ case ex of+ HaddockException _ -> throwM $ WithContext [ctxt] (toException ex)+ WithContext ctxts se -> throwM $ WithContext (ctxt:ctxts) se+ ) .+ handle (throwM . WithContext [ctxt])++-----------------------------------------------------------------------------+-- * Pass sensitive types+-----------------------------------------------------------------------------++type instance XRec DocNameI a = GenLocated (Anno a) a+instance UnXRec DocNameI where+ unXRec = unLoc+instance MapXRec DocNameI where+ mapXRec = fmap+instance WrapXRec DocNameI (HsType DocNameI) where+ wrapXRec = noLocA++type instance Anno DocName = SrcSpanAnnN+type instance Anno (HsTyVarBndr flag DocNameI) = SrcSpanAnnA+type instance Anno [LocatedA (HsType DocNameI)] = SrcSpanAnnC+type instance Anno (HsType DocNameI) = SrcSpanAnnA+type instance Anno (DataFamInstDecl DocNameI) = SrcSpanAnnA+type instance Anno (DerivStrategy DocNameI) = SrcAnn NoEpAnns+type instance Anno (FieldOcc DocNameI) = SrcAnn NoEpAnns+type instance Anno (ConDeclField DocNameI) = SrcSpan+type instance Anno (Located (ConDeclField DocNameI)) = SrcSpan+type instance Anno [Located (ConDeclField DocNameI)] = SrcSpan+type instance Anno (ConDecl DocNameI) = SrcSpan+type instance Anno (FunDep DocNameI) = SrcSpan+type instance Anno (TyFamInstDecl DocNameI) = SrcSpanAnnA+type instance Anno [LocatedA (TyFamInstDecl DocNameI)] = SrcSpanAnnL+type instance Anno (FamilyDecl DocNameI) = SrcSpan+type instance Anno (Sig DocNameI) = SrcSpan+type instance Anno (InjectivityAnn DocNameI) = SrcAnn NoEpAnns+type instance Anno (HsDecl DocNameI) = SrcSpanAnnA+type instance Anno (FamilyResultSig DocNameI) = SrcAnn NoEpAnns+type instance Anno (HsOuterTyVarBndrs Specificity DocNameI) = SrcSpanAnnA+type instance Anno (HsSigType DocNameI) = SrcSpanAnnA++type XRecCond a+ = ( XParTy a ~ EpAnn AnnParen+ , NoGhcTc a ~ a+ , MapXRec a+ , UnXRec a+ , WrapXRec a (HsType a)+ )++type instance XForAllTy DocNameI = EpAnn [AddEpAnn]+type instance XQualTy DocNameI = EpAnn [AddEpAnn]+type instance XTyVar DocNameI = EpAnn [AddEpAnn]+type instance XStarTy DocNameI = EpAnn [AddEpAnn]+type instance XAppTy DocNameI = EpAnn [AddEpAnn]+type instance XAppKindTy DocNameI = EpAnn [AddEpAnn]+type instance XFunTy DocNameI = EpAnn [AddEpAnn]+type instance XListTy DocNameI = EpAnn AnnParen+type instance XTupleTy DocNameI = EpAnn AnnParen+type instance XSumTy DocNameI = EpAnn AnnParen+type instance XOpTy DocNameI = EpAnn [AddEpAnn]+type instance XParTy DocNameI = EpAnn AnnParen+type instance XIParamTy DocNameI = EpAnn [AddEpAnn]+type instance XKindSig DocNameI = EpAnn [AddEpAnn]+type instance XSpliceTy DocNameI = DataConCantHappen+type instance XDocTy DocNameI = EpAnn [AddEpAnn]+type instance XBangTy DocNameI = EpAnn [AddEpAnn]+type instance XRecTy DocNameI = EpAnn [AddEpAnn]+type instance XExplicitListTy DocNameI = EpAnn [AddEpAnn]+type instance XExplicitTupleTy DocNameI = EpAnn [AddEpAnn]+type instance XTyLit DocNameI = EpAnn [AddEpAnn]+type instance XWildCardTy DocNameI = EpAnn [AddEpAnn]+type instance XXType DocNameI = HsCoreTy++type instance XNumTy DocNameI = NoExtField+type instance XStrTy DocNameI = NoExtField+type instance XCharTy DocNameI = NoExtField+type instance XXTyLit DocNameI = DataConCantHappen++type instance XHsForAllVis DocNameI = NoExtField+type instance XHsForAllInvis DocNameI = NoExtField+type instance XXHsForAllTelescope DocNameI = DataConCantHappen++type instance XUserTyVar DocNameI = NoExtField+type instance XKindedTyVar DocNameI = NoExtField+type instance XXTyVarBndr DocNameI = DataConCantHappen++type instance XCFieldOcc DocNameI = DocName+type instance XXFieldOcc DocNameI = NoExtField++type instance XFixitySig DocNameI = NoExtField+type instance XFixSig DocNameI = NoExtField+type instance XPatSynSig DocNameI = NoExtField+type instance XClassOpSig DocNameI = NoExtField+type instance XTypeSig DocNameI = NoExtField+type instance XMinimalSig DocNameI = NoExtField++type instance XForeignExport DocNameI = NoExtField+type instance XForeignImport DocNameI = NoExtField++type instance XCImport DocNameI = NoExtField+type instance XCExport DocNameI = NoExtField++type instance XXForeignImport DocNameI = DataConCantHappen+type instance XXForeignExport DocNameI = DataConCantHappen++type instance XConDeclGADT DocNameI = NoExtField+type instance XConDeclH98 DocNameI = NoExtField+type instance XXConDecl DocNameI = DataConCantHappen++type instance XDerivD DocNameI = NoExtField+type instance XInstD DocNameI = NoExtField+type instance XForD DocNameI = NoExtField+type instance XSigD DocNameI = NoExtField+type instance XTyClD DocNameI = NoExtField++type instance XNoSig DocNameI = NoExtField+type instance XCKindSig DocNameI = NoExtField+type instance XTyVarSig DocNameI = NoExtField+type instance XXFamilyResultSig DocNameI = DataConCantHappen++type instance XCFamEqn DocNameI _ = NoExtField+type instance XXFamEqn DocNameI _ = DataConCantHappen++type instance XCClsInstDecl DocNameI = NoExtField+type instance XCDerivDecl DocNameI = NoExtField+type instance XStockStrategy DocNameI = NoExtField+type instance XAnyClassStrategy DocNameI = NoExtField+type instance XNewtypeStrategy DocNameI = NoExtField+type instance XViaStrategy DocNameI = LHsSigType DocNameI+type instance XDataFamInstD DocNameI = NoExtField+type instance XTyFamInstD DocNameI = NoExtField+type instance XClsInstD DocNameI = NoExtField+type instance XCHsDataDefn DocNameI = NoExtField+type instance XCFamilyDecl DocNameI = NoExtField+type instance XClassDecl DocNameI = NoExtField+type instance XDataDecl DocNameI = NoExtField+type instance XSynDecl DocNameI = NoExtField+type instance XFamDecl DocNameI = NoExtField+type instance XXFamilyDecl DocNameI = DataConCantHappen+type instance XXTyClDecl DocNameI = DataConCantHappen++type instance XHsWC DocNameI _ = NoExtField++type instance XHsOuterExplicit DocNameI _ = NoExtField+type instance XHsOuterImplicit DocNameI = NoExtField+type instance XXHsOuterTyVarBndrs DocNameI = DataConCantHappen++type instance XHsSig DocNameI = NoExtField+type instance XXHsSigType DocNameI = DataConCantHappen++type instance XHsQTvs DocNameI = NoExtField+type instance XConDeclField DocNameI = NoExtField+type instance XXConDeclField DocNameI = DataConCantHappen++type instance XXPat DocNameI = DataConCantHappen+type instance XXHsBindsLR DocNameI a = DataConCantHappen++type instance XSplicePat DocNameI = DataConCantHappen++type instance XCInjectivityAnn DocNameI = NoExtField++type instance XCFunDep DocNameI = NoExtField++type instance XCTyFamInstDecl DocNameI = NoExtField++-----------------------------------------------------------------------------+-- * NFData instances for GHC types+-----------------------------------------------------------------------------++instance NFData RdrName where+ rnf (Unqual on) = rnf on+ rnf (Qual mn on) = mn `deepseq` on `deepseq` ()+ rnf (Orig m on) = m `deepseq` on `deepseq` ()+ rnf (Exact n) = rnf n++instance NFData SourceText where+ rnf NoSourceText = ()+ rnf (SourceText s) = rnf s++instance NFData FixityDirection where+ rnf InfixL = ()+ rnf InfixR = ()+ rnf InfixN = ()++instance NFData Fixity where+ rnf (Fixity sourceText n dir) =+ sourceText `deepseq` n `deepseq` dir `deepseq` ()++instance NFData ann => NFData (SrcSpanAnn' ann) where+ rnf (SrcSpanAnn a ss) = a `deepseq` ss `deepseq` ()++instance NFData (EpAnn NameAnn) where+ rnf EpAnnNotUsed = ()+ rnf (EpAnn en ann cs) = en `deepseq` ann `deepseq` cs `deepseq` ()++instance NFData NameAnn where+ rnf (NameAnn a b c d e) =+ a+ `deepseq` b+ `deepseq` c+ `deepseq` d+ `deepseq` e+ `deepseq` ()+ rnf (NameAnnCommas a b c d e) =+ a+ `deepseq` b+ `deepseq` c+ `deepseq` d+ `deepseq` e+ `deepseq` ()+ rnf (NameAnnBars a b c d e) =+ a+ `deepseq` b+ `deepseq` c+ `deepseq` d+ `deepseq` e+ `deepseq` ()+ rnf (NameAnnOnly a b c d) =+ a+ `deepseq` b+ `deepseq` c+ `deepseq` d+ `deepseq` ()+ rnf (NameAnnRArrow a b) =+ a+ `deepseq` b+ `deepseq` ()+ rnf (NameAnnQuote a b c) =+ a+ `deepseq` b+ `deepseq` c+ `deepseq` ()+ rnf (NameAnnTrailing a) = rnf a++instance NFData TrailingAnn where+ rnf (AddSemiAnn epaL) = rnf epaL+ rnf (AddCommaAnn epaL) = rnf epaL+ rnf (AddVbarAnn epaL) = rnf epaL++instance NFData NameAdornment where+ rnf NameParens = ()+ rnf NameParensHash = ()+ rnf NameBackquotes = ()+ rnf NameSquare = ()++instance NFData EpaLocation where+ rnf (EpaSpan ss bs) = ss `seq` bs `deepseq` ()+ rnf (EpaDelta dp lc) = dp `seq` lc `deepseq` ()++instance NFData EpAnnComments where+ rnf (EpaComments cs) = rnf cs+ rnf (EpaCommentsBalanced cs1 cs2) = cs1 `deepseq` cs2 `deepseq` ()++instance NFData EpaComment where+ rnf (EpaComment t rss) = t `deepseq` rss `seq` ()++instance NFData EpaCommentTok where+ rnf (EpaDocComment ds) = rnf ds+ rnf (EpaDocOptions s) = rnf s+ rnf (EpaLineComment s) = rnf s+ rnf (EpaBlockComment s) = rnf s+ rnf EpaEofComment = ()+++instance NFData a => NFData (Strict.Maybe a) where+ rnf Strict.Nothing = ()+ rnf (Strict.Just x) = rnf x++instance NFData BufSpan where+ rnf (BufSpan p1 p2) = p1 `deepseq` p2 `deepseq` ()++instance NFData BufPos where+ rnf (BufPos n) = rnf n++instance NFData Anchor where+ rnf (Anchor ss op) = ss `seq` op `deepseq` ()++instance NFData AnchorOperation where+ rnf UnchangedAnchor = ()+ rnf (MovedAnchor dp) = rnf dp++instance NFData DeltaPos where+ rnf (SameLine n) = rnf n+ rnf (DifferentLine n m) = n `deepseq` m `deepseq` ()+
@@ -0,0 +1,343 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}++{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Utils+-- Copyright : (c) The University of Glasgow 2001-2002,+-- Simon Marlow 2003-2006,+-- David Waern 2006-2009+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Utils (++ -- * Filename utilities+ moduleHtmlFile, moduleHtmlFile',+ contentsHtmlFile, indexHtmlFile, indexJsonFile,+ subIndexHtmlFile,+ haddockJsFile, jsQuickJumpFile,+ quickJumpCssFile,++ -- * Anchor and URL utilities+ moduleNameUrl, moduleNameUrl', moduleUrl,+ nameAnchorId,+ makeAnchorId,++ -- * Miscellaneous utilities+ getProgramName, bye, die, escapeStr,+ writeUtf8File, withTempDir,++ -- * HTML cross reference mapping+ html_xrefs_ref, html_xrefs_ref',++ -- * Doc markup+ mkMeta,++ -- * List utilities+ replace,+ spanWith,++ -- * Logging+ parseVerbosity, Verbosity(..), silent, normal, verbose, deafening,+ out,++ -- * System tools+ getProcessID+ ) where+++import Documentation.Haddock.Doc (emptyMetaDoc)+import Haddock.Types++import GHC+import GHC.Types.Name++import Control.Monad.IO.Class ( MonadIO(..) )+import Control.Monad.Catch ( MonadMask, bracket_ )+import Data.Char ( isAlpha, isAlphaNum, isAscii, ord, chr )+import Numeric ( showIntAtBase )+import Data.Map ( Map )+import qualified Data.Map as Map hiding ( Map )+import Data.IORef ( IORef, newIORef, readIORef )+import Data.List ( isSuffixOf )+import System.Environment ( getProgName )+import System.Exit+import System.Directory ( createDirectory, removeDirectoryRecursive )+import System.IO ( hPutStr, hSetEncoding, IOMode(..), utf8, withFile )+import System.IO.Unsafe ( unsafePerformIO )+import qualified System.FilePath.Posix as HtmlPath++#ifndef mingw32_HOST_OS+import qualified System.Posix.Internals+#endif++--------------------------------------------------------------------------------+-- * Logging+--------------------------------------------------------------------------------++data Verbosity = Silent | Normal | Verbose | Deafening+ deriving (Eq, Ord, Enum, Bounded, Show)++silent, normal, verbose, deafening :: Verbosity+silent = Silent+normal = Normal+verbose = Verbose+deafening = Deafening++-- | Parse out a verbosity level. Inspired from Cabal's verbosity parsing.+parseVerbosity :: String -> Either String Verbosity+parseVerbosity "0" = Right Silent+parseVerbosity "1" = Right Normal+parseVerbosity "2" = Right Silent+parseVerbosity "3" = Right Deafening+parseVerbosity "silent" = return Silent+parseVerbosity "normal" = return Normal+parseVerbosity "verbose" = return Verbose+parseVerbosity "debug" = return Deafening+parseVerbosity "deafening" = return Deafening+parseVerbosity other = Left ("Can't parse verbosity " ++ other)++-- | Print a message to stdout, if it is not too verbose+out :: MonadIO m+ => Verbosity -- ^ program verbosity+ -> Verbosity -- ^ message verbosity+ -> String -> m ()+out progVerbosity msgVerbosity msg+ | msgVerbosity <= progVerbosity = liftIO $ putStrLn msg+ | otherwise = return ()+++--------------------------------------------------------------------------------+-- * Some Utilities+--------------------------------------------------------------------------------++++mkMeta :: Doc a -> MDoc a+mkMeta x = emptyMetaDoc { _doc = x }++--------------------------------------------------------------------------------+-- * Filename mangling functions stolen from s main/DriverUtil.lhs.+--------------------------------------------------------------------------------++baseName :: ModuleName -> FilePath+baseName = map (\c -> if c == '.' then '-' else c) . moduleNameString+++moduleHtmlFile :: Module -> FilePath+moduleHtmlFile mdl =+ case Map.lookup mdl html_xrefs of+ Nothing -> baseName mdl' ++ ".html"+ Just fp0 -> HtmlPath.joinPath [fp0, baseName mdl' ++ ".html"]+ where+ mdl' = moduleName mdl+++moduleHtmlFile' :: ModuleName -> FilePath+moduleHtmlFile' mdl =+ case Map.lookup mdl html_xrefs' of+ Nothing -> baseName mdl ++ ".html"+ Just fp0 -> HtmlPath.joinPath [fp0, baseName mdl ++ ".html"]+++contentsHtmlFile, indexHtmlFile, indexJsonFile :: String+contentsHtmlFile = "index.html"+indexHtmlFile = "doc-index.html"+indexJsonFile = "doc-index.json"+++subIndexHtmlFile :: String -> String+subIndexHtmlFile ls = "doc-index-" ++ b ++ ".html"+ where b | all isAlpha ls = ls+ | otherwise = concatMap (show . ord) ls+++-------------------------------------------------------------------------------+-- * Anchor and URL utilities+--+-- NB: Anchor IDs, used as the destination of a link within a document must+-- conform to XML's NAME production. That, taken with XHTML and HTML 4.01's+-- various needs and compatibility constraints, means these IDs have to match:+-- [A-Za-z][A-Za-z0-9:_.-]*+-- Such IDs do not need to be escaped in any way when used as the fragment part+-- of a URL. Indeed, %-escaping them can lead to compatibility issues as it+-- isn't clear if such fragment identifiers should, or should not be unescaped+-- before being matched with IDs in the target document.+-------------------------------------------------------------------------------+++moduleUrl :: Module -> String+moduleUrl = moduleHtmlFile+++moduleNameUrl :: Module -> OccName -> String+moduleNameUrl mdl n = moduleUrl mdl ++ '#' : nameAnchorId n+++moduleNameUrl' :: ModuleName -> OccName -> String+moduleNameUrl' mdl n = moduleHtmlFile' mdl ++ '#' : nameAnchorId n+++nameAnchorId :: OccName -> String+nameAnchorId name = makeAnchorId (prefix : ':' : occNameString name)+ where prefix | isValOcc name = 'v'+ | otherwise = 't'+++-- | Takes an arbitrary string and makes it a valid anchor ID. The mapping is+-- identity preserving.+makeAnchorId :: String -> String+makeAnchorId [] = []+makeAnchorId (f:r) = escape isAlpha f ++ concatMap (escape isLegal) r+ where+ escape p c | p c = [c]+ | otherwise = '-' : show (ord c) ++ "-"+ isLegal ':' = True+ isLegal '_' = True+ isLegal '.' = True+ isLegal c = isAscii c && isAlphaNum c+ -- NB: '-' is legal in IDs, but we use it as the escape char+++-------------------------------------------------------------------------------+-- * Files we need to copy from our $libdir+-------------------------------------------------------------------------------+++haddockJsFile :: String+haddockJsFile = "haddock-bundle.min.js"++jsQuickJumpFile :: String+jsQuickJumpFile = "quick-jump.min.js"++quickJumpCssFile :: String+quickJumpCssFile = "quick-jump.css"++-------------------------------------------------------------------------------+-- * Misc.+-------------------------------------------------------------------------------+++getProgramName :: IO String+getProgramName = fmap (`withoutSuffix` ".bin") getProgName+ where str `withoutSuffix` suff+ | suff `isSuffixOf` str = take (length str - length suff) str+ | otherwise = str+++bye :: String -> IO a+bye s = putStr s >> exitSuccess++escapeStr :: String -> String+escapeStr = escapeURIString isUnreserved+++-- Following few functions are copy'n'pasted from Network.URI module+-- to avoid depending on the network lib, since doing so gives a+-- circular build dependency between haddock and network+-- (at least if you want to build network with haddock docs)+escapeURIChar :: (Char -> Bool) -> Char -> String+escapeURIChar p c+ | p c = [c]+ | otherwise = '%' : myShowHex (ord c) ""+ where+ myShowHex :: Int -> ShowS+ myShowHex n r = case showIntAtBase 16 toChrHex n r of+ [] -> "00"+ [a] -> ['0',a]+ cs -> cs+ toChrHex d+ | d < 10 = chr (ord '0' + fromIntegral d)+ | otherwise = chr (ord 'A' + fromIntegral (d - 10))+++escapeURIString :: (Char -> Bool) -> String -> String+escapeURIString = concatMap . escapeURIChar+++isUnreserved :: Char -> Bool+isUnreserved c = isAlphaNumChar c || (c `elem` "-_.~")+++isAlphaChar, isDigitChar, isAlphaNumChar :: Char -> Bool+isAlphaChar c = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')+isDigitChar c = c >= '0' && c <= '9'+isAlphaNumChar c = isAlphaChar c || isDigitChar c++-- | Utility to write output to UTF-8 encoded files.+--+-- The problem with 'writeFile' is that it picks up its 'TextEncoding' from+-- 'getLocaleEncoding', and on some platforms (like Windows) this default+-- encoding isn't enough for the characters we want to write.+writeUtf8File :: FilePath -> String -> IO ()+writeUtf8File filepath contents = withFile filepath WriteMode $ \h -> do+ hSetEncoding h utf8+ hPutStr h contents++withTempDir :: (MonadIO m, MonadMask m) => FilePath -> m a -> m a+withTempDir dir = bracket_ (liftIO $ createDirectory dir)+ (liftIO $ removeDirectoryRecursive dir)++-----------------------------------------------------------------------------+-- * HTML cross references+--+-- For each module, we need to know where its HTML documentation lives+-- so that we can point hyperlinks to it. It is extremely+-- inconvenient to plumb this information to all the places that need+-- it (basically every function in HaddockHtml), and furthermore the+-- mapping is constant for any single run of Haddock. So for the time+-- being I'm going to use a write-once global variable.+-----------------------------------------------------------------------------+++{-# NOINLINE html_xrefs_ref #-}+html_xrefs_ref :: IORef (Map Module FilePath)+html_xrefs_ref = unsafePerformIO (newIORef (error "module_map"))+++{-# NOINLINE html_xrefs_ref' #-}+html_xrefs_ref' :: IORef (Map ModuleName FilePath)+html_xrefs_ref' = unsafePerformIO (newIORef (error "module_map"))+++{-# NOINLINE html_xrefs #-}+html_xrefs :: Map Module FilePath+html_xrefs = unsafePerformIO (readIORef html_xrefs_ref)+++{-# NOINLINE html_xrefs' #-}+html_xrefs' :: Map ModuleName FilePath+html_xrefs' = unsafePerformIO (readIORef html_xrefs_ref')+++-----------------------------------------------------------------------------+-- * List utils+-----------------------------------------------------------------------------+++replace :: Eq a => a -> a -> [a] -> [a]+replace a b = map (\x -> if x == a then b else x)+++spanWith :: (a -> Maybe b) -> [a] -> ([b],[a])+spanWith _ [] = ([],[])+spanWith p xs@(a:as)+ | Just b <- p a = let (bs,cs) = spanWith p as in (b:bs,cs)+ | otherwise = ([],xs)++-----------------------------------------------------------------------------+-- * System tools+-----------------------------------------------------------------------------+++#ifdef mingw32_HOST_OS+foreign import ccall unsafe "_getpid" getProcessID :: IO Int -- relies on Int == Int32 on Windows+#else+getProcessID :: IO Int+getProcessID = fmap fromIntegral System.Posix.Internals.c_getpid+#endif
@@ -0,0 +1,558 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}++-- | Minimal JSON / RFC 7159 support+--+-- The API is heavily inspired by @aeson@'s API but puts emphasis on+-- simplicity rather than performance. The 'ToJSON' instances are+-- intended to have an encoding compatible with @aeson@'s encoding.+--+module Haddock.Utils.Json+ ( Value(..)+ , Object, object, Pair, (.=)+ , encodeToString+ , encodeToBuilder+ , ToJSON(toJSON)++ , Parser(..)+ , Result(..)+ , FromJSON(parseJSON)+ , withObject+ , withArray+ , withString+ , withDouble+ , withBool+ , fromJSON+ , parse+ , parseEither+ , (.:)+ , (.:?)+ , decode+ , decodeWith+ , eitherDecode+ , eitherDecodeWith+ , decodeFile+ , eitherDecodeFile+ )+ where++import Control.Applicative (Alternative (..))+import Control.Monad (MonadPlus (..), zipWithM, (>=>))+import qualified Control.Monad as Monad+import qualified Control.Monad.Fail as Fail++import qualified Data.ByteString.Lazy as BSL+import Data.ByteString.Builder (Builder)+import qualified Data.ByteString.Builder as BB+import Data.Char+import Data.Int+import Data.Word+import Data.List (intersperse)+import Data.Monoid++import GHC.Natural++-- TODO: We may want to replace 'String' with 'Text' or 'ByteString'++import qualified Text.Parsec.ByteString.Lazy as Parsec.Lazy+import qualified Text.ParserCombinators.Parsec as Parsec++import Haddock.Utils.Json.Types+import Haddock.Utils.Json.Parser+++infixr 8 .=++-- | A key-value pair for encoding a JSON object.+(.=) :: ToJSON v => String -> v -> Pair+k .= v = (k, toJSON v)+++-- | A type that can be converted to JSON.+class ToJSON a where+ -- | Convert a Haskell value to a JSON-friendly intermediate type.+ toJSON :: a -> Value++instance ToJSON () where+ toJSON () = Array []++instance ToJSON Value where+ toJSON = id++instance ToJSON Bool where+ toJSON = Bool++instance ToJSON a => ToJSON [a] where+ toJSON = Array . map toJSON++instance ToJSON a => ToJSON (Maybe a) where+ toJSON Nothing = Null+ toJSON (Just a) = toJSON a++instance (ToJSON a,ToJSON b) => ToJSON (a,b) where+ toJSON (a,b) = Array [toJSON a, toJSON b]++instance (ToJSON a,ToJSON b,ToJSON c) => ToJSON (a,b,c) where+ toJSON (a,b,c) = Array [toJSON a, toJSON b, toJSON c]++instance (ToJSON a,ToJSON b,ToJSON c, ToJSON d) => ToJSON (a,b,c,d) where+ toJSON (a,b,c,d) = Array [toJSON a, toJSON b, toJSON c, toJSON d]++instance ToJSON Float where+ toJSON = Number . realToFrac++instance ToJSON Double where+ toJSON = Number++instance ToJSON Int where toJSON = Number . realToFrac+instance ToJSON Int8 where toJSON = Number . realToFrac+instance ToJSON Int16 where toJSON = Number . realToFrac+instance ToJSON Int32 where toJSON = Number . realToFrac++instance ToJSON Word where toJSON = Number . realToFrac+instance ToJSON Word8 where toJSON = Number . realToFrac+instance ToJSON Word16 where toJSON = Number . realToFrac+instance ToJSON Word32 where toJSON = Number . realToFrac++-- | Possibly lossy due to conversion to 'Double'+instance ToJSON Int64 where toJSON = Number . realToFrac++-- | Possibly lossy due to conversion to 'Double'+instance ToJSON Word64 where toJSON = Number . realToFrac++-- | Possibly lossy due to conversion to 'Double'+instance ToJSON Integer where toJSON = Number . fromInteger++------------------------------------------------------------------------------+-- 'BB.Builder'-based encoding++-- | Serialise value as JSON/UTF8-encoded 'Builder'+encodeToBuilder :: ToJSON a => a -> Builder+encodeToBuilder = encodeValueBB . toJSON++encodeValueBB :: Value -> Builder+encodeValueBB jv = case jv of+ Bool True -> "true"+ Bool False -> "false"+ Null -> "null"+ Number n+ | isNaN n || isInfinite n -> encodeValueBB Null+ | Just i <- doubleToInt64 n -> BB.int64Dec i+ | otherwise -> BB.doubleDec n+ Array a -> encodeArrayBB a+ String s -> encodeStringBB s+ Object o -> encodeObjectBB o++encodeArrayBB :: [Value] -> Builder+encodeArrayBB [] = "[]"+encodeArrayBB jvs = BB.char8 '[' <> go jvs <> BB.char8 ']'+ where+ go = Data.Monoid.mconcat . intersperse (BB.char8 ',') . map encodeValueBB++encodeObjectBB :: Object -> Builder+encodeObjectBB [] = "{}"+encodeObjectBB jvs = BB.char8 '{' <> go jvs <> BB.char8 '}'+ where+ go = Data.Monoid.mconcat . intersperse (BB.char8 ',') . map encPair+ encPair (l,x) = encodeStringBB l <> BB.char8 ':' <> encodeValueBB x++encodeStringBB :: String -> Builder+encodeStringBB str = BB.char8 '"' <> go str <> BB.char8 '"'+ where+ go = BB.stringUtf8 . escapeString++------------------------------------------------------------------------------+-- 'String'-based encoding++-- | Serialise value as JSON-encoded Unicode 'String'+encodeToString :: ToJSON a => a -> String+encodeToString jv = encodeValue (toJSON jv) []++encodeValue :: Value -> ShowS+encodeValue jv = case jv of+ Bool b -> showString (if b then "true" else "false")+ Null -> showString "null"+ Number n+ | isNaN n || isInfinite n -> encodeValue Null+ | Just i <- doubleToInt64 n -> shows i+ | otherwise -> shows n+ Array a -> encodeArray a+ String s -> encodeString s+ Object o -> encodeObject o++encodeArray :: [Value] -> ShowS+encodeArray [] = showString "[]"+encodeArray jvs = ('[':) . go jvs . (']':)+ where+ go [] = id+ go [x] = encodeValue x+ go (x:xs) = encodeValue x . (',':) . go xs++encodeObject :: Object -> ShowS+encodeObject [] = showString "{}"+encodeObject jvs = ('{':) . go jvs . ('}':)+ where+ go [] = id+ go [(l,x)] = encodeString l . (':':) . encodeValue x+ go ((l,x):lxs) = encodeString l . (':':) . encodeValue x . (',':) . go lxs++encodeString :: String -> ShowS+encodeString str = ('"':) . showString (escapeString str) . ('"':)++------------------------------------------------------------------------------+-- helpers++-- | Try to convert 'Double' into 'Int64', return 'Nothing' if not+-- representable loss-free as integral 'Int64' value.+doubleToInt64 :: Double -> Maybe Int64+doubleToInt64 x+ | fromInteger x' == x+ , x' <= toInteger (maxBound :: Int64)+ , x' >= toInteger (minBound :: Int64)+ = Just (fromIntegral x')+ | otherwise = Nothing+ where+ x' = round x++-- | Minimally escape a 'String' in accordance with RFC 7159, "7. Strings"+escapeString :: String -> String+escapeString s+ | not (any needsEscape s) = s+ | otherwise = escape s+ where+ escape [] = []+ escape (x:xs) = case x of+ '\\' -> '\\':'\\':escape xs+ '"' -> '\\':'"':escape xs+ '\b' -> '\\':'b':escape xs+ '\f' -> '\\':'f':escape xs+ '\n' -> '\\':'n':escape xs+ '\r' -> '\\':'r':escape xs+ '\t' -> '\\':'t':escape xs+ c | ord c < 0x10 -> '\\':'u':'0':'0':'0':intToDigit (ord c):escape xs+ | ord c < 0x20 -> '\\':'u':'0':'0':'1':intToDigit (ord c - 0x10):escape xs+ | otherwise -> c : escape xs++ -- unescaped = %x20-21 / %x23-5B / %x5D-10FFFF+ needsEscape c = ord c < 0x20 || c `elem` ['\\','"']++------------------------------------------------------------------------------+-- FromJSON++-- | Elements of a JSON path used to describe the location of an+-- error.+data JSONPathElement+ = Key String+ -- ^ JSON path element of a key into an object,+ -- \"object.key\".+ | Index !Int+ -- ^ JSON path element of an index into an+ -- array, \"array[index]\".+ deriving (Eq, Show, Ord)++type JSONPath = [JSONPathElement]++-- | Failure continuation.+type Failure f r = JSONPath -> String -> f r++-- | Success continuation.+type Success a f r = a -> f r++newtype Parser a = Parser {+ runParser :: forall f r.+ JSONPath+ -> Failure f r+ -> Success a f r+ -> f r+ }++modifyFailure :: (String -> String) -> Parser a -> Parser a+modifyFailure f (Parser p) = Parser $ \path kf ks ->+ p path (\p' m -> kf p' (f m)) ks++prependFailure :: String -> Parser a -> Parser a+prependFailure = modifyFailure . (++)++prependContext :: String -> Parser a -> Parser a+prependContext name = prependFailure ("parsing " ++ name ++ " failed, ")++typeMismatch :: String -> Value -> Parser a+typeMismatch expected actual =+ fail $ "expected " ++ expected ++ ", but encountered " ++ typeOf actual++instance Monad.Monad Parser where+ m >>= g = Parser $ \path kf ks ->+ runParser m path kf+ (\a -> runParser (g a) path kf ks)+ return = pure++instance Fail.MonadFail Parser where+ fail msg = Parser $ \path kf _ks -> kf (reverse path) msg++instance Functor Parser where+ fmap f m = Parser $ \path kf ks ->+ let ks' a = ks (f a)+ in runParser m path kf ks'++instance Applicative Parser where+ pure a = Parser $ \_path _kf ks -> ks a+ (<*>) = apP++instance Alternative Parser where+ empty = fail "empty"+ (<|>) = mplus++instance MonadPlus Parser where+ mzero = fail "mzero"+ mplus a b = Parser $ \path kf ks ->+ runParser a path (\_ _ -> runParser b path kf ks) ks++instance Semigroup (Parser a) where+ (<>) = mplus++instance Monoid (Parser a) where+ mempty = fail "mempty"+ mappend = (<>)++apP :: Parser (a -> b) -> Parser a -> Parser b+apP d e = do+ b <- d+ b <$> e++(<?>) :: Parser a -> JSONPathElement -> Parser a+p <?> pathElem = Parser $ \path kf ks -> runParser p (pathElem:path) kf ks++parseIndexedJSON :: (Value -> Parser a) -> Int -> Value -> Parser a+parseIndexedJSON p idx value = p value <?> Index idx++unexpected :: Value -> Parser a+unexpected actual = fail $ "unexpected " ++ typeOf actual++withObject :: String -> (Object -> Parser a) -> Value -> Parser a+withObject _ f (Object obj) = f obj+withObject name _ v = prependContext name (typeMismatch "Object" v)++withArray :: String -> ([Value] -> Parser a) -> Value -> Parser a+withArray _ f (Array arr) = f arr+withArray name _ v = prependContext name (typeMismatch "Array" v)++withString :: String -> (String -> Parser a) -> Value -> Parser a+withString _ f (String txt) = f txt+withString name _ v = prependContext name (typeMismatch "String" v)++withDouble :: String -> (Double -> Parser a) -> Value -> Parser a+withDouble _ f (Number duble) = f duble+withDouble name _ v = prependContext name (typeMismatch "Number" v)++withBool :: String -> (Bool -> Parser a) -> Value -> Parser a+withBool _ f (Bool arr) = f arr+withBool name _ v = prependContext name (typeMismatch "Boolean" v)++class FromJSON a where+ parseJSON :: Value -> Parser a++ parseJSONList :: Value -> Parser [a]+ parseJSONList = withArray "[]" (zipWithM (parseIndexedJSON parseJSON) [0..])++instance FromJSON Bool where+ parseJSON (Bool b) = pure b+ parseJSON v = typeMismatch "Bool" v++instance FromJSON () where+ parseJSON =+ withArray "()" $ \v ->+ if null v+ then pure ()+ else prependContext "()" $ fail "expected an empty array"++instance FromJSON Char where+ parseJSON = withString "Char" parseChar++ parseJSONList (String s) = pure s+ parseJSONList v = typeMismatch "String" v++parseChar :: String -> Parser Char+parseChar t =+ if length t == 1+ then pure $ head t+ else prependContext "Char" $ fail "expected a string of length 1"++parseRealFloat :: RealFloat a => String -> Value -> Parser a+parseRealFloat _ (Number s) = pure $ realToFrac s+parseRealFloat _ Null = pure (0/0)+parseRealFloat name v = prependContext name (unexpected v)++instance FromJSON Double where+ parseJSON = parseRealFloat "Double"++instance FromJSON Float where+ parseJSON = parseRealFloat "Float"++parseNatural :: Integer -> Parser Natural+parseNatural integer =+ if integer < 0 then+ fail $ "parsing Natural failed, unexpected negative number " <> show integer+ else+ pure $ fromIntegral integer++parseIntegralFromDouble :: Integral a => Double -> Parser a+parseIntegralFromDouble d =+ let r = toRational d+ x = truncate r+ in if toRational x == r+ then pure x+ else fail $ "unexpected floating number " <> show d++parseIntegral :: Integral a => String -> Value -> Parser a+parseIntegral name = withDouble name parseIntegralFromDouble++instance FromJSON Integer where+ parseJSON = parseIntegral "Integer"++instance FromJSON Natural where+ parseJSON = withDouble "Natural"+ (parseIntegralFromDouble >=> parseNatural)++instance FromJSON Int where+ parseJSON = parseIntegral "Int"++instance FromJSON Int8 where+ parseJSON = parseIntegral "Int8"++instance FromJSON Int16 where+ parseJSON = parseIntegral "Int16"++instance FromJSON Int32 where+ parseJSON = parseIntegral "Int32"++instance FromJSON Int64 where+ parseJSON = parseIntegral "Int64"++instance FromJSON Word where+ parseJSON = parseIntegral "Word"++instance FromJSON Word8 where+ parseJSON = parseIntegral "Word8"++instance FromJSON Word16 where+ parseJSON = parseIntegral "Word16"++instance FromJSON Word32 where+ parseJSON = parseIntegral "Word32"++instance FromJSON Word64 where+ parseJSON = parseIntegral "Word64"++instance FromJSON a => FromJSON [a] where+ parseJSON = parseJSONList++data Result a = Error String+ | Success a+ deriving (Eq, Show)++fromJSON :: FromJSON a => Value -> Result a+fromJSON = parse parseJSON++parse :: (a -> Parser b) -> a -> Result b+parse m v = runParser (m v) [] (const Error) Success++parseEither :: (a -> Parser b) -> a -> Either String b+parseEither m v = runParser (m v) [] onError Right+ where onError path msg = Left (formatError path msg)++formatError :: JSONPath -> String -> String+formatError path msg = "Error in " ++ formatPath path ++ ": " ++ msg++formatPath :: JSONPath -> String+formatPath path = "$" ++ formatRelativePath path++formatRelativePath :: JSONPath -> String+formatRelativePath path = format "" path+ where+ format :: String -> JSONPath -> String+ format pfx [] = pfx+ format pfx (Index idx:parts) = format (pfx ++ "[" ++ show idx ++ "]") parts+ format pfx (Key key:parts) = format (pfx ++ formatKey key) parts++ formatKey :: String -> String+ formatKey key+ | isIdentifierKey key = "." ++ key+ | otherwise = "['" ++ escapeKey key ++ "']"++ isIdentifierKey :: String -> Bool+ isIdentifierKey [] = False+ isIdentifierKey (x:xs) = isAlpha x && all isAlphaNum xs++ escapeKey :: String -> String+ escapeKey = concatMap escapeChar++ escapeChar :: Char -> String+ escapeChar '\'' = "\\'"+ escapeChar '\\' = "\\\\"+ escapeChar c = [c]++explicitParseField :: (Value -> Parser a) -> Object -> String -> Parser a+explicitParseField p obj key =+ case key `lookup` obj of+ Nothing -> fail $ "key " ++ key ++ " not found"+ Just v -> p v <?> Key key++(.:) :: FromJSON a => Object -> String -> Parser a+(.:) = explicitParseField parseJSON++explicitParseFieldMaybe :: (Value -> Parser a) -> Object -> String -> Parser (Maybe a)+explicitParseFieldMaybe p obj key =+ case key `lookup` obj of+ Nothing -> pure Nothing+ Just v -> Just <$> p v <?> Key key++(.:?) :: FromJSON a => Object -> String -> Parser (Maybe a)+(.:?) = explicitParseFieldMaybe parseJSON+++decodeWith :: (Value -> Result a) -> BSL.ByteString -> Maybe a+decodeWith decoder bsl =+ case Parsec.parse parseJSONValue "<input>" bsl of+ Left _ -> Nothing+ Right json ->+ case decoder json of+ Success a -> Just a+ Error _ -> Nothing++decode :: FromJSON a => BSL.ByteString -> Maybe a+decode = decodeWith fromJSON++eitherDecodeWith :: (Value -> Result a) -> BSL.ByteString -> Either String a+eitherDecodeWith decoder bsl =+ case Parsec.parse parseJSONValue "<input>" bsl of+ Left parsecError -> Left (show parsecError)+ Right json ->+ case decoder json of+ Success a -> Right a+ Error err -> Left err++eitherDecode :: FromJSON a => BSL.ByteString -> Either String a+eitherDecode = eitherDecodeWith fromJSON+++decodeFile :: FromJSON a => FilePath -> IO (Maybe a)+decodeFile filePath = do+ parsecResult <- Parsec.Lazy.parseFromFile parseJSONValue filePath+ case parsecResult of+ Right r ->+ case fromJSON r of+ Success a -> return (Just a)+ Error _ -> return Nothing+ Left _ -> return Nothing+++eitherDecodeFile :: FromJSON a => FilePath -> IO (Either String a)+eitherDecodeFile filePath = do+ parsecResult <- Parsec.Lazy.parseFromFile parseJSONValue filePath+ case parsecResult of+ Right r ->+ case fromJSON r of+ Success a -> return (Right a)+ Error err -> return (Left err)+ Left err -> return $ Left (show err)+
@@ -0,0 +1,102 @@+-- | Json "Parsec" parser, based on+-- [json](https://hackage.haskell.org/package/json) package.+--+module Haddock.Utils.Json.Parser+ ( parseJSONValue+ ) where++import Prelude hiding (null)++import Control.Applicative (Alternative (..))+import Control.Monad (MonadPlus (..))+import Data.Char (isHexDigit)+import Data.Functor (($>))+import qualified Data.ByteString.Lazy.Char8 as BSCL+import Numeric+import Text.Parsec.ByteString.Lazy (Parser)+import Text.ParserCombinators.Parsec ((<?>))+import qualified Text.ParserCombinators.Parsec as Parsec++import Haddock.Utils.Json.Types hiding (object)++parseJSONValue :: Parser Value+parseJSONValue = Parsec.spaces *> parseValue++tok :: Parser a -> Parser a+tok p = p <* Parsec.spaces++parseValue :: Parser Value+parseValue =+ parseNull+ <|> Bool <$> parseBoolean+ <|> Array <$> parseArray+ <|> String <$> parseString+ <|> Object <$> parseObject+ <|> Number <$> parseNumber+ <?> "JSON value"++parseNull :: Parser Value+parseNull = tok+ $ Parsec.string "null"+ $> Null++parseBoolean :: Parser Bool+parseBoolean = tok+ $ Parsec.string "true" $> True+ <|> Parsec.string "false" $> False++parseArray :: Parser [Value]+parseArray =+ Parsec.between+ (tok (Parsec.char '['))+ (tok (Parsec.char ']'))+ (parseValue `Parsec.sepBy` tok (Parsec.char ','))++parseString :: Parser String+parseString =+ Parsec.between+ (tok (Parsec.char '"'))+ (tok (Parsec.char '"'))+ (many char)+ where+ char = (Parsec.char '\\' >> escapedChar)+ <|> Parsec.satisfy (\x -> x /= '"' && x /= '\\')++ escapedChar =+ Parsec.char '"' $> '"'+ <|> Parsec.char '\\' $> '\\'+ <|> Parsec.char '/' $> '/'+ <|> Parsec.char 'b' $> '\b'+ <|> Parsec.char 'f' $> '\f'+ <|> Parsec.char 'n' $> '\n'+ <|> Parsec.char 'r' $> '\r'+ <|> Parsec.char 't' $> '\t'+ <|> Parsec.char 'u' *> uni+ <?> "escape character"++ uni = check =<< Parsec.count 4 (Parsec.satisfy isHexDigit)+ where+ check x | code <= max_char = return (toEnum code)+ | otherwise = mzero+ where code = fst $ head $ readHex x+ max_char = fromEnum (maxBound :: Char)++parseObject :: Parser Object+parseObject =+ Parsec.between+ (tok (Parsec.char '{'))+ (tok (Parsec.char '}'))+ (field `Parsec.sepBy` tok (Parsec.char ','))+ where+ field :: Parser (String, Value)+ field = (,)+ <$> parseString+ <* tok (Parsec.char ':')+ <*> parseValue++parseNumber :: Parser Double+parseNumber = tok $ do+ s <- BSCL.unpack <$> Parsec.getInput+ case readSigned readFloat s of+ [(n,s')] -> Parsec.setInput (BSCL.pack s') $> n+ _ -> mzero
@@ -0,0 +1,42 @@+module Haddock.Utils.Json.Types+ ( Value(..)+ , typeOf+ , Pair+ , Object+ , object+ ) where++import Data.String++-- TODO: We may want to replace 'String' with 'Text' or 'ByteString'++-- | A JSON value represented as a Haskell value.+data Value = Object !Object+ | Array [Value]+ | String String+ | Number !Double+ | Bool !Bool+ | Null+ deriving (Eq, Read, Show)++typeOf :: Value -> String+typeOf v = case v of+ Object _ -> "Object"+ Array _ -> "Array"+ String _ -> "String"+ Number _ -> "Number"+ Bool _ -> "Boolean"+ Null -> "Null"++-- | A key\/value pair for an 'Object'+type Pair = (String, Value)++-- | A JSON \"object\" (key/value map).+type Object = [Pair]++-- | Create a 'Value' from a list of name\/value 'Pair's.+object :: [Pair] -> Value+object = Object++instance IsString Value where+ fromString = String
@@ -0,0 +1,30 @@+{-# LANGUAGE CPP #-}+-----------------------------------------------------------------------------+-- |+-- Module : Haddock.Version+-- Copyright : (c) Simon Marlow 2003+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+-----------------------------------------------------------------------------+module Haddock.Version (+ projectName, projectVersion, projectUrl+) where++#ifdef IN_GHC_TREE+import Paths_haddock ( version )+#else+import Paths_haddock_api ( version )+#endif+import Data.Version ( showVersion )++projectName :: String+projectName = "Haddock"++projectUrl :: String+projectUrl = "http://www.haskell.org/haddock/"++projectVersion :: String+projectVersion = showVersion version
@@ -0,0 +1,7 @@+# Mini-driver for Haddock++# needs the following variables:+# HADDOCKLIB+# HADDOCKBIN++$HADDOCKBIN --lib $HADDOCKLIB ${1+"$@"}
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}++#ifdef __HLINT__+#elif !MIN_VERSION_base(4,5,0)+# error This module doesn't provide compat-shims for versions prior to base-4.5+#endif++-- | Bridge impedance mismatch of different @base@ versions back till @base-4.5@ (GHC 7.4.2)+module CompatPrelude+ ( ($>)+ , isSymbolChar+ ) where++#if MIN_VERSION_base(4,7,0)+import Data.Functor ( ($>) )+#else+import Data.Functor ( (<$) )+#endif++#if MIN_VERSION_base(4,9,0)+import Text.Read.Lex (isSymbolChar)+#else+import Data.Char (GeneralCategory(..), generalCategory)+#endif+++#if !MIN_VERSION_base(4,7,0)+infixl 4 $>++-- | Flipped version of '<$'.+--+-- @since 4.7.0.0+($>) :: Functor f => f a -> b -> f b+($>) = flip (<$)+#endif++#if !MIN_VERSION_base(4,9,0)+-- inlined from base-4.10.0.0+isSymbolChar :: Char -> Bool+isSymbolChar c = not (isPuncChar c) && case generalCategory c of+ MathSymbol -> True+ CurrencySymbol -> True+ ModifierSymbol -> True+ OtherSymbol -> True+ DashPunctuation -> True+ OtherPunctuation -> c `notElem` "'\""+ ConnectorPunctuation -> c /= '_'+ _ -> False+ where+ -- | The @special@ character class as defined in the Haskell Report.+ isPuncChar :: Char -> Bool+ isPuncChar = (`elem` (",;()[]{}`" :: String))+#endif
@@ -0,0 +1,89 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Documentation.Haddock.Doc (docParagraph, docAppend,+ docConcat, metaDocConcat,+ metaDocAppend, emptyMetaDoc,+ metaAppend, metaConcat) where++import Control.Applicative ((<|>), empty)+import Documentation.Haddock.Types+import Data.Char (isSpace)++docConcat :: [DocH mod id] -> DocH mod id+docConcat = foldr docAppend DocEmpty++-- | Concat using 'metaAppend'.+metaConcat :: [Meta] -> Meta+metaConcat = foldr metaAppend emptyMeta++-- | Like 'docConcat' but also joins the 'Meta' info.+metaDocConcat :: [MetaDoc mod id] -> MetaDoc mod id+metaDocConcat = foldr metaDocAppend emptyMetaDoc++-- | We do something perhaps unexpected here and join the meta info+-- in ‘reverse’: this results in the metadata from the ‘latest’+-- paragraphs taking precedence.+metaDocAppend :: MetaDoc mod id -> MetaDoc mod id -> MetaDoc mod id+metaDocAppend (MetaDoc { _meta = m, _doc = d })+ (MetaDoc { _meta = m', _doc = d' }) =+ MetaDoc { _meta = m' `metaAppend` m, _doc = d `docAppend` d' }++-- | This is not a monoidal append, it uses '<|>' for the '_version' and+-- '_package'.+metaAppend :: Meta -> Meta -> Meta+metaAppend (Meta v1 p1) (Meta v2 p2) = Meta (v1 <|> v2) (p1 <|> p2)++emptyMetaDoc :: MetaDoc mod id+emptyMetaDoc = MetaDoc { _meta = emptyMeta, _doc = DocEmpty }++emptyMeta :: Meta+emptyMeta = Meta empty empty++docAppend :: DocH mod id -> DocH mod id -> DocH mod id+docAppend (DocDefList ds1) (DocDefList ds2) = DocDefList (ds1++ds2)+docAppend (DocDefList ds1) (DocAppend (DocDefList ds2) d) = DocAppend (DocDefList (ds1++ds2)) d+docAppend (DocOrderedList ds1) (DocOrderedList ds2) = DocOrderedList (ds1 ++ ds2)+docAppend (DocOrderedList ds1) (DocAppend (DocOrderedList ds2) d) = DocAppend (DocOrderedList (ds1++ds2)) d+docAppend (DocUnorderedList ds1) (DocUnorderedList ds2) = DocUnorderedList (ds1 ++ ds2)+docAppend (DocUnorderedList ds1) (DocAppend (DocUnorderedList ds2) d) = DocAppend (DocUnorderedList (ds1++ds2)) d+docAppend DocEmpty d = d+docAppend d DocEmpty = d+docAppend (DocString s1) (DocString s2) = DocString (s1 ++ s2)+docAppend (DocAppend d (DocString s1)) (DocString s2) = DocAppend d (DocString (s1 ++ s2))+docAppend (DocString s1) (DocAppend (DocString s2) d) = DocAppend (DocString (s1 ++ s2)) d+docAppend d1 d2 = DocAppend d1 d2++-- again to make parsing easier - we spot a paragraph whose only item+-- is a DocMonospaced and make it into a DocCodeBlock+docParagraph :: DocH mod id -> DocH mod id+docParagraph (DocMonospaced p)+ = DocCodeBlock (docCodeBlock p)+docParagraph (DocAppend (DocString s1) (DocMonospaced p))+ | all isSpace s1+ = DocCodeBlock (docCodeBlock p)+docParagraph (DocAppend (DocString s1)+ (DocAppend (DocMonospaced p) (DocString s2)))+ | all isSpace s1 && all isSpace s2+ = DocCodeBlock (docCodeBlock p)+docParagraph (DocAppend (DocMonospaced p) (DocString s2))+ | all isSpace s2+ = DocCodeBlock (docCodeBlock p)+docParagraph p+ = DocParagraph p+++-- Drop trailing whitespace from @..@ code blocks. Otherwise this:+--+-- -- @+-- -- foo+-- -- @+--+-- turns into (DocCodeBlock "\nfoo\n ") which when rendered in HTML+-- gives an extra vertical space after the code block. The single space+-- on the final line seems to trigger the extra vertical space.+--+docCodeBlock :: DocH mod id -> DocH mod id+docCodeBlock (DocString s)+ = DocString (reverse $ dropWhile (`elem` " \t") $ reverse s)+docCodeBlock (DocAppend l r)+ = DocAppend l (docCodeBlock r)+docCodeBlock d = d
@@ -0,0 +1,99 @@+-- | @since 1.4.5+module Documentation.Haddock.Markup (+ markup+ , idMarkup+ , plainMarkup+ ) where++import Documentation.Haddock.Types++import Data.Maybe ( fromMaybe )++markup :: DocMarkupH mod id a -> DocH mod id -> a+markup m DocEmpty = markupEmpty m+markup m (DocAppend d1 d2) = markupAppend m (markup m d1) (markup m d2)+markup m (DocString s) = markupString m s+markup m (DocParagraph d) = markupParagraph m (markup m d)+markup m (DocIdentifier x) = markupIdentifier m x+markup m (DocIdentifierUnchecked x) = markupIdentifierUnchecked m x+markup m (DocModule (ModLink mo l)) = markupModule m (ModLink mo (fmap (markup m) l))+markup m (DocWarning d) = markupWarning m (markup m d)+markup m (DocEmphasis d) = markupEmphasis m (markup m d)+markup m (DocBold d) = markupBold m (markup m d)+markup m (DocMonospaced d) = markupMonospaced m (markup m d)+markup m (DocUnorderedList ds) = markupUnorderedList m (map (markup m) ds)+markup m (DocOrderedList ds) = markupOrderedList m (map (\(index, a) -> (index, markup m a)) ds)+markup m (DocDefList ds) = markupDefList m (map (markupPair m) ds)+markup m (DocCodeBlock d) = markupCodeBlock m (markup m d)+markup m (DocHyperlink (Hyperlink u l)) = markupHyperlink m (Hyperlink u (fmap (markup m) l))+markup m (DocAName ref) = markupAName m ref+markup m (DocPic img) = markupPic m img+markup m (DocMathInline mathjax) = markupMathInline m mathjax+markup m (DocMathDisplay mathjax) = markupMathDisplay m mathjax+markup m (DocProperty p) = markupProperty m p+markup m (DocExamples e) = markupExample m e+markup m (DocHeader (Header l t)) = markupHeader m (Header l (markup m t))+markup m (DocTable (Table h b)) = markupTable m (Table (map (fmap (markup m)) h) (map (fmap (markup m)) b))++markupPair :: DocMarkupH mod id a -> (DocH mod id, DocH mod id) -> (a, a)+markupPair m (a,b) = (markup m a, markup m b)++-- | The identity markup+idMarkup :: DocMarkupH mod id (DocH mod id)+idMarkup = Markup {+ markupEmpty = DocEmpty,+ markupString = DocString,+ markupParagraph = DocParagraph,+ markupAppend = DocAppend,+ markupIdentifier = DocIdentifier,+ markupIdentifierUnchecked = DocIdentifierUnchecked,+ markupModule = DocModule,+ markupWarning = DocWarning,+ markupEmphasis = DocEmphasis,+ markupBold = DocBold,+ markupMonospaced = DocMonospaced,+ markupUnorderedList = DocUnorderedList,+ markupOrderedList = DocOrderedList,+ markupDefList = DocDefList,+ markupCodeBlock = DocCodeBlock,+ markupHyperlink = DocHyperlink,+ markupAName = DocAName,+ markupPic = DocPic,+ markupMathInline = DocMathInline,+ markupMathDisplay = DocMathDisplay,+ markupProperty = DocProperty,+ markupExample = DocExamples,+ markupHeader = DocHeader,+ markupTable = DocTable+ }++-- | Map a 'DocH' into a best estimate of an alternate string. The idea is to+-- strip away any formatting while preserving as much of the actual text as+-- possible.+plainMarkup :: (mod -> String) -> (id -> String) -> DocMarkupH mod id String+plainMarkup plainMod plainIdent = Markup {+ markupEmpty = "",+ markupString = id,+ markupParagraph = id,+ markupAppend = (++),+ markupIdentifier = plainIdent,+ markupIdentifierUnchecked = plainMod,+ markupModule = \(ModLink m lbl) -> fromMaybe m lbl,+ markupWarning = id,+ markupEmphasis = id,+ markupBold = id,+ markupMonospaced = id,+ markupUnorderedList = const "",+ markupOrderedList = const "",+ markupDefList = const "",+ markupCodeBlock = id,+ markupHyperlink = \(Hyperlink url lbl) -> fromMaybe url lbl,+ markupAName = id,+ markupPic = \(Picture uri title) -> fromMaybe uri title,+ markupMathInline = id,+ markupMathDisplay = id,+ markupProperty = id,+ markupExample = const "",+ markupHeader = \(Header _ title) -> title,+ markupTable = const ""+ }
@@ -0,0 +1,859 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ViewPatterns #-}+-- |+-- Module : Documentation.Haddock.Parser+-- Copyright : (c) Mateusz Kowalczyk 2013-2014,+-- Simon Hengel 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Parser used for Haddock comments. For external users of this+-- library, the most commonly used combination of functions is going+-- to be+--+-- @'toRegular' . '_doc' . 'parseParas'@+module Documentation.Haddock.Parser (+ parseString,+ parseParas,+ overIdentifier,+ toRegular,+ Identifier+) where++import Control.Applicative+import Control.Arrow (first)+import Control.Monad+import Data.Char (chr, isUpper, isAlpha, isSpace)+import Data.List (intercalate, unfoldr, elemIndex)+import Data.Maybe (fromMaybe, mapMaybe)+import Data.Monoid+import qualified Data.Set as Set+import Documentation.Haddock.Doc+import Documentation.Haddock.Markup ( markup, plainMarkup )+import Documentation.Haddock.Parser.Monad+import Documentation.Haddock.Parser.Util+import Documentation.Haddock.Parser.Identifier+import Documentation.Haddock.Types+import Prelude hiding (takeWhile)+import qualified Prelude as P++import qualified Text.Parsec as Parsec+import Text.Parsec (try)++import qualified Data.Text as T+import Data.Text (Text)+++-- $setup+-- >>> :set -XOverloadedStrings++-- | Drops the quotes/backticks around all identifiers, as if they+-- were valid but still 'String's.+toRegular :: DocH mod Identifier -> DocH mod String+toRegular = fmap (\(Identifier _ _ x _) -> x)++-- | Maps over 'DocIdentifier's over 'String' with potentially failing+-- conversion using user-supplied function. If the conversion fails,+-- the identifier is deemed to not be valid and is treated as a+-- regular string.+overIdentifier :: (Namespace -> String -> Maybe a)+ -> DocH mod Identifier+ -> DocH mod a+overIdentifier f d = g d+ where+ g (DocIdentifier (Identifier ns o x e)) = case f ns x of+ Nothing -> DocString $ renderNs ns ++ [o] ++ x ++ [e]+ Just x' -> DocIdentifier x'+ g DocEmpty = DocEmpty+ g (DocAppend x x') = DocAppend (g x) (g x')+ g (DocString x) = DocString x+ g (DocParagraph x) = DocParagraph $ g x+ g (DocIdentifierUnchecked x) = DocIdentifierUnchecked x+ g (DocModule (ModLink m x)) = DocModule (ModLink m (fmap g x))+ g (DocWarning x) = DocWarning $ g x+ g (DocEmphasis x) = DocEmphasis $ g x+ g (DocMonospaced x) = DocMonospaced $ g x+ g (DocBold x) = DocBold $ g x+ g (DocUnorderedList x) = DocUnorderedList $ fmap g x+ g (DocOrderedList x) = DocOrderedList $ fmap (\(index, a) -> (index, g a)) x+ g (DocDefList x) = DocDefList $ fmap (\(y, z) -> (g y, g z)) x+ g (DocCodeBlock x) = DocCodeBlock $ g x+ g (DocHyperlink (Hyperlink u x)) = DocHyperlink (Hyperlink u (fmap g x))+ g (DocPic x) = DocPic x+ g (DocMathInline x) = DocMathInline x+ g (DocMathDisplay x) = DocMathDisplay x+ g (DocAName x) = DocAName x+ g (DocProperty x) = DocProperty x+ g (DocExamples x) = DocExamples x+ g (DocHeader (Header l x)) = DocHeader . Header l $ g x+ g (DocTable (Table h b)) = DocTable (Table (map (fmap g) h) (map (fmap g) b))+++choice' :: [Parser a] -> Parser a+choice' [] = empty+choice' [p] = p+choice' (p : ps) = try p <|> choice' ps++parse :: Parser a -> Text -> (ParserState, a)+parse p = either err id . parseOnly (p <* Parsec.eof)+ where+ err = error . ("Haddock.Parser.parse: " ++)++-- | Main entry point to the parser. Appends the newline character+-- to the input string.+parseParas :: Maybe Package+ -> String -- ^ String to parse+ -> MetaDoc mod Identifier+parseParas pkg input = case parseParasState input of+ (state, a) -> MetaDoc { _meta = Meta { _version = parserStateSince state+ , _package = pkg+ }+ , _doc = a+ }++parseParasState :: String -> (ParserState, DocH mod Identifier)+parseParasState = parse (emptyLines *> p) . T.pack . (++ "\n") . filter (/= '\r')+ where+ p :: Parser (DocH mod Identifier)+ p = docConcat <$> many (paragraph <* emptyLines)++ emptyLines :: Parser ()+ emptyLines = void $ many (try (skipHorizontalSpace *> "\n"))++parseParagraphs :: String -> Parser (DocH mod Identifier)+parseParagraphs input = case parseParasState input of+ (state, a) -> Parsec.putState state *> pure a++-- | Variant of 'parseText' for 'String' instead of 'Text'+parseString :: String -> DocH mod Identifier+parseString = parseText . T.pack++-- | Parse a text paragraph. Actually just a wrapper over 'parseParagraph' which+-- drops leading whitespace.+parseText :: Text -> DocH mod Identifier+parseText = parseParagraph . T.dropWhile isSpace . T.filter (/= '\r')++parseParagraph :: Text -> DocH mod Identifier+parseParagraph = snd . parse p+ where+ p :: Parser (DocH mod Identifier)+ p = docConcat <$> many (choice' [ monospace+ , anchor+ , identifier+ , moduleName+ , picture+ , mathDisplay+ , mathInline+ , markdownImage+ , markdownLink+ , hyperlink+ , bold+ , emphasis+ , encodedChar+ , string'+ , skipSpecialChar+ ])++-- | Parses and processes+-- <https://en.wikipedia.org/wiki/Numeric_character_reference Numeric character references>+--+-- >>> parseString "A"+-- DocString "A"+encodedChar :: Parser (DocH mod a)+encodedChar = "&#" *> c <* ";"+ where+ c = DocString . return . chr <$> num+ num = hex <|> decimal+ hex = ("x" <|> "X") *> hexadecimal++-- | List of characters that we use to delimit any special markup.+-- Once we have checked for any of these and tried to parse the+-- relevant markup, we can assume they are used as regular text.+specialChar :: [Char]+specialChar = "_/<@\"&'`#[ "++-- | Plain, regular parser for text. Called as one of the last parsers+-- to ensure that we have already given a chance to more meaningful parsers+-- before capturing their characters.+string' :: Parser (DocH mod a)+string' = DocString . unescape . T.unpack <$> takeWhile1_ (`notElem` specialChar)+ where+ unescape "" = ""+ unescape ('\\':x:xs) = x : unescape xs+ unescape (x:xs) = x : unescape xs++-- | Skips a single special character and treats it as a plain string.+-- This is done to skip over any special characters belonging to other+-- elements but which were not deemed meaningful at their positions.+skipSpecialChar :: Parser (DocH mod a)+skipSpecialChar = DocString . return <$> Parsec.oneOf specialChar++-- | Emphasis parser.+--+-- >>> parseString "/Hello world/"+-- DocEmphasis (DocString "Hello world")+emphasis :: Parser (DocH mod Identifier)+emphasis = DocEmphasis . parseParagraph <$>+ disallowNewline ("/" *> takeWhile1_ (/= '/') <* "/")++-- | Bold parser.+--+-- >>> parseString "__Hello world__"+-- DocBold (DocString "Hello world")+bold :: Parser (DocH mod Identifier)+bold = DocBold . parseParagraph <$> disallowNewline ("__" *> takeUntil "__")++disallowNewline :: Parser Text -> Parser Text+disallowNewline = mfilter (T.all (/= '\n'))++-- | Like `takeWhile`, but unconditionally take escaped characters.+takeWhile_ :: (Char -> Bool) -> Parser Text+takeWhile_ p = scan p_ False+ where+ p_ escaped c+ | escaped = Just False+ | not $ p c = Nothing+ | otherwise = Just (c == '\\')++-- | Like 'takeWhile1', but unconditionally take escaped characters.+takeWhile1_ :: (Char -> Bool) -> Parser Text+takeWhile1_ = mfilter (not . T.null) . takeWhile_++-- | Text anchors to allow for jumping around the generated documentation.+--+-- >>> parseString "#Hello world#"+-- DocAName "Hello world"+anchor :: Parser (DocH mod a)+anchor = DocAName . T.unpack <$>+ ("#" *> takeWhile1_ (\x -> x /= '#' && not (isSpace x)) <* "#")++-- | Monospaced strings.+--+-- >>> parseString "@cruel@"+-- DocMonospaced (DocString "cruel")+monospace :: Parser (DocH mod Identifier)+monospace = DocMonospaced . parseParagraph+ <$> ("@" *> takeWhile1_ (/= '@') <* "@")++-- | Module names.+--+-- Note that we allow '#' and '\' to support anchors (old style anchors are of+-- the form "SomeModule\#anchor").+moduleName :: Parser (DocH mod a)+moduleName = DocModule . flip ModLink Nothing <$> ("\"" *> moduleNameString <* "\"")++-- | A module name, optionally with an anchor+--+moduleNameString :: Parser String+moduleNameString = modid `maybeFollowedBy` anchor_+ where+ modid = intercalate "." <$> conid `Parsec.sepBy1` "."+ anchor_ = (++)+ <$> (Parsec.string "#" <|> Parsec.string "\\#")+ <*> many (Parsec.satisfy (\c -> c /= '"' && not (isSpace c)))++ maybeFollowedBy pre suf = (\x -> maybe x (x ++)) <$> pre <*> optional suf+ conid :: Parser String+ conid = (:)+ <$> Parsec.satisfy (\c -> isAlpha c && isUpper c)+ <*> many conChar++ conChar = Parsec.alphaNum <|> Parsec.char '_'++-- | A labeled link to an indentifier, module or url using markdown+-- syntax.+markdownLink :: Parser (DocH mod Identifier)+markdownLink = do+ lbl <- markdownLinkText+ choice' [ markdownModuleName lbl, markdownURL lbl ]+ where+ markdownModuleName lbl = do+ mn <- "(" *> skipHorizontalSpace *>+ "\"" *> moduleNameString <* "\""+ <* skipHorizontalSpace <* ")"+ pure $ DocModule (ModLink mn (Just lbl))++ markdownURL lbl = do+ target <- markdownLinkTarget+ pure $ DocHyperlink $ Hyperlink target (Just lbl)++-- | Picture parser, surrounded by \<\< and \>\>. It's possible to specify+-- a title for the picture.+--+-- >>> parseString "<<hello.png>>"+-- DocPic (Picture {pictureUri = "hello.png", pictureTitle = Nothing})+-- >>> parseString "<<hello.png world>>"+-- DocPic (Picture {pictureUri = "hello.png", pictureTitle = Just "world"})+picture :: Parser (DocH mod a)+picture = DocPic . makeLabeled Picture+ <$> disallowNewline ("<<" *> takeUntil ">>")++-- | Inline math parser, surrounded by \\( and \\).+--+-- >>> parseString "\\(\\int_{-\\infty}^{\\infty} e^{-x^2/2} = \\sqrt{2\\pi}\\)"+-- DocMathInline "\\int_{-\\infty}^{\\infty} e^{-x^2/2} = \\sqrt{2\\pi}"+mathInline :: Parser (DocH mod a)+mathInline = DocMathInline . T.unpack+ <$> disallowNewline ("\\(" *> takeUntil "\\)")++-- | Display math parser, surrounded by \\[ and \\].+--+-- >>> parseString "\\[\\int_{-\\infty}^{\\infty} e^{-x^2/2} = \\sqrt{2\\pi}\\]"+-- DocMathDisplay "\\int_{-\\infty}^{\\infty} e^{-x^2/2} = \\sqrt{2\\pi}"+mathDisplay :: Parser (DocH mod a)+mathDisplay = DocMathDisplay . T.unpack+ <$> ("\\[" *> takeUntil "\\]")++-- | Markdown image parser. As per the commonmark reference recommendation, the+-- description text for an image converted to its a plain string representation.+--+-- >>> parseString ""+-- DocPic (Picture "www.site.com" (Just "some emphasis in a description"))+markdownImage :: Parser (DocH mod Identifier)+markdownImage = do+ text <- markup stringMarkup <$> ("!" *> markdownLinkText)+ url <- markdownLinkTarget+ pure $ DocPic (Picture url (Just text))+ where+ stringMarkup = plainMarkup (const "") renderIdent+ renderIdent (Identifier ns l c r) = renderNs ns <> [l] <> c <> [r]++-- | Paragraph parser, called by 'parseParas'.+paragraph :: Parser (DocH mod Identifier)+paragraph = choice' [ examples+ , table+ , do indent <- takeIndent+ choice' [ since+ , unorderedList indent+ , orderedList indent+ , birdtracks+ , codeblock+ , property+ , header+ , textParagraphThatStartsWithMarkdownLink+ , definitionList indent+ , docParagraph <$> textParagraph+ ]+ ]++-- | Provides support for grid tables.+--+-- Tables are composed by an optional header and body. The header is composed by+-- a single row. The body is composed by a non-empty list of rows.+--+-- Example table with header:+--+-- > +----------+----------++-- > | /32bit/ | 64bit |+-- > +==========+==========++-- > | 0x0000 | @0x0000@ |+-- > +----------+----------++--+-- Algorithms loosely follows ideas in+-- http://docutils.sourceforge.net/docutils/parsers/rst/tableparser.py+--+table :: Parser (DocH mod Identifier)+table = do+ -- first we parse the first row, which determines the width of the table+ firstRow <- parseFirstRow+ let len = T.length firstRow++ -- then we parse all consecutive rows starting and ending with + or |,+ -- of the width `len`.+ restRows <- many (try (parseRestRows len))++ -- Now we gathered the table block, the next step is to split the block+ -- into cells.+ DocTable <$> tableStepTwo len (firstRow : restRows)+ where+ parseFirstRow :: Parser Text+ parseFirstRow = do+ skipHorizontalSpace+ cs <- takeWhile (\c -> c == '-' || c == '+')++ -- upper-left and upper-right corners are `+`+ guard (T.length cs >= 2 &&+ T.head cs == '+' &&+ T.last cs == '+')++ -- trailing space+ skipHorizontalSpace+ _ <- Parsec.newline++ return cs++ parseRestRows :: Int -> Parser Text+ parseRestRows l = do+ skipHorizontalSpace+ bs <- scan predicate l++ -- Left and right edges are `|` or `+`+ guard (T.length bs >= 2 &&+ (T.head bs == '|' || T.head bs == '+') &&+ (T.last bs == '|' || T.last bs == '+'))++ -- trailing space+ skipHorizontalSpace+ _ <- Parsec.newline++ return bs+ where+ predicate n c+ | n <= 0 = Nothing+ | c == '\n' = Nothing+ | otherwise = Just (n - 1)++-- Second step searchs for row of '+' and '=' characters, records it's index+-- and changes to '=' to '-'.+tableStepTwo+ :: Int -- ^ width+ -> [Text] -- ^ rows+ -> Parser (Table (DocH mod Identifier))+tableStepTwo width = go 0 [] where+ go _ left [] = tableStepThree width (reverse left) Nothing+ go n left (r : rs)+ | T.all (`elem` ['+', '=']) r =+ tableStepThree width (reverse left ++ r' : rs) (Just n)+ | otherwise =+ go (n + 1) (r : left) rs+ where+ r' = T.map (\c -> if c == '=' then '-' else c) r++-- Third step recognises cells in the table area, returning a list of TC, cells.+tableStepThree+ :: Int -- ^ width+ -> [Text] -- ^ rows+ -> Maybe Int -- ^ index of header separator+ -> Parser (Table (DocH mod Identifier))+tableStepThree width rs hdrIndex = do+ cells <- loop (Set.singleton (0, 0))+ tableStepFour rs hdrIndex cells+ where+ height = length rs++ loop :: Set.Set (Int, Int) -> Parser [TC]+ loop queue = case Set.minView queue of+ Nothing -> return []+ Just ((y, x), queue')+ | y + 1 >= height || x + 1 >= width -> loop queue'+ | otherwise -> case scanRight x y of+ Nothing -> loop queue'+ Just (x2, y2) -> do+ let tc = TC y x y2 x2+ fmap (tc :) $ loop $ queue' `Set.union` Set.fromList+ [(y, x2), (y2, x), (y2, x2)]++ -- scan right looking for +, then try scan down+ --+ -- do we need to record + saw on the way left and down?+ scanRight :: Int -> Int -> Maybe (Int, Int)+ scanRight x y = go (x + 1) where+ bs = rs !! y+ go x' | x' >= width = fail "overflow right "+ | T.index bs x' == '+' = scanDown x y x' <|> go (x' + 1)+ | T.index bs x' == '-' = go (x' + 1)+ | otherwise = fail $ "not a border (right) " ++ show (x,y,x')++ -- scan down looking for ++ scanDown :: Int -> Int -> Int -> Maybe (Int, Int)+ scanDown x y x2 = go (y + 1) where+ go y' | y' >= height = fail "overflow down"+ | T.index (rs !! y') x2 == '+' = scanLeft x y x2 y' <|> go (y' + 1)+ | T.index (rs !! y') x2 == '|' = go (y' + 1)+ | otherwise = fail $ "not a border (down) " ++ show (x,y,x2,y')++ -- check that at y2 x..x2 characters are '+' or '-'+ scanLeft :: Int -> Int -> Int -> Int -> Maybe (Int, Int)+ scanLeft x y x2 y2+ | all (\x' -> T.index bs x' `elem` ['+', '-']) [x..x2] = scanUp x y x2 y2+ | otherwise = fail $ "not a border (left) " ++ show (x,y,x2,y2)+ where+ bs = rs !! y2++ -- check that at y2 x..x2 characters are '+' or '-'+ scanUp :: Int -> Int -> Int -> Int -> Maybe (Int, Int)+ scanUp x y x2 y2+ | all (\y' -> T.index (rs !! y') x `elem` ['+', '|']) [y..y2] = return (x2, y2)+ | otherwise = fail $ "not a border (up) " ++ show (x,y,x2,y2)++-- | table cell: top left bottom right+data TC = TC !Int !Int !Int !Int+ deriving Show++tcXS :: TC -> [Int]+tcXS (TC _ x _ x2) = [x, x2]++tcYS :: TC -> [Int]+tcYS (TC y _ y2 _) = [y, y2]++-- | Fourth step. Given the locations of cells, forms 'Table' structure.+tableStepFour :: [Text] -> Maybe Int -> [TC] -> Parser (Table (DocH mod Identifier))+tableStepFour rs hdrIndex cells = case hdrIndex of+ Nothing -> return $ Table [] rowsDoc+ Just i -> case elemIndex i yTabStops of+ Nothing -> return $ Table [] rowsDoc+ Just i' -> return $ uncurry Table $ splitAt i' rowsDoc+ where+ xTabStops = sortNub $ concatMap tcXS cells+ yTabStops = sortNub $ concatMap tcYS cells++ sortNub :: Ord a => [a] -> [a]+ sortNub = Set.toList . Set.fromList++ init' :: [a] -> [a]+ init' [] = []+ init' [_] = []+ init' (x : xs) = x : init' xs++ rowsDoc = (fmap . fmap) parseParagraph rows++ rows = map makeRow (init' yTabStops)+ where+ makeRow y = TableRow $ mapMaybe (makeCell y) cells+ makeCell y (TC y' x y2 x2)+ | y /= y' = Nothing+ | otherwise = Just $ TableCell xts yts (extract (x + 1) (y + 1) (x2 - 1) (y2 - 1))+ where+ xts = length $ P.takeWhile (< x2) $ dropWhile (< x) xTabStops+ yts = length $ P.takeWhile (< y2) $ dropWhile (< y) yTabStops++ -- extract cell contents given boundaries+ extract :: Int -> Int -> Int -> Int -> Text+ extract x y x2 y2 = T.intercalate "\n"+ [ T.stripEnd $ T.stripStart $ T.take (x2 - x + 1) $ T.drop x $ rs !! y'+ | y' <- [y .. y2]+ ]++-- | Parse \@since annotations.+since :: Parser (DocH mod a)+since = ("@since " *> version <* skipHorizontalSpace <* endOfLine) >>= setSince >> return DocEmpty+ where+ version = decimal `Parsec.sepBy1` "."++-- | Headers inside the comment denoted with @=@ signs, up to 6 levels+-- deep.+--+-- >>> snd <$> parseOnly header "= Hello"+-- Right (DocHeader (Header {headerLevel = 1, headerTitle = DocString "Hello"}))+-- >>> snd <$> parseOnly header "== World"+-- Right (DocHeader (Header {headerLevel = 2, headerTitle = DocString "World"}))+header :: Parser (DocH mod Identifier)+header = do+ let psers = map (string . flip T.replicate "=") [6, 5 .. 1]+ pser = Parsec.choice psers+ depth <- T.length <$> pser+ line <- parseText <$> (skipHorizontalSpace *> nonEmptyLine)+ rest <- try paragraph <|> return DocEmpty+ return $ DocHeader (Header depth line) `docAppend` rest++textParagraph :: Parser (DocH mod Identifier)+textParagraph = parseText . T.intercalate "\n" <$> some nonEmptyLine++textParagraphThatStartsWithMarkdownLink :: Parser (DocH mod Identifier)+textParagraphThatStartsWithMarkdownLink = docParagraph <$> (docAppend <$> markdownLink <*> optionalTextParagraph)+ where+ optionalTextParagraph :: Parser (DocH mod Identifier)+ optionalTextParagraph = choice' [ docAppend <$> whitespace <*> textParagraph+ , pure DocEmpty ]++ whitespace :: Parser (DocH mod a)+ whitespace = DocString <$> (f <$> takeHorizontalSpace <*> optional "\n")+ where+ f :: Text -> Maybe Text -> String+ f xs (fromMaybe "" -> x)+ | T.null (xs <> x) = ""+ | otherwise = " "++-- | Parses unordered (bullet) lists.+unorderedList :: Text -> Parser (DocH mod Identifier)+unorderedList indent = DocUnorderedList <$> p+ where+ p = ("*" <|> "-") *> innerList indent p++-- | Parses ordered lists (numbered or dashed).+orderedList :: Text -> Parser (DocH mod Identifier)+orderedList indent = DocOrderedList <$> p+ where+ p = do+ index <- paren <|> dot+ innerList' indent p index+ dot = (decimal :: Parser Int) <* "."+ paren = "(" *> decimal <* ")"++-- | Like 'innerList' but takes the parsed index of the list item+innerList' :: Text -> Parser [(Int, DocH mod Identifier)]+ -> Int+ -> Parser [(Int, DocH mod Identifier)]+innerList' indent item index = do+ c <- takeLine+ (cs, items) <- more indent item+ let contents = docParagraph . parseText . dropNLs . T.unlines $ c : cs+ return $ case items of+ Left p -> [(index, contents `docAppend` p)]+ Right i -> (index, contents) : i++-- | Generic function collecting any further lines belonging to the+-- list entry and recursively collecting any further lists in the+-- same paragraph. Usually used as+--+-- > someListFunction = listBeginning *> innerList someListFunction+innerList :: Text -> Parser [DocH mod Identifier]+ -> Parser [DocH mod Identifier]+innerList indent item = do+ c <- takeLine+ (cs, items) <- more indent item+ let contents = docParagraph . parseText . dropNLs . T.unlines $ c : cs+ return $ case items of+ Left p -> [contents `docAppend` p]+ Right i -> contents : i++-- | Parses definition lists.+definitionList :: Text -> Parser (DocH mod Identifier)+definitionList indent = DocDefList <$> p+ where+ p = do+ label <- "[" *> (parseParagraph <$> takeWhile1_ (`notElem` ("]\n" :: String))) <* ("]" <* optional ":")+ c <- takeLine+ (cs, items) <- more indent p+ let contents = parseText . dropNLs . T.unlines $ c : cs+ return $ case items of+ Left x -> [(label, contents `docAppend` x)]+ Right i -> (label, contents) : i++-- | Drops all trailing newlines.+dropNLs :: Text -> Text+dropNLs = T.dropWhileEnd (== '\n')++-- | Main worker for 'innerList' and 'definitionList'.+-- We need the 'Either' here to be able to tell in the respective functions+-- whether we're dealing with the next list or a nested paragraph.+more :: Monoid a => Text -> Parser a+ -> Parser ([Text], Either (DocH mod Identifier) a)+more indent item = choice' [ innerParagraphs indent+ , moreListItems indent item+ , moreContent indent item+ , pure ([], Right mempty)+ ]++-- | Used by 'innerList' and 'definitionList' to parse any nested paragraphs.+innerParagraphs :: Text+ -> Parser ([Text], Either (DocH mod Identifier) a)+innerParagraphs indent = (,) [] . Left <$> ("\n" *> indentedParagraphs indent)++-- | Attempts to fetch the next list if possibly. Used by 'innerList' and+-- 'definitionList' to recursively grab lists that aren't separated by a whole+-- paragraph.+moreListItems :: Text -> Parser a+ -> Parser ([Text], Either (DocH mod Identifier) a)+moreListItems indent item = (,) [] . Right <$> indentedItem+ where+ indentedItem = string indent *> Parsec.spaces *> item++-- | Helper for 'innerList' and 'definitionList' which simply takes+-- a line of text and attempts to parse more list content with 'more'.+moreContent :: Monoid a => Text -> Parser a+ -> Parser ([Text], Either (DocH mod Identifier) a)+moreContent indent item = first . (:) <$> nonEmptyLine <*> more indent item++-- | Parses an indented paragraph.+-- The indentation is 4 spaces.+indentedParagraphs :: Text -> Parser (DocH mod Identifier)+indentedParagraphs indent =+ (T.unpack . T.concat <$> dropFrontOfPara indent') >>= parseParagraphs+ where+ indent' = string $ indent <> " "++-- | Grab as many fully indented paragraphs as we can.+dropFrontOfPara :: Parser Text -> Parser [Text]+dropFrontOfPara sp = do+ currentParagraph <- some (try (sp *> takeNonEmptyLine))+ followingParagraphs <-+ choice' [ skipHorizontalSpace *> nextPar -- we have more paragraphs to take+ , skipHorizontalSpace *> nlList -- end of the ride, remember the newline+ , Parsec.eof *> return [] -- nothing more to take at all+ ]+ return (currentParagraph ++ followingParagraphs)+ where+ nextPar = (++) <$> nlList <*> dropFrontOfPara sp+ nlList = "\n" *> return ["\n"]++nonSpace :: Text -> Parser Text+nonSpace xs+ | T.all isSpace xs = fail "empty line"+ | otherwise = return xs++-- | Takes a non-empty, not fully whitespace line.+--+-- Doesn't discard the trailing newline.+takeNonEmptyLine :: Parser Text+takeNonEmptyLine = do+ l <- takeWhile1 (/= '\n') >>= nonSpace+ _ <- "\n"+ pure (l <> "\n")++-- | Takes indentation of first non-empty line.+--+-- More precisely: skips all whitespace-only lines and returns indentation+-- (horizontal space, might be empty) of that non-empty line.+takeIndent :: Parser Text+takeIndent = do+ indent <- takeHorizontalSpace+ choice' [ "\n" *> takeIndent+ , return indent+ ]++-- | Blocks of text of the form:+--+-- >> foo+-- >> bar+-- >> baz+--+birdtracks :: Parser (DocH mod a)+birdtracks = DocCodeBlock . DocString . T.unpack . T.intercalate "\n" . stripSpace <$> some line+ where+ line = try (skipHorizontalSpace *> ">" *> takeLine)++stripSpace :: [Text] -> [Text]+stripSpace = fromMaybe <*> mapM strip'+ where+ strip' t = case T.uncons t of+ Nothing -> Just ""+ Just (' ',t') -> Just t'+ _ -> Nothing++-- | Parses examples. Examples are a paragraph level entity (separated by an empty line).+-- Consecutive examples are accepted.+examples :: Parser (DocH mod a)+examples = DocExamples <$> (many (try (skipHorizontalSpace *> "\n")) *> go)+ where+ go :: Parser [Example]+ go = do+ prefix <- takeHorizontalSpace <* ">>>"+ expr <- takeLine+ (rs, es) <- resultAndMoreExamples+ return (makeExample prefix expr rs : es)+ where+ resultAndMoreExamples :: Parser ([Text], [Example])+ resultAndMoreExamples = choice' [ moreExamples, result, pure ([], []) ]+ where+ moreExamples :: Parser ([Text], [Example])+ moreExamples = (,) [] <$> go++ result :: Parser ([Text], [Example])+ result = first . (:) <$> nonEmptyLine <*> resultAndMoreExamples++ makeExample :: Text -> Text -> [Text] -> Example+ makeExample prefix expression res =+ Example (T.unpack (T.strip expression)) result+ where+ result = map (T.unpack . substituteBlankLine . tryStripPrefix) res++ tryStripPrefix xs = fromMaybe xs (T.stripPrefix prefix xs)++ substituteBlankLine "<BLANKLINE>" = ""+ substituteBlankLine xs = xs++nonEmptyLine :: Parser Text+nonEmptyLine = try (mfilter (T.any (not . isSpace)) takeLine)++takeLine :: Parser Text+takeLine = try (takeWhile (/= '\n') <* endOfLine)++endOfLine :: Parser ()+endOfLine = void "\n" <|> Parsec.eof++-- | Property parser.+--+-- >>> snd <$> parseOnly property "prop> hello world"+-- Right (DocProperty "hello world")+property :: Parser (DocH mod a)+property = DocProperty . T.unpack . T.strip <$> ("prop>" *> takeWhile1 (/= '\n'))++-- |+-- Paragraph level codeblock. Anything between the two delimiting \@ is parsed+-- for markup.+codeblock :: Parser (DocH mod Identifier)+codeblock =+ DocCodeBlock . parseParagraph . dropSpaces+ <$> ("@" *> skipHorizontalSpace *> "\n" *> block' <* "@")+ where+ dropSpaces xs =+ case splitByNl xs of+ [] -> xs+ ys -> case T.uncons (last ys) of+ Just (' ',_) -> case mapM dropSpace ys of+ Nothing -> xs+ Just zs -> T.intercalate "\n" zs+ _ -> xs++ -- This is necessary because ‘lines’ swallows up a trailing newline+ -- and we lose information about whether the last line belongs to @ or to+ -- text which we need to decide whether we actually want to be dropping+ -- anything at all.+ splitByNl = unfoldr (\x -> case T.uncons x of+ Just ('\n',x') -> Just (T.span (/= '\n') x')+ _ -> Nothing)+ . ("\n" <>)++ dropSpace t = case T.uncons t of+ Nothing -> Just ""+ Just (' ',t') -> Just t'+ _ -> Nothing++ block' = scan p False+ where+ p isNewline c+ | isNewline && c == '@' = Nothing+ | isNewline && isSpace c = Just isNewline+ | otherwise = Just $ c == '\n'++hyperlink :: Parser (DocH mod Identifier)+hyperlink = choice' [ angleBracketLink, autoUrl ]++angleBracketLink :: Parser (DocH mod a)+angleBracketLink =+ DocHyperlink . makeLabeled (\s -> Hyperlink s . fmap DocString)+ <$> disallowNewline ("<" *> takeUntil ">")++-- | The text for a markdown link, enclosed in square brackets.+markdownLinkText :: Parser (DocH mod Identifier)+markdownLinkText = parseParagraph . T.strip <$> ("[" *> takeUntil "]")++-- | The target for a markdown link, enclosed in parenthesis.+markdownLinkTarget :: Parser String+markdownLinkTarget = whitespace *> url+ where+ whitespace :: Parser ()+ whitespace = skipHorizontalSpace <* optional ("\n" *> skipHorizontalSpace)++ url :: Parser String+ url = rejectWhitespace (decode <$> ("(" *> takeUntil ")"))++ rejectWhitespace :: MonadPlus m => m String -> m String+ rejectWhitespace = mfilter (all (not . isSpace))++ decode :: Text -> String+ decode = T.unpack . removeEscapes++-- | Looks for URL-like things to automatically hyperlink even if they+-- weren't marked as links.+autoUrl :: Parser (DocH mod a)+autoUrl = mkLink <$> url+ where+ url = mappend <$> choice' [ "http://", "https://", "ftp://"] <*> takeWhile1 (not . isSpace)++ mkLink :: Text -> DocH mod a+ mkLink s = case T.unsnoc s of+ Just (xs,x) | x `elem` (",.!?" :: String) -> DocHyperlink (mkHyperlink xs) `docAppend` DocString [x]+ _ -> DocHyperlink (mkHyperlink s)++ mkHyperlink :: Text -> Hyperlink (DocH mod a)+ mkHyperlink lnk = Hyperlink (T.unpack lnk) Nothing+++-- | Parses identifiers with help of 'parseValid'.+identifier :: Parser (DocH mod Identifier)+identifier = DocIdentifier <$> parseValid
@@ -0,0 +1,159 @@+{-# LANGUAGE BangPatterns #-}+-- |+-- Module : Documentation.Haddock.Parser.Identifier+-- Copyright : (c) Alec Theriault 2019,+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Functionality for parsing identifiers and operators++module Documentation.Haddock.Parser.Identifier (+ Identifier(..),+ parseValid,+) where++import Documentation.Haddock.Types ( Namespace(..) )+import Documentation.Haddock.Parser.Monad+import qualified Text.Parsec as Parsec+import Text.Parsec.Pos ( updatePosChar )+import Text.Parsec ( State(..)+ , getParserState, setParserState )++import Data.Text (Text)+import qualified Data.Text as T++import Data.Char (isAlpha, isAlphaNum)+import Control.Monad (guard)+import Data.Maybe+import CompatPrelude++-- | Identifier string surrounded with namespace, opening, and closing quotes/backticks.+data Identifier = Identifier !Namespace !Char String !Char+ deriving (Show, Eq)++parseValid :: Parser Identifier+parseValid = do+ s@State{ stateInput = inp, statePos = pos } <- getParserState++ case takeIdentifier inp of+ Nothing -> Parsec.parserFail "parseValid: Failed to match a valid identifier"+ Just (ns, op, ident, cl, inp') ->+ let posOp = updatePosChar pos op+ posIdent = T.foldl updatePosChar posOp ident+ posCl = updatePosChar posIdent cl+ s' = s{ stateInput = inp', statePos = posCl }+ in setParserState s' $> Identifier ns op (T.unpack ident) cl+++-- | Try to parse a delimited identifier off the front of the given input.+--+-- This tries to match as many valid Haskell identifiers/operators as possible,+-- to the point of sometimes accepting invalid things (ex: keywords). Some+-- considerations:+--+-- - operators and identifiers can have module qualifications+-- - operators can be wrapped in parens (for prefix)+-- - identifiers can be wrapped in backticks (for infix)+-- - delimiters are backticks or regular ticks+-- - since regular ticks are also valid in identifiers, we opt for the+-- longest successful parse+--+-- This function should make /O(1)/ allocations+takeIdentifier :: Text -> Maybe (Namespace, Char, Text, Char, Text)+takeIdentifier input = listToMaybe $ do++ -- Optional namespace+ let (ns, input') = case T.uncons input of+ Just ('v', i) -> (Value, i)+ Just ('t', i) -> (Type, i)+ _ -> (None, input)++ -- Opening tick+ (op, input'') <- maybeToList (T.uncons input')+ guard (op == '\'' || op == '`')++ -- Identifier/operator+ (ident, input''') <- wrapped input''++ -- Closing tick+ (cl, input'''') <- maybeToList (T.uncons input''')+ guard (cl == '\'' || cl == '`')++ return (ns, op, ident, cl, input'''')++ where++ -- | Parse out a wrapped, possibly qualified, operator or identifier+ wrapped t = do+ (c, t' ) <- maybeToList (T.uncons t)+ -- Tuples+ case c of+ '(' | Just (c', _) <- T.uncons t'+ , c' == ',' || c' == ')'+ -> do let (commas, t'') = T.span (== ',') t'+ (')', t''') <- maybeToList (T.uncons t'')+ return (T.take (T.length commas + 2) t, t''')++ -- Parenthesized+ '(' -> do (n, t'' ) <- general False 0 [] t'+ (')', t''') <- maybeToList (T.uncons t'')+ return (T.take (n + 2) t, t''')++ -- Backticked+ '`' -> do (n, t'' ) <- general False 0 [] t'+ ('`', t''') <- maybeToList (T.uncons t'')+ return (T.take (n + 2) t, t''')++ -- Unadorned+ _ -> do (n, t'' ) <- general False 0 [] t+ return (T.take n t, t'')++ -- | Parse out a possibly qualified operator or identifier+ general :: Bool -- ^ refuse inputs starting with operators+ -> Int -- ^ total characters \"consumed\" so far+ -> [(Int, Text)] -- ^ accumulated results+ -> Text -- ^ current input+ -> [(Int, Text)] -- ^ total characters parsed & what remains+ general !identOnly !i acc t+ -- Starts with an identifier (either just an identifier, or a module qual)+ | Just (n, rest) <- identLike t+ = if T.null rest+ then acc+ else case T.head rest of+ '`' -> (n + i, rest) : acc+ ')' -> (n + i, rest) : acc+ '.' -> general False (n + i + 1) acc (T.tail rest)+ '\'' -> let (m, rest') = quotes rest+ in general True (n + m + 1 + i) ((n + m + i, rest') : acc) (T.tail rest')+ _ -> acc++ -- An operator+ | Just (n, rest) <- optr t+ , not identOnly+ = (n + i, rest) : acc++ -- Anything else+ | otherwise+ = acc++ -- | Parse an identifier off the front of the input+ identLike t+ | T.null t = Nothing+ | isAlpha (T.head t) || '_' == T.head t+ = let !(idt, rest) = T.span (\c -> isAlphaNum c || c == '_') t+ !(octos, rest') = T.span (== '#') rest+ in Just (T.length idt + T.length octos, rest')+ | otherwise = Nothing++ -- | Parse all but the last quote off the front of the input+ -- PRECONDITION: T.head t `elem` ['\'', '`']+ quotes :: Text -> (Int, Text)+ quotes t = let !n = T.length (T.takeWhile (`elem` ['\'', '`']) t) - 1+ in (n, T.drop n t)++ -- | Parse an operator off the front of the input+ optr t = let !(op, rest) = T.span isSymbolChar t+ in if T.null op then Nothing else Just (T.length op, rest)
@@ -0,0 +1,149 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE BangPatterns #-}+-- |+-- Module : Documentation.Haddock.Parser.Monad+-- Copyright : (c) Alec Theriault 2018-2019,+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Defines the Parsec monad over which all parsing is done and also provides+-- more efficient versions of the usual parsec combinator functions (but+-- specialized to 'Text').++module Documentation.Haddock.Parser.Monad where++import qualified Text.Parsec.Char as Parsec+import qualified Text.Parsec as Parsec+import Text.Parsec.Pos ( updatePosChar )+import Text.Parsec ( State(..)+ , getParserState, setParserState )++import qualified Data.Text as T+import Data.Text ( Text )++import Control.Monad ( mfilter )+import Data.String ( IsString(..) )+import Data.Bits ( Bits(..) )+import Data.Char ( ord )+import Data.List ( foldl' )+import Control.Applicative as App++import Documentation.Haddock.Types ( Version )++import Prelude hiding (takeWhile)+import CompatPrelude++-- | The only bit of information we really care about trudging along with us+-- through parsing is the version attached to a @\@since@ annotation - if+-- the doc even contained one.+newtype ParserState = ParserState {+ parserStateSince :: Maybe Version+} deriving (Eq, Show)++initialParserState :: ParserState+initialParserState = ParserState Nothing++setSince :: Version -> Parser ()+setSince since = Parsec.modifyState (\st -> st{ parserStateSince = Just since })++type Parser = Parsec.Parsec Text ParserState++instance (a ~ Text) => IsString (Parser a) where+ fromString = fmap T.pack . Parsec.string++parseOnly :: Parser a -> Text -> Either String (ParserState, a)+parseOnly p t = case Parsec.runParser p' initialParserState "<haddock>" t of+ Left e -> Left (show e)+ Right (x,s) -> Right (s,x)+ where p' = (,) <$> p <*> Parsec.getState++-- | Always succeeds, but returns 'Nothing' if at the end of input. Does not+-- consume input.+--+-- Equivalent to @Parsec.optionMaybe . Parsec.lookAhead $ Parsec.anyChar@, but+-- more efficient.+peekChar :: Parser (Maybe Char)+peekChar = headOpt . stateInput <$> getParserState+ where headOpt t | T.null t = Nothing+ | otherwise = Just (T.head t)+{-# INLINE peekChar #-}++-- | Fails if at the end of input. Does not consume input.+--+-- Equivalent to @Parsec.lookAhead Parsec.anyChar@, but more efficient.+peekChar' :: Parser Char+peekChar' = headFail . stateInput =<< getParserState+ where headFail t | T.null t = Parsec.parserFail "peekChar': reached EOF"+ | otherwise = App.pure (T.head t)+{-# INLINE peekChar' #-}++-- | Parses the given string. Returns the parsed string.+--+-- Equivalent to @Parsec.string (T.unpack t) $> t@, but more efficient.+string :: Text -> Parser Text+string t = do+ s@State{ stateInput = inp, statePos = pos } <- getParserState+ case T.stripPrefix t inp of+ Nothing -> Parsec.parserFail "string: Failed to match the input string"+ Just inp' ->+ let pos' = T.foldl updatePosChar pos t+ s' = s{ stateInput = inp', statePos = pos' }+ in setParserState s' $> t++-- | Keep matching characters as long as the predicate function holds (and+-- return them).+--+-- Equivalent to @fmap T.pack . Parsec.many@, but more efficient.+takeWhile :: (Char -> Bool) -> Parser Text+takeWhile f = do+ s@State{ stateInput = inp, statePos = pos } <- getParserState+ let (t, inp') = T.span f inp+ pos' = T.foldl updatePosChar pos t+ s' = s{ stateInput = inp', statePos = pos' }+ setParserState s' $> t++-- | Like 'takeWhile', but fails if no characters matched.+--+-- Equivalent to @fmap T.pack . Parsec.many1@, but more efficient.+takeWhile1 :: (Char -> Bool) -> Parser Text+takeWhile1 = mfilter (not . T.null) . takeWhile++-- | Scan the input text, accumulating characters as long as the scanning+-- function returns true.+scan :: (s -> Char -> Maybe s) -- ^ scan function+ -> s -- ^ initial state+ -> Parser Text +scan f st = do+ s@State{ stateInput = inp, statePos = pos } <- getParserState+ go inp st pos 0 $ \inp' pos' n ->+ let s' = s{ Parsec.stateInput = inp', Parsec.statePos = pos' }+ in setParserState s' $> T.take n inp+ where+ go inp s !pos !n cont+ = case T.uncons inp of+ Nothing -> cont inp pos n -- ran out of input+ Just (c, inp') ->+ case f s c of+ Nothing -> cont inp pos n -- scan function failed+ Just s' -> go inp' s' (updatePosChar pos c) (n+1) cont+++-- | Parse a decimal number.+decimal :: Integral a => Parser a+decimal = foldl' step 0 `fmap` Parsec.many1 Parsec.digit+ where step a c = a * 10 + fromIntegral (ord c - 48)++-- | Parse a hexadecimal number.+hexadecimal :: (Integral a, Bits a) => Parser a+hexadecimal = foldl' step 0 `fmap` Parsec.many1 Parsec.hexDigit + where+ step a c | w >= 48 && w <= 57 = (a `shiftL` 4) .|. fromIntegral (w - 48)+ | w >= 97 = (a `shiftL` 4) .|. fromIntegral (w - 87)+ | otherwise = (a `shiftL` 4) .|. fromIntegral (w - 55)+ where w = ord c
@@ -0,0 +1,79 @@+{-# LANGUAGE OverloadedStrings #-}+-- |+-- Module : Documentation.Haddock.Parser.Util+-- Copyright : (c) Mateusz Kowalczyk 2013-2014,+-- Simon Hengel 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskell.org+-- Stability : experimental+-- Portability : portable+--+-- Various utility functions used by the parser.+module Documentation.Haddock.Parser.Util (+ takeUntil,+ removeEscapes,+ makeLabeled,+ takeHorizontalSpace,+ skipHorizontalSpace,+) where++import qualified Text.Parsec as Parsec++import qualified Data.Text as T+import Data.Text (Text)++import Control.Applicative+import Control.Monad (mfilter)+import Documentation.Haddock.Parser.Monad+import Prelude hiding (takeWhile)++import Data.Char (isSpace)++-- | Characters that count as horizontal space+horizontalSpace :: Char -> Bool+horizontalSpace c = isSpace c && c /= '\n'++-- | Skip and ignore leading horizontal space+skipHorizontalSpace :: Parser ()+skipHorizontalSpace = Parsec.skipMany (Parsec.satisfy horizontalSpace)++-- | Take leading horizontal space+takeHorizontalSpace :: Parser Text+takeHorizontalSpace = takeWhile horizontalSpace++makeLabeled :: (String -> Maybe String -> a) -> Text -> a+makeLabeled f input = case T.break isSpace $ removeEscapes $ T.strip input of+ (uri, "") -> f (T.unpack uri) Nothing+ (uri, label) -> f (T.unpack uri) (Just . T.unpack $ T.stripStart label)++-- | Remove escapes from given string.+--+-- Only do this if you do not process (read: parse) the input any further.+removeEscapes :: Text -> Text+removeEscapes = T.unfoldr go+ where+ go :: Text -> Maybe (Char, Text)+ go xs = case T.uncons xs of+ Just ('\\',ys) -> T.uncons ys+ unconsed -> unconsed++-- | Consume characters from the input up to and including the given pattern.+-- Return everything consumed except for the end pattern itself.+takeUntil :: Text -> Parser Text+takeUntil end_ = T.dropEnd (T.length end_) <$> requireEnd (scan p (False, end)) >>= gotSome+ where+ end = T.unpack end_++ p :: (Bool, String) -> Char -> Maybe (Bool, String)+ p acc c = case acc of+ (True, _) -> Just (False, end)+ (_, []) -> Nothing+ (_, x:xs) | x == c -> Just (False, xs)+ _ -> Just (c == '\\', end)++ requireEnd = mfilter (T.isSuffixOf end_)++ gotSome xs+ | T.null xs = fail "didn't get any content"+ | otherwise = return xs
@@ -0,0 +1,262 @@+{-# LANGUAGE CPP, DeriveTraversable #-}++-- |+-- Module : Documentation.Haddock.Types+-- Copyright : (c) Simon Marlow 2003-2006,+-- David Waern 2006-2009,+-- Mateusz Kowalczyk 2013+-- License : BSD-like+--+-- Maintainer : haddock@projects.haskellorg+-- Stability : experimental+-- Portability : portable+--+-- Exposes documentation data types used for (some) of Haddock.+module Documentation.Haddock.Types where++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative+import Data.Foldable+import Data.Traversable+#endif++#if MIN_VERSION_base(4,8,0)+import Control.Arrow ((***))+import Data.Bifunctor+#endif++#if MIN_VERSION_base(4,10,0)+import Data.Bifoldable+import Data.Bitraversable+#endif++-- | With the advent of 'Version', we may want to start attaching more+-- meta-data to comments. We make a structure for this ahead of time+-- so we don't have to gut half the core each time we want to add such+-- info.+data Meta = Meta { _version :: Maybe Version+ , _package :: Maybe Package+ } deriving (Eq, Show)++data MetaDoc mod id =+ MetaDoc { _meta :: Meta+ , _doc :: DocH mod id+ } deriving (Eq, Show, Functor, Foldable, Traversable)++#if MIN_VERSION_base(4,8,0)+-- | __NOTE__: Only defined for @base >= 4.8.0@+instance Bifunctor MetaDoc where+ bimap f g (MetaDoc m d) = MetaDoc m (bimap f g d)+#endif++#if MIN_VERSION_base(4,10,0)+-- | __NOTE__: Only defined for @base >= 4.10.0@+instance Bifoldable MetaDoc where+ bifoldr f g z d = bifoldr f g z (_doc d)++-- | __NOTE__: Only defined for @base >= 4.10.0@+instance Bitraversable MetaDoc where+ bitraverse f g (MetaDoc m d) = MetaDoc m <$> bitraverse f g d+#endif++overDoc :: (DocH a b -> DocH c d) -> MetaDoc a b -> MetaDoc c d+overDoc f d = d { _doc = f $ _doc d }++overDocF :: Functor f => (DocH a b -> f (DocH c d)) -> MetaDoc a b -> f (MetaDoc c d)+overDocF f d = (\x -> d { _doc = x }) <$> f (_doc d)++type Version = [Int]+type Package = String++data Hyperlink id = Hyperlink+ { hyperlinkUrl :: String+ , hyperlinkLabel :: Maybe id+ } deriving (Eq, Show, Functor, Foldable, Traversable)++data ModLink id = ModLink+ { modLinkName :: String+ , modLinkLabel :: Maybe id+ } deriving (Eq, Show, Functor, Foldable, Traversable)++data Picture = Picture+ { pictureUri :: String+ , pictureTitle :: Maybe String+ } deriving (Eq, Show)++data Header id = Header+ { headerLevel :: Int -- ^ between 1 and 6 inclusive+ , headerTitle :: id+ } deriving (Eq, Show, Functor, Foldable, Traversable)++data Example = Example+ { exampleExpression :: String+ , exampleResult :: [String]+ } deriving (Eq, Show)++data TableCell id = TableCell+ { tableCellColspan :: Int+ , tableCellRowspan :: Int+ , tableCellContents :: id+ } deriving (Eq, Show, Functor, Foldable, Traversable)++newtype TableRow id = TableRow+ { tableRowCells :: [TableCell id]+ } deriving (Eq, Show, Functor, Foldable, Traversable)++data Table id = Table+ { tableHeaderRows :: [TableRow id]+ , tableBodyRows :: [TableRow id]+ } deriving (Eq, Show, Functor, Foldable, Traversable)++data DocH mod id+ = DocEmpty+ | DocAppend (DocH mod id) (DocH mod id)+ | DocString String+ | DocParagraph (DocH mod id)+ | DocIdentifier id+ | DocIdentifierUnchecked mod+ -- ^ A qualified identifier that couldn't be resolved.+ | DocModule (ModLink (DocH mod id))+ -- ^ A link to a module, with an optional label.+ | DocWarning (DocH mod id)+ -- ^ This constructor has no counterpart in Haddock markup.+ | DocEmphasis (DocH mod id)+ | DocMonospaced (DocH mod id)+ | DocBold (DocH mod id)+ | DocUnorderedList [DocH mod id]+ | DocOrderedList [(Int, DocH mod id)]+ | DocDefList [(DocH mod id, DocH mod id)]+ | DocCodeBlock (DocH mod id)+ | DocHyperlink (Hyperlink (DocH mod id))+ | DocPic Picture+ | DocMathInline String+ | DocMathDisplay String+ | DocAName String+ -- ^ A (HTML) anchor. It must not contain any spaces.+ | DocProperty String+ | DocExamples [Example]+ | DocHeader (Header (DocH mod id))+ | DocTable (Table (DocH mod id))+ deriving (Eq, Show, Functor, Foldable, Traversable)++#if MIN_VERSION_base(4,8,0)+-- | __NOTE__: Only defined for @base >= 4.8.0@+instance Bifunctor DocH where+ bimap _ _ DocEmpty = DocEmpty+ bimap f g (DocAppend docA docB) = DocAppend (bimap f g docA) (bimap f g docB)+ bimap _ _ (DocString s) = DocString s+ bimap f g (DocParagraph doc) = DocParagraph (bimap f g doc)+ bimap _ g (DocIdentifier i) = DocIdentifier (g i)+ bimap f _ (DocIdentifierUnchecked m) = DocIdentifierUnchecked (f m)+ bimap f g (DocModule (ModLink m lbl)) = DocModule (ModLink m (fmap (bimap f g) lbl))+ bimap f g (DocWarning doc) = DocWarning (bimap f g doc)+ bimap f g (DocEmphasis doc) = DocEmphasis (bimap f g doc)+ bimap f g (DocMonospaced doc) = DocMonospaced (bimap f g doc)+ bimap f g (DocBold doc) = DocBold (bimap f g doc)+ bimap f g (DocUnorderedList docs) = DocUnorderedList (map (bimap f g) docs)+ bimap f g (DocOrderedList docs) = DocOrderedList (map (\(index, a) -> (index, bimap f g a)) docs)+ bimap f g (DocDefList docs) = DocDefList (map (bimap f g *** bimap f g) docs)+ bimap f g (DocCodeBlock doc) = DocCodeBlock (bimap f g doc)+ bimap f g (DocHyperlink (Hyperlink url lbl)) = DocHyperlink (Hyperlink url (fmap (bimap f g) lbl))+ bimap _ _ (DocPic picture) = DocPic picture+ bimap _ _ (DocMathInline s) = DocMathInline s+ bimap _ _ (DocMathDisplay s) = DocMathDisplay s+ bimap _ _ (DocAName s) = DocAName s+ bimap _ _ (DocProperty s) = DocProperty s+ bimap _ _ (DocExamples examples) = DocExamples examples+ bimap f g (DocHeader (Header level title)) = DocHeader (Header level (bimap f g title))+ bimap f g (DocTable (Table header body)) = DocTable (Table (map (fmap (bimap f g)) header) (map (fmap (bimap f g)) body))+#endif++#if MIN_VERSION_base(4,10,0)+-- | __NOTE__: Only defined for @base >= 4.10.0@+instance Bifoldable DocH where+ bifoldr f g z (DocAppend docA docB) = bifoldr f g (bifoldr f g z docA) docB+ bifoldr f g z (DocParagraph doc) = bifoldr f g z doc+ bifoldr _ g z (DocIdentifier i) = g i z+ bifoldr f _ z (DocIdentifierUnchecked m) = f m z+ bifoldr f g z (DocWarning doc) = bifoldr f g z doc+ bifoldr f g z (DocEmphasis doc) = bifoldr f g z doc+ bifoldr f g z (DocMonospaced doc) = bifoldr f g z doc+ bifoldr f g z (DocBold doc) = bifoldr f g z doc+ bifoldr f g z (DocUnorderedList docs) = foldr (flip (bifoldr f g)) z docs+ bifoldr f g z (DocOrderedList docs) = foldr (flip (bifoldr f g)) z (map snd docs)+ bifoldr f g z (DocDefList docs) = foldr (\(l, r) acc -> bifoldr f g (bifoldr f g acc l) r) z docs+ bifoldr f g z (DocCodeBlock doc) = bifoldr f g z doc+ bifoldr f g z (DocHeader (Header _ title)) = bifoldr f g z title+ bifoldr f g z (DocTable (Table header body)) = foldr (\r acc -> foldr (flip (bifoldr f g)) acc r) (foldr (\r acc -> foldr (flip (bifoldr f g)) acc r) z body) header+ bifoldr _ _ z _ = z++-- | __NOTE__: Only defined for @base >= 4.10.0@+instance Bitraversable DocH where+ bitraverse _ _ DocEmpty = pure DocEmpty+ bitraverse f g (DocAppend docA docB) = DocAppend <$> bitraverse f g docA <*> bitraverse f g docB+ bitraverse _ _ (DocString s) = pure (DocString s)+ bitraverse f g (DocParagraph doc) = DocParagraph <$> bitraverse f g doc+ bitraverse _ g (DocIdentifier i) = DocIdentifier <$> g i+ bitraverse f _ (DocIdentifierUnchecked m) = DocIdentifierUnchecked <$> f m+ bitraverse f g (DocModule (ModLink m lbl)) = DocModule <$> (ModLink m <$> traverse (bitraverse f g) lbl)+ bitraverse f g (DocWarning doc) = DocWarning <$> bitraverse f g doc+ bitraverse f g (DocEmphasis doc) = DocEmphasis <$> bitraverse f g doc+ bitraverse f g (DocMonospaced doc) = DocMonospaced <$> bitraverse f g doc+ bitraverse f g (DocBold doc) = DocBold <$> bitraverse f g doc+ bitraverse f g (DocUnorderedList docs) = DocUnorderedList <$> traverse (bitraverse f g) docs+ bitraverse f g (DocOrderedList docs) = DocOrderedList <$> traverseSnd (bitraverse f g) docs+ where traverseSnd f' = traverse (\(x, a) -> (\b -> (x, b)) <$> f' a)+ bitraverse f g (DocDefList docs) = DocDefList <$> traverse (bitraverse (bitraverse f g) (bitraverse f g)) docs+ bitraverse f g (DocCodeBlock doc) = DocCodeBlock <$> bitraverse f g doc+ bitraverse f g (DocHyperlink (Hyperlink url lbl)) = DocHyperlink <$> (Hyperlink url <$> traverse (bitraverse f g) lbl)+ bitraverse _ _ (DocPic picture) = pure (DocPic picture)+ bitraverse _ _ (DocMathInline s) = pure (DocMathInline s)+ bitraverse _ _ (DocMathDisplay s) = pure (DocMathDisplay s)+ bitraverse _ _ (DocAName s) = pure (DocAName s)+ bitraverse _ _ (DocProperty s) = pure (DocProperty s)+ bitraverse _ _ (DocExamples examples) = pure (DocExamples examples)+ bitraverse f g (DocHeader (Header level title)) = (DocHeader . Header level) <$> bitraverse f g title+ bitraverse f g (DocTable (Table header body)) = (\h b -> DocTable (Table h b)) <$> traverse (traverse (bitraverse f g)) header <*> traverse (traverse (bitraverse f g)) body+#endif++-- | The namespace qualification for an identifier.+data Namespace = Value | Type | None deriving (Eq, Ord, Enum, Show)++-- | Render the a namespace into the same format it was initially parsed.+renderNs :: Namespace -> String+renderNs Value = "v"+renderNs Type = "t"+renderNs None = ""+++-- | 'DocMarkupH' is a set of instructions for marking up documentation.+-- In fact, it's really just a mapping from 'Doc' to some other+-- type [a], where [a] is usually the type of the output (HTML, say).+-- Use 'Documentation.Haddock.Markup.markup' to apply a 'DocMarkupH' to+-- a 'DocH'.+--+-- @since 1.4.5+--+data DocMarkupH mod id a = Markup+ { markupEmpty :: a+ , markupString :: String -> a+ , markupParagraph :: a -> a+ , markupAppend :: a -> a -> a+ , markupIdentifier :: id -> a+ , markupIdentifierUnchecked :: mod -> a+ , markupModule :: ModLink a -> a+ , markupWarning :: a -> a+ , markupEmphasis :: a -> a+ , markupBold :: a -> a+ , markupMonospaced :: a -> a+ , markupUnorderedList :: [a] -> a+ , markupOrderedList :: [(Int,a)] -> a+ , markupDefList :: [(a,a)] -> a+ , markupCodeBlock :: a -> a+ , markupHyperlink :: Hyperlink a -> a+ , markupAName :: String -> a+ , markupPic :: Picture -> a+ , markupMathInline :: String -> a+ , markupMathDisplay :: String -> a+ , markupProperty :: String -> a+ , markupExample :: [Example] -> a+ , markupHeader :: Header a -> a+ , markupTable :: Table a -> a+ }
@@ -1,219 +1,194 @@+cabal-version: 3.0 name: haddock-version: 2.11.1+version: 2.29.1 synopsis: A documentation-generation tool for Haskell libraries-description: Haddock is a documentation-generation tool for Haskell- libraries-license: BSD3+description:+ This is Haddock, a tool for automatically generating documentation+ from annotated Haskell source code. It is primary intended for documenting+ library interfaces, but it should be useful for any kind of Haskell code.+ .+ Haddock lets you write documentation annotations next to the definitions of+ functions and types in the source code, in a syntax that is easy on the eye+ when writing the source code (no heavyweight mark-up).+ .+ Haddock understands Haskell's module system, so you can structure your code+ however you like without worrying that internal structure will be exposed in+ the generated documentation. For example, it is common to implement a library+ in several modules, but define the external API by having a single module+ which re-exports parts of these implementation modules. Using Haddock, you can+ still write documentation annotations next to the actual definitions of the+ functions and types in the library, but the documentation annotations from the+ implementation will be propagated to the external API when the documentation is+ generated. Abstract types and classes are handled correctly. In fact, even+ without any documentation annotations, Haddock can generate useful documentation+ from your source code.+ .+ Documentation for the haddock binary is available at [readthedocs](https://haskell-haddock.readthedocs.io/en/latest/).+ .+ <<https://cdn.rawgit.com/haskell/haddock/ghc-8.10/doc/cheatsheet/haddocks.svg>>+license: BSD-3-Clause license-file: LICENSE author: Simon Marlow, David Waern-maintainer: David Waern <david.waern@gmail.com>+maintainer: Alec Theriault <alec.theriault@gmail.com>, Alex Biehl <alexbiehl@gmail.com>, Simon Hengel <sol@typeful.net>, Mateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk> homepage: http://www.haskell.org/haddock/-bug-reports: http://trac.haskell.org/haddock+bug-reports: https://github.com/haskell/haddock/issues copyright: (c) Simon Marlow, David Waern category: Documentation build-type: Simple-cabal-version: >= 1.10-stability: experimental+tested-with: GHC==9.6.* extra-source-files:- CHANGES- README+ CHANGES.md+ README.md doc/Makefile- doc/README- doc/aclocal.m4- doc/config.mk.in- doc/configure.ac- doc/docbook-xml.mk- doc/fptools.css- doc/haddock.xml- examples/A.hs- examples/B.hs- examples/Bug1.hs- examples/Bug2.hs- examples/Bug3.hs- examples/Bug4.hs- examples/Bug6.hs- examples/Bug7.hs- examples/Bug8.hs- examples/Bug9.hs- examples/Hash.hs- examples/Hidden.hs- examples/Makefile- examples/NoLayout.hs- examples/Test.hs- examples/Visible.hs- examples/hide-bug/A.hs- examples/hide-bug/B.hs- examples/hide-bug/C.hs- examples/hide-bug/D.hs- haddock.spec- haskell.vim- src/haddock.sh--- The test files shouldn't have to go here, but the source files for--- the test-suite stanzas don't get picked up by `cabal sdist`.- tests/html-tests/runtests.hs--data-files:- html/frames.html- html/haddock-util.js- html/Classic.theme/haskell_icon.gif- html/Classic.theme/minus.gif- html/Classic.theme/plus.gif- html/Classic.theme/xhaddock.css- html/Ocean.std-theme/hslogo-16.png- html/Ocean.std-theme/minus.gif- html/Ocean.std-theme/ocean.css- html/Ocean.std-theme/plus.gif- html/Ocean.std-theme/synopsis.png- latex/haddock.sty+ doc/README.md+ doc/*.rst+ doc/conf.py+ haddock-api/src/haddock.sh+ html-test/src/*.hs+ html-test/ref/*.html+ hypsrc-test/src/*.hs+ hypsrc-test/src/*.h+ hypsrc-test/ref/src/*.html+ latex-test/src/**/*.hs+ latex-test/ref/**/*.tex+ hoogle-test/src/**/*.hs+ hoogle-test/ref/**/*.txt flag in-ghc-tree description: Are we in a GHC tree? default: False manual: True -flag test- default: False- manual: True- executable haddock default-language: Haskell2010- -- In a GHC tree - in particular, in a source tarball - we don't- -- require alex or happy- if !flag(in-ghc-tree)- build-tools: alex >= 2.3, happy >= 1.18+ main-is: Main.hs+ hs-source-dirs: driver+ ghc-options: -funbox-strict-fields -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates -O2 -threaded++ -- haddock typically only supports a single GHC major version build-depends:- base >= 4.3 && < 4.6,- filepath,- directory,- pretty,- containers,- array,- xhtml >= 3000.2 && < 3000.3,- Cabal >= 1.10,- ghc >= 7.4 && < 7.6+ base ^>= 4.13.0.0 || ^>= 4.14.0.0 || ^>= 4.15.0.0 || ^>= 4.16.0.0 || ^>= 4.17.0.0 || ^>= 4.18.0.0 || ^>= 4.19.0.0 if flag(in-ghc-tree)+ hs-source-dirs: haddock-api/src, haddock-library/src cpp-options: -DIN_GHC_TREE- else- build-depends: ghc-paths+ build-depends:+ filepath,+ directory,+ containers,+ deepseq,+ exceptions,+ array,+ xhtml >= 3000.2 && < 3000.3,+ ghc-boot,+ ghc-boot-th,+ ghc == 9.6.*,+ bytestring,+ parsec,+ text,+ transformers,+ mtl - if flag(test)- cpp-options: -DTEST- build-depends: QuickCheck >= 2.1 && < 3+ other-modules:+ CompatPrelude+ Documentation.Haddock.Parser+ Documentation.Haddock.Parser.Monad+ Documentation.Haddock.Parser.Identifier+ Documentation.Haddock.Types+ Documentation.Haddock.Doc+ Documentation.Haddock.Parser.Util+ Documentation.Haddock.Markup - main-is: Main.hs- hs-source-dirs: src- default-extensions: CPP, DeriveDataTypeable,- ScopedTypeVariables, MagicHash- ghc-options: -funbox-strict-fields -Wall -fwarn-tabs+ Documentation.Haddock+ Haddock+ Haddock.Interface+ Haddock.Interface.Json+ Haddock.Interface.Rename+ Haddock.Interface.Create+ Haddock.Interface.AttachInstances+ Haddock.Interface.LexParseRn+ Haddock.Interface.ParseModuleHeader+ Haddock.Interface.Specialize+ Haddock.Parser+ Haddock.Utils+ Haddock.Utils.Json+ Haddock.Utils.Json.Parser+ Haddock.Utils.Json.Types+ Haddock.Backends.Xhtml+ Haddock.Backends.Xhtml.Decl+ Haddock.Backends.Xhtml.DocMarkup+ Haddock.Backends.Xhtml.Layout+ Haddock.Backends.Xhtml.Meta+ Haddock.Backends.Xhtml.Names+ Haddock.Backends.Xhtml.Themes+ Haddock.Backends.Xhtml.Types+ Haddock.Backends.Xhtml.Utils+ Haddock.Backends.LaTeX+ Haddock.Backends.HaddockDB+ Haddock.Backends.Hoogle+ Haddock.Backends.Hyperlinker+ Haddock.Backends.Hyperlinker.Parser+ Haddock.Backends.Hyperlinker.Renderer+ Haddock.Backends.Hyperlinker.Types+ Haddock.Backends.Hyperlinker.Utils+ Haddock.ModuleTree+ Haddock.Types+ Haddock.Doc+ Haddock.Version+ Haddock.InterfaceFile+ Haddock.Options+ Haddock.GhcUtils+ Haddock.Syb+ Haddock.Convert - other-modules:- Haddock.Interface- Haddock.Interface.Rename- Haddock.Interface.Create- Haddock.Interface.AttachInstances- Haddock.Interface.LexParseRn- Haddock.Interface.ParseModuleHeader- Haddock.Lex- Haddock.Parse- Haddock.Utils- Haddock.Backends.Xhtml- Haddock.Backends.Xhtml.Decl- Haddock.Backends.Xhtml.DocMarkup- Haddock.Backends.Xhtml.Layout- Haddock.Backends.Xhtml.Names- Haddock.Backends.Xhtml.Themes- Haddock.Backends.Xhtml.Types- Haddock.Backends.Xhtml.Utils- Haddock.Backends.LaTeX- Haddock.Backends.HaddockDB- Haddock.Backends.Hoogle- Haddock.ModuleTree- Haddock.Types- Haddock.Doc- Haddock.Version- Haddock.InterfaceFile - Haddock.Options- Haddock.GhcUtils- Haddock.Convert- -library- default-language: Haskell2010- -- In a GHC tree - in particular, in a source tarball - we don't- -- require alex or happy- if !flag(in-ghc-tree)- build-tools: alex >= 2.3, happy >= 1.18- build-depends:- base >= 4.3 && < 4.6,- filepath,- directory,- pretty,- containers,- array,- xhtml >= 3000.2 && < 3000.3,- Cabal >= 1.10,- ghc >= 7.4 && < 7.6+ Paths_haddock - if flag(in-ghc-tree)- cpp-options: -DIN_GHC_TREE- else- build-depends: ghc-paths+ autogen-modules:+ Paths_haddock - if flag(test)- cpp-options: -DTEST- build-depends: QuickCheck >= 2.1 && < 3+ else+ -- in order for haddock's advertised version number to have proper meaning,+ -- we pin down to a single haddock-api version.+ build-depends: haddock-api == 2.29.1 - hs-source-dirs: src- default-extensions: CPP, DeriveDataTypeable,- ScopedTypeVariables, MagicHash- ghc-options: -funbox-strict-fields -Wall -fwarn-tabs+test-suite html-test+ type: exitcode-stdio-1.0+ -- This tells cabal that this test depends on the executable+ -- component 'haddock' from this very same package, as well+ -- as adding the build-folder where the `haddock`+ -- executable can be found in front of $PATH+ build-tool-depends: haddock:haddock+ default-language: Haskell2010+ main-is: Main.hs+ hs-source-dirs: html-test+ build-depends: base, filepath, haddock-test == 0.0.1 - exposed-modules:- Documentation.Haddock+test-suite hypsrc-test+ type: exitcode-stdio-1.0+ build-tool-depends: haddock:haddock+ default-language: Haskell2010+ main-is: Main.hs+ hs-source-dirs: hypsrc-test+ build-depends: base, filepath, haddock-test == 0.0.1+ ghc-options: -Wall -fwarn-tabs - other-modules:- Main- Haddock.Interface- Haddock.Interface.Rename- Haddock.Interface.Create- Haddock.Interface.AttachInstances- Haddock.Interface.LexParseRn- Haddock.Interface.ParseModuleHeader- Haddock.Lex- Haddock.Parse- Haddock.Utils- Haddock.Backends.Xhtml- Haddock.Backends.Xhtml.Decl- Haddock.Backends.Xhtml.DocMarkup- Haddock.Backends.Xhtml.Layout- Haddock.Backends.Xhtml.Names- Haddock.Backends.Xhtml.Themes- Haddock.Backends.Xhtml.Types- Haddock.Backends.Xhtml.Utils- Haddock.Backends.LaTeX- Haddock.Backends.HaddockDB- Haddock.Backends.Hoogle- Haddock.ModuleTree- Haddock.Types- Haddock.Doc- Haddock.Version- Haddock.InterfaceFile- Haddock.Options- Haddock.GhcUtils- Haddock.Convert- Paths_haddock- - if flag(in-ghc-tree)- buildable: False+test-suite latex-test+ type: exitcode-stdio-1.0+ build-tool-depends: haddock:haddock+ default-language: Haskell2010+ main-is: Main.hs+ hs-source-dirs: latex-test+ build-depends: base, filepath, haddock-test == 0.0.1 -test-suite html-tests- type: exitcode-stdio-1.0- default-language: Haskell2010- main-is: runtests.hs- hs-source-dirs: tests/html-tests- build-depends: base, directory, process, filepath, Cabal+test-suite hoogle-test+ type: exitcode-stdio-1.0+ build-tool-depends: haddock:haddock+ default-language: Haskell2010+ main-is: Main.hs+ hs-source-dirs: hoogle-test+ build-depends: base, filepath, haddock-test == 0.0.1 source-repository head type: git- location: http://darcs.haskell.org/haddock.git+ location: https://github.com/haskell/haddock.git
@@ -1,81 +0,0 @@-# This is an RPM spec file that specifies how to package-# haddock for Red Hat Linux and, possibly, similar systems.-# It has been tested on Red Hat Linux 7.2 and SuSE Linux 9.1.-#-# If this file is part of a tarball, you can build RPMs directly from-# the tarball by using the following command:-#-# rpm -ta haddock-(VERSION).tar.gz-#-# The resulting package will be placed in the RPMS/(arch) subdirectory-# of your RPM build directory (usually /usr/src/redhat or ~/rpm), with-# the name haddock-(VERSION)-(RELEASE).noarch.rpm. A corresponding-# source RPM package will be in the SRPMS subdirectory.-#-# NOTE TO HADDOCK MAINTAINERS: When you release a new version of-# Haskell mode, update the version definition below to match the-# version label of your release tarball.--%define name haddock-%define version 2.11.0-%define release 1--Name: %{name}-Version: %{version}-Release: %{release}-License: BSD-like-Group: Development/Languages/Haskell-URL: http://haskell.org/haddock/-Source: http://haskell.org/haddock/haddock-%{version}.tar.gz-Packager: Sven Panne <sven.panne@aedion.de>-BuildRoot: %{_tmppath}/%{name}-%{version}-build-Prefix: %{_prefix}-BuildRequires: ghc, docbook-dtd, docbook-xsl-stylesheets, libxslt, libxml2, fop, xmltex, dvips-Summary: A documentation tool for annotated Haskell source code--%description-Haddock is a tool for automatically generating documentation from-annotated Haskell source code. It is primary intended for documenting-libraries, but it should be useful for any kind of Haskell code.--Haddock lets you write documentation annotations next to the-definitions of functions and types in the source code, in a syntax-that is easy on the eye when writing the source code (no heavyweight-mark-up). The documentation generated by Haddock is fully hyperlinked--- click on a type name in a type signature to go straight to the-definition, and documentation, for that type.--Haddock can generate documentation in multiple formats; currently HTML-is implemented, and there is partial support for generating DocBook.-The generated HTML uses stylesheets, so you need a fairly up-to-date-browser to view it properly (Mozilla, Konqueror, Opera, and IE 6-should all be ok).--%prep-%setup--%build-runhaskell Setup.lhs configure --prefix=%{_prefix} --docdir=%{_datadir}/doc/packages/%{name}-runhaskell Setup.lhs build-cd doc-test -f configure || autoreconf-./configure-make html--%install-runhaskell Setup.lhs copy --destdir=${RPM_BUILD_ROOT}--%clean-rm -rf ${RPM_BUILD_ROOT}--%files-%defattr(-,root,root)-%doc CHANGES-%doc LICENSE-%doc README-%doc TODO-%doc doc/haddock-%doc examples-%doc haskell.vim-%{prefix}/bin/haddock-%{prefix}/share/haddock-%{version}
@@ -1,68 +0,0 @@-" Attempt to add haddock highlighting for haskell comments-" It should be placed in ~/.vim/after/syntax/haskell.vim-" Brad Bowman <haddock.vim@bereft.net>--syn match hsHdocChunk "$\i\+" contained-syn match hsHdocMod /"\(\i\|[.]\)\+"/ contained-syn match hsHdocLink "'\(\i\|[.#]\)\+'" contained-syn region hsHdocAnchor start="\\\@<!#" skip="\\#" end="\\\@<!#" contained oneline-" I think emphasis can span multiple lines-syn region hsHdocEm start="\\\@<!/" skip="\\/" end="\\\@!/" contained oneline-syn region hsHdocURL start="\\\@<!<" end="\\\@<!>" contained oneline-syn region hsHdocCode start="\\\@<!@" skip="\\@" end="\\\@<!@" contained oneline-syn region hsHdocBCodeBlock start="^@\(\s\|$\)" end="^@\s*$" contained-syn region hsHdocLCodeBlock start="\(^\s*--\s*\)\@<=@\s*$" end="\(^\s*--\s*\)\@<=@\s*$" contained-syn match hsHdocBHeading "^\s*\*\+" contained-syn match hsHdocLHeading "\(^\s*--\s*\)\@<=\*\+" contained-syn match hsHdocBTracks "^\s*>" contained-" match only the > using a look-behind-syn match hsHdocLTracks "\(^\s*--\s*\)\@<=>" contained--" todo: numbered lists, mark haddock start separately-"syn match hsHdocStart "\([$^|]\|\*\+\)" contained--syn cluster hsHdocSpecial - \ contains=hsHdocMod,hsHdocLink,hsHdocEm,hsHdocCode,hsHdocURL,- \ hsHdocAnchor,hsHdocChunk--syn region hsHdocDef start="^\s*\(--\)\?\s*\[" end="\]" contained contains=hsHdocSpecial--syn region hsHdocLines start="--\s*\([$\^|]\|\*\+\)" - \ skip="^\s*\(--.*\)$" - \ end="^\s*\(\$\|--\)\@!" - \ contains=@hsHdocSpecial,hsHdocLTracks,hsHdocLHeading,hsHdocLCodeBlock,hsHdocDef-syn region hsHdocBlock start="{-\s*\([$\^|]\|\*\+\)" end="-}" - \ contains=@hsHdocSpecial,hsHdocBTracks,hsHdocBHeading,hsHdocBCodeBlock,hsHdocDef--syn sync minlines=20--if version >= 508 || !exists("did_haddock_syntax_inits")- if version < 508- let did_haddock_syntax_inits = 1- command -nargs=+ HiLink hi link <args>- else- command -nargs=+ HiLink hi def link <args>- endif-- HiLink hsHdocLines hsHdoc- HiLink hsHdocBlock hsHdoc- HiLink hsHdoc PreProc- HiLink hsHdocAnchor Special- HiLink hsHdocChunk Special- HiLink hsHdocMod Special- HiLink hsHdocLink Special- HiLink hsHdocEm Special- HiLink hsHdocURL Special- HiLink hsHdocCode Special- HiLink hsHdocLHeading Special- HiLink hsHdocBHeading Special- HiLink hsHdocLTracks Special- HiLink hsHdocBTracks Special- HiLink hsHdocBCodeBlock Special- HiLink hsHdocLCodeBlock Special- HiLink hsHdocSpecial Special-- delcommand HiLink -endif--" Options for vi: sw=2 sts=2 nowrap ft=vim
@@ -0,0 +1,34 @@+{-# LANGUAGE CPP #-}+++import Data.Function+import System.Environment+import System.FilePath++import Test.Haddock+import Test.Haddock.Utils+++checkConfig :: CheckConfig String+checkConfig = CheckConfig+ { ccfgRead = Just+ , ccfgClean = \_ -> id+ , ccfgDump = id+ , ccfgEqual = (==) `on` crlfToLf+ }+++dirConfig :: DirConfig+dirConfig = defaultDirConfig $ takeDirectory __FILE__+++main :: IO ()+main = do+ cfg <- parseArgs checkConfig dirConfig =<< getArgs+ runAndCheck $ cfg+ { cfgHaddockArgs = cfgHaddockArgs cfg +++ [ "--package-name=test"+ , "--package-version=0.0.0"+ , "--hoogle"+ ]+ }
@@ -0,0 +1,16 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Bug722+class Foo a+(!@#) :: Foo a => a -> a -> a+infixl 4 !@#+type family (&*) :: * -> * -> *+infixr 3 &*+data a :-& b+(:^&) :: a -> b -> (:-&) a b+infixl 6 :-&+infixl 6 :^&
@@ -0,0 +1,25 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Bug806++-- | <a>F1</a> docs+type family F1 a b :: * -> *++-- | <a>F2</a> docs+type family F2 a b :: * -> *++-- | <a>D</a> docs+data family D a :: * -> *+v :: Int++-- | <a>C</a> docs+class C a where {+ + -- | <a>AT</a> docs+ type AT a;+ type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))));+}
@@ -0,0 +1,9 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Bug825+data a :~: b+data (:~~:) a b
@@ -0,0 +1,19 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Bug946++-- | A wrapper around <a>Int</a>+data AnInt++-- | some <a>Int</a>+AnInt :: Int -> AnInt++-- | The <a>Int</a> 0+pattern Zero :: AnInt++-- | The double 2.5+pattern TwoPointFive :: Double
@@ -0,0 +1,9 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Bug992+data K (m :: * -> *)+K :: K (m :: * -> *)
@@ -0,0 +1,14 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module AssocTypes+class Foo a where {+ type Bar a b;+ type Baz a;+ type Baz a = [(a, a)];+}+bar :: Foo a => Bar a a+instance AssocTypes.Foo [a]
@@ -0,0 +1,17 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Classes+class Foo f+bar :: Foo f => f a -> f b -> f (a, b)+baz :: Foo f => f ()+class Quux q+(+++) :: Quux q => q -> q -> q+(///) :: Quux q => q -> q -> q+(***) :: Quux q => q -> q -> q+logBase :: Quux q => q -> q -> q+foo :: Quux q => q -> q -> q+quux :: Quux q => q -> q -> q
@@ -0,0 +1,13 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Fixity+(+++) :: a -> a -> a+infix 6 ++++(***) :: a -> a -> a+infixl 7 ***+(///) :: a -> a -> a+infixr 8 ///
@@ -0,0 +1,13 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module Foo+foo :: Int -> Int+foo' :: Int -> Int -> Int++module Bar+bar :: Int -> Int+bar' :: Int -> Int -> Int
@@ -0,0 +1,16 @@+-- Hoogle documentation, generated by Haddock+-- See Hoogle, http://www.haskell.org/hoogle/++@package test+@version 0.0.0++module ReaderT+newtype ReaderT r m a+ReaderT :: (r -> m a) -> ReaderT r m a+[runReaderT] :: ReaderT r m a -> r -> m a++module ReaderTReexport+newtype ReaderT r m a+ReaderT :: (r -> m a) -> ReaderT r m a+[runReaderT] :: ReaderT r m a -> r -> m a+runReaderT :: ReaderT r m a -> r -> m a
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeOperators, TypeFamilies #-}+module Bug722 where++class Foo a where+ (!@#) :: a -> a -> a+infixl 4 !@#++type family (&*) :: * -> * -> *+infixr 3 &*++data a :-& b = a :^& b+infixl 6 :-&, :^&+
@@ -0,0 +1,24 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}+module Bug806 where++import Data.Proxy++-- | 'F1' docs+type family F1 a b :: * -> *+-- | 'F2' docs+type family F2 a b :: * -> * where+ F2 Int b = Maybe+ F2 a b = []+-- | 'D' docs+data family D a :: * -> *++v :: Int+v = 42++-- | 'C' docs+class C a where+ -- | 'AT' docs+ type AT a+ type AT a = Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy (Proxy)))))))))
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeOperators #-}+module Bug825 where++data a :~: b+data (:~~:) a b
@@ -0,0 +1,17 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE PatternSynonyms #-}+module Bug946 (+ AnInt(AnInt, Zero),+ pattern TwoPointFive,+) where++-- | A wrapper around 'Int'+data AnInt = AnInt Int -- ^ some 'Int'++-- | The 'Int' 0+pattern Zero :: AnInt+pattern Zero = AnInt 0++-- | The double 2.5+pattern TwoPointFive :: Double+pattern TwoPointFive = 2.5
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE KindSignatures #-}++module Bug992 where++data K (m :: * -> *) = K
@@ -0,0 +1,25 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE AllowAmbiguousTypes #-}+++module AssocTypes where+++class Foo a where++ type Bar a b+ type Baz a++ type Baz a = [(a, a)]++ bar :: Bar a a+ bar = undefined+++instance Foo [a] where++ type Bar [a] Int = [(a, Bool)]+ type Bar [a] Bool = [(Int, a)]++ type Baz [a] = (a, a, a)
@@ -0,0 +1,17 @@+{-# LANGUAGE Haskell2010 #-}+module Classes where+++class Foo f where++ bar :: f a -> f b -> f (a, b)+ baz :: f ()++ baz = undefined+++class Quux q where++ (+++), (///) :: q -> q -> q+ (***), logBase :: q -> q -> q+ foo, quux :: q -> q -> q
@@ -0,0 +1,13 @@+{-# LANGUAGE Haskell2010 #-}+module Fixity where+++(+++), (***), (///) :: a -> a -> a+(+++) = undefined+(***) = undefined+(///) = undefined+++infix 6 ++++infixl 7 ***+infixr 8 ///
@@ -0,0 +1,13 @@+{-# LANGUAGE Haskell2010 #-}+module Bar where+++import Foo+++bar :: Int -> Int+bar x = foo' x x+++bar' :: Int -> Int -> Int+bar' x y = foo' (bar (foo x)) (bar (foo y))
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module Foo where+++foo :: Int -> Int+foo = (* 2)+++foo' :: Int -> Int -> Int+foo' x y = foo x + foo y
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module ReaderT where++newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module ReaderTReexport (ReaderT(..), runReaderT) where++import ReaderT
@@ -0,0 +1,62 @@+{-# LANGUAGE CPP #-}+++import Data.Char+import Data.Function (on)++import System.Environment+import System.FilePath++import Test.Haddock+import Test.Haddock.Xhtml+++checkConfig :: CheckConfig Xml+checkConfig = CheckConfig+ { ccfgRead = parseXml+ , ccfgClean = stripIfRequired+ , ccfgDump = dumpXml+ , ccfgEqual = (==) `on` dumpXml+ }+++dirConfig :: DirConfig+dirConfig = (defaultDirConfig $ takeDirectory __FILE__)+ { dcfgCheckIgnore = checkIgnore+ }+++main :: IO ()+main = do+ cfg <- parseArgs checkConfig dirConfig =<< getArgs+ runAndCheck $ cfg+ { cfgHaddockArgs = cfgHaddockArgs cfg ++ ["--pretty-html", "--html"]+ }+++stripIfRequired :: String -> Xml -> Xml+stripIfRequired mdl =+ stripLinks' . stripFooter+ where+ stripLinks'+ | mdl `elem` preserveLinksModules = id+ | otherwise = stripLinks+++-- | List of modules in which we don't 'stripLinks'+preserveLinksModules :: [String]+preserveLinksModules = ["Bug253.html", "NamespacedIdentifiers.html"]++ingoredTests :: [FilePath]+ingoredTests =+ [+ -- Currently some declarations are exported twice+ -- we need a reliable way to deduplicate here.+ -- Happens since PR #688.+ "B"+ ]++checkIgnore :: FilePath -> Bool+checkIgnore file | takeBaseName file `elem` ingoredTests = True+checkIgnore file@(c:_) | takeExtension file == ".html" && isUpper c = False+checkIgnore _ = True
@@ -0,0 +1,192 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >A</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >A</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >A</a+ > = <a href="#"+ >A</a+ ></li+ ><li class="src short"+ ><a href="#"+ >other</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >test2</a+ > :: <a href="#" title="Data.Bool"+ >Bool</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >X</a+ > = <a href="#"+ >X</a+ ></li+ ><li class="src short"+ ><a href="#"+ >reExport</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:A" class="def"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A" class="def"+ >A</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:other" class="def"+ >other</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:test2" class="def"+ >test2</a+ > :: <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for test2</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should show up on the page for both modules A and B</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:X" class="def"+ >X</a+ ></td+ ><td class="doc"+ ><p+ >Doc for consructor</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:reExport" class="def"+ >reExport</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should show up on the page for both modules A and B</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,174 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >B</title+ ><link href="#" rel="stylesheet" type="text/css" title="Ocean"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ ></span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe</td+ ></tr+ ></table+ ><p class="caption"+ >B</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ >module <a href="#"+ >A</a+ ></li+ ><li class="src short"+ ><a href="#"+ >test</a+ > :: <a href="#"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >reExport</a+ > :: <a href="#"+ >Int</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >X</a+ > = <a href="#"+ >X</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ >module <a href="#"+ >A</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:test" class="def"+ >test</a+ > :: <a href="#"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This link shouldn't work: <code+ >other</code+ >.+ These links should work: <code+ ><a href="#"+ >other</a+ ></code+ >, <code+ ><a href="#"+ >sortBy</a+ ></code+ >, <code+ ><a href="#"+ >test2</a+ ></code+ >, <code+ ><a href="#"+ >test2</a+ ></code+ >, <code+ ><a href="#"+ >fromMaybe</a+ ></code+ >.+ Module link: <a href="#"+ >Prelude</a+ >.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:reExport" class="def"+ >reExport</a+ > :: <a href="#"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should show up on the page for both modules A and B</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should show up on the page for both modules A and B</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:X" class="def"+ >X</a+ ></td+ ><td class="doc"+ ><p+ >Doc for consructor</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ><div id="footer"+ ></div+ ></body+ ></html+>
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bold</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bold</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Some <strong+ >bold text</strong+ >.</p+ ><ul+ ><li+ ><strong+ >Bold</strong+ > in a list</li+ ></ul+ ><dl+ ><dt+ ><strong+ >bold in a definition</strong+ ></dt+ ><dd+ >list</dd+ ></dl+ ><pre+ > bold <strong+ >in</strong+ > a <strong+ >code</strong+ > block</pre+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,107 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T</a+ > = <a href="#"+ >T</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T" class="def"+ >T</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >We should have different anchors for constructors and types/classes. This+ hyperlink should point to the type constructor by default: <code+ ><a href="#" title="Bug1"+ >T</a+ ></code+ >.</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:T" class="def"+ >T</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,2216 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1004</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1004</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Product</a+ > (f :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >) (g :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >) (a :: k) = <a href="#"+ >Pair</a+ > (f a) (g a)</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Product" class="def"+ >Product</a+ > (f :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >) (g :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >) (a :: k) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Lifted product of functors.</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Pair" class="def"+ >Pair</a+ > (f a) (g a)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Product"+ >Instances</h4+ ><details id="i:Product" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Generic1:1"+ ></span+ > <a href="#" title="GHC.Generics"+ >Generic1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Generic1:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g) :: k -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >from1</a+ > :: <span class="keyword"+ >forall</span+ > (a :: k0). <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g) a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >to1</a+ > :: <span class="keyword"+ >forall</span+ > (a :: k0). <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g) a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadFix:2"+ ></span+ > (<a href="#" title="Control.Monad.Fix"+ >MonadFix</a+ > f, <a href="#" title="Control.Monad.Fix"+ >MonadFix</a+ > g) => <a href="#" title="Control.Monad.Fix"+ >MonadFix</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:MonadFix:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >mfix</a+ > :: (a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadZip:3"+ ></span+ > (<a href="#" title="Control.Monad.Zip"+ >MonadZip</a+ > f, <a href="#" title="Control.Monad.Zip"+ >MonadZip</a+ > g) => <a href="#" title="Control.Monad.Zip"+ >MonadZip</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:MonadZip:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >mzip</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g (a, b) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >mzipWith</a+ > :: (a -> b -> c) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >munzip</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g (a, b) -> (<a href="#" title="Bug1004"+ >Product</a+ > f g a, <a href="#" title="Bug1004"+ >Product</a+ > f g b) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Foldable:4"+ ></span+ > (<a href="#" title="Data.Foldable"+ >Foldable</a+ > f, <a href="#" title="Data.Foldable"+ >Foldable</a+ > g) => <a href="#" title="Data.Foldable"+ >Foldable</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Foldable:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fold</a+ > :: <a href="#" title="Data.Monoid"+ >Monoid</a+ > m => <a href="#" title="Bug1004"+ >Product</a+ > f g m -> m <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldMap</a+ > :: <a href="#" title="Data.Monoid"+ >Monoid</a+ > m => (a -> m) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldMap'</a+ > :: <a href="#" title="Data.Monoid"+ >Monoid</a+ > m => (a -> m) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldr</a+ > :: (a -> b -> b) -> b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldr'</a+ > :: (a -> b -> b) -> b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldl</a+ > :: (b -> a -> b) -> b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldl'</a+ > :: (b -> a -> b) -> b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldr1</a+ > :: (a -> a -> a) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foldl1</a+ > :: (a -> a -> a) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >toList</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> [a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >null</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >length</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >elem</a+ > :: <a href="#" title="Data.Eq"+ >Eq</a+ > a => a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >maximum</a+ > :: <a href="#" title="Data.Ord"+ >Ord</a+ > a => <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >minimum</a+ > :: <a href="#" title="Data.Ord"+ >Ord</a+ > a => <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >sum</a+ > :: <a href="#" title="Prelude"+ >Num</a+ > a => <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >product</a+ > :: <a href="#" title="Prelude"+ >Num</a+ > a => <a href="#" title="Bug1004"+ >Product</a+ > f g a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Eq1:5"+ ></span+ > (<a href="#" title="Data.Functor.Classes"+ >Eq1</a+ > f, <a href="#" title="Data.Functor.Classes"+ >Eq1</a+ > g) => <a href="#" title="Data.Functor.Classes"+ >Eq1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Eq1:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >liftEq</a+ > :: (a -> b -> <a href="#" title="Data.Bool"+ >Bool</a+ >) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Ord1:6"+ ></span+ > (<a href="#" title="Data.Functor.Classes"+ >Ord1</a+ > f, <a href="#" title="Data.Functor.Classes"+ >Ord1</a+ > g) => <a href="#" title="Data.Functor.Classes"+ >Ord1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Ord1:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >liftCompare</a+ > :: (a -> b -> <a href="#" title="Data.Ord"+ >Ordering</a+ >) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Data.Ord"+ >Ordering</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Read1:7"+ ></span+ > (<a href="#" title="Data.Functor.Classes"+ >Read1</a+ > f, <a href="#" title="Data.Functor.Classes"+ >Read1</a+ > g) => <a href="#" title="Data.Functor.Classes"+ >Read1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Read1:7"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >liftReadsPrec</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > a) -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > [a] -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftReadList</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > a) -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > [a] -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > [<a href="#" title="Bug1004"+ >Product</a+ > f g a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftReadPrec</a+ > :: <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > a -> <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > [a] -> <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftReadListPrec</a+ > :: <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > a -> <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > [a] -> <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > [<a href="#" title="Bug1004"+ >Product</a+ > f g a] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Show1:8"+ ></span+ > (<a href="#" title="Data.Functor.Classes"+ >Show1</a+ > f, <a href="#" title="Data.Functor.Classes"+ >Show1</a+ > g) => <a href="#" title="Data.Functor.Classes"+ >Show1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Show1:8"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >liftShowsPrec</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ > -> a -> <a href="#" title="Text.Show"+ >ShowS</a+ >) -> ([a] -> <a href="#" title="Text.Show"+ >ShowS</a+ >) -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftShowList</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ > -> a -> <a href="#" title="Text.Show"+ >ShowS</a+ >) -> ([a] -> <a href="#" title="Text.Show"+ >ShowS</a+ >) -> [<a href="#" title="Bug1004"+ >Product</a+ > f g a] -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Traversable:9"+ ></span+ > (<a href="#" title="Data.Traversable"+ >Traversable</a+ > f, <a href="#" title="Data.Traversable"+ >Traversable</a+ > g) => <a href="#" title="Data.Traversable"+ >Traversable</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Traversable:9"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >traverse</a+ > :: <a href="#" title="Control.Applicative"+ >Applicative</a+ > f0 => (a -> f0 b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> f0 (<a href="#" title="Bug1004"+ >Product</a+ > f g b) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >sequenceA</a+ > :: <a href="#" title="Control.Applicative"+ >Applicative</a+ > f0 => <a href="#" title="Bug1004"+ >Product</a+ > f g (f0 a) -> f0 (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >mapM</a+ > :: <a href="#" title="Control.Monad"+ >Monad</a+ > m => (a -> m b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m (<a href="#" title="Bug1004"+ >Product</a+ > f g b) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >sequence</a+ > :: <a href="#" title="Control.Monad"+ >Monad</a+ > m => <a href="#" title="Bug1004"+ >Product</a+ > f g (m a) -> m (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Alternative:10"+ ></span+ > (<a href="#" title="Control.Applicative"+ >Alternative</a+ > f, <a href="#" title="Control.Applicative"+ >Alternative</a+ > g) => <a href="#" title="Control.Applicative"+ >Alternative</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Alternative:10"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >empty</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<|>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >some</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g [a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >many</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g [a] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Applicative:11"+ ></span+ > (<a href="#" title="Control.Applicative"+ >Applicative</a+ > f, <a href="#" title="Control.Applicative"+ >Applicative</a+ > g) => <a href="#" title="Control.Applicative"+ >Applicative</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Applicative:11"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >pure</a+ > :: a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g (a -> b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftA2</a+ > :: (a -> b -> c) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(*>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Functor:12"+ ></span+ > (<a href="#" title="Data.Functor"+ >Functor</a+ > f, <a href="#" title="Data.Functor"+ >Functor</a+ > g) => <a href="#" title="Data.Functor"+ >Functor</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Functor:12"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a -> b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<$)</a+ > :: a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Monad:13"+ ></span+ > (<a href="#" title="Control.Monad"+ >Monad</a+ > f, <a href="#" title="Control.Monad"+ >Monad</a+ > g) => <a href="#" title="Control.Monad"+ >Monad</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Monad:13"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >(>>=)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> (a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(>>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g b -> <a href="#" title="Bug1004"+ >Product</a+ > f g b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >return</a+ > :: a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadPlus:14"+ ></span+ > (<a href="#" title="Control.Monad"+ >MonadPlus</a+ > f, <a href="#" title="Control.Monad"+ >MonadPlus</a+ > g) => <a href="#" title="Control.Monad"+ >MonadPlus</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:MonadPlus:14"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >mzero</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >mplus</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Data:15"+ ></span+ > (<a href="#" title="Type.Reflection"+ >Typeable</a+ > a, <a href="#" title="Type.Reflection"+ >Typeable</a+ > f, <a href="#" title="Type.Reflection"+ >Typeable</a+ > g, <a href="#" title="Type.Reflection"+ >Typeable</a+ > k, <a href="#" title="Data.Data"+ >Data</a+ > (f a), <a href="#" title="Data.Data"+ >Data</a+ > (g a)) => <a href="#" title="Data.Data"+ >Data</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Data:15"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >gfoldl</a+ > :: (<span class="keyword"+ >forall</span+ > d b. <a href="#" title="Data.Data"+ >Data</a+ > d => c (d -> b) -> d -> c b) -> (<span class="keyword"+ >forall</span+ > g0. g0 -> c g0) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> c (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gunfold</a+ > :: (<span class="keyword"+ >forall</span+ > b r. <a href="#" title="Data.Data"+ >Data</a+ > b => c (b -> r) -> c r) -> (<span class="keyword"+ >forall</span+ > r. r -> c r) -> <a href="#" title="Data.Data"+ >Constr</a+ > -> c (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >toConstr</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Data"+ >Constr</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >dataTypeOf</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Data"+ >DataType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >dataCast1</a+ > :: <a href="#" title="Type.Reflection"+ >Typeable</a+ > t => (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => c (t d)) -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > (c (<a href="#" title="Bug1004"+ >Product</a+ > f g a)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >dataCast2</a+ > :: <a href="#" title="Type.Reflection"+ >Typeable</a+ > t => (<span class="keyword"+ >forall</span+ > d e. (<a href="#" title="Data.Data"+ >Data</a+ > d, <a href="#" title="Data.Data"+ >Data</a+ > e) => c (t d e)) -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > (c (<a href="#" title="Bug1004"+ >Product</a+ > f g a)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapT</a+ > :: (<span class="keyword"+ >forall</span+ > b. <a href="#" title="Data.Data"+ >Data</a+ > b => b -> b) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapQl</a+ > :: (r -> r' -> r) -> r -> (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> r') -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> r <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapQr</a+ > :: <span class="keyword"+ >forall</span+ > r r'. (r' -> r -> r) -> r -> (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> r') -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> r <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapQ</a+ > :: (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> u) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> [u] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapQi</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> u) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> u <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapM</a+ > :: <a href="#" title="Control.Monad"+ >Monad</a+ > m => (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> m d) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapMp</a+ > :: <a href="#" title="Control.Monad"+ >MonadPlus</a+ > m => (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> m d) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >gmapMo</a+ > :: <a href="#" title="Control.Monad"+ >MonadPlus</a+ > m => (<span class="keyword"+ >forall</span+ > d. <a href="#" title="Data.Data"+ >Data</a+ > d => d -> m d) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> m (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Monoid:16"+ ></span+ > (<a href="#" title="Data.Monoid"+ >Monoid</a+ > (f a), <a href="#" title="Data.Monoid"+ >Monoid</a+ > (g a)) => <a href="#" title="Data.Monoid"+ >Monoid</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.16.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Monoid:16"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >mempty</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >mappend</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >mconcat</a+ > :: [<a href="#" title="Bug1004"+ >Product</a+ > f g a] -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Semigroup:17"+ ></span+ > (<a href="#" title="Prelude"+ >Semigroup</a+ > (f a), <a href="#" title="Prelude"+ >Semigroup</a+ > (g a)) => <a href="#" title="Prelude"+ >Semigroup</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.16.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Semigroup:17"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >(<>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >sconcat</a+ > :: <a href="#" title="Data.List.NonEmpty"+ >NonEmpty</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >stimes</a+ > :: <a href="#" title="Prelude"+ >Integral</a+ > b => b -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Generic:18"+ ></span+ > <a href="#" title="GHC.Generics"+ >Generic</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Generic:18"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >from</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) x <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >to</a+ > :: <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) x -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Read:19"+ ></span+ > (<a href="#" title="Text.Read"+ >Read</a+ > (f a), <a href="#" title="Text.Read"+ >Read</a+ > (g a)) => <a href="#" title="Text.Read"+ >Read</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.18.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Read:19"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >readsPrec</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >readList</a+ > :: <a href="#" title="Text.ParserCombinators.ReadP"+ >ReadS</a+ > [<a href="#" title="Bug1004"+ >Product</a+ > f g a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >readPrec</a+ > :: <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >readListPrec</a+ > :: <a href="#" title="Text.ParserCombinators.ReadPrec"+ >ReadPrec</a+ > [<a href="#" title="Bug1004"+ >Product</a+ > f g a] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Show:20"+ ></span+ > (<a href="#" title="Text.Show"+ >Show</a+ > (f a), <a href="#" title="Text.Show"+ >Show</a+ > (g a)) => <a href="#" title="Text.Show"+ >Show</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.18.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Show:20"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >showsPrec</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >show</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >showList</a+ > :: [<a href="#" title="Bug1004"+ >Product</a+ > f g a] -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Eq:21"+ ></span+ > (<a href="#" title="Data.Eq"+ >Eq</a+ > (f a), <a href="#" title="Data.Eq"+ >Eq</a+ > (g a)) => <a href="#" title="Data.Eq"+ >Eq</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.18.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Eq:21"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >(==)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(/=)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Ord:22"+ ></span+ > (<a href="#" title="Data.Ord"+ >Ord</a+ > (f a), <a href="#" title="Data.Ord"+ >Ord</a+ > (g a)) => <a href="#" title="Data.Ord"+ >Ord</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.18.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Ord:22"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >compare</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Ord"+ >Ordering</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<=)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(>)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(>=)</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >max</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >min</a+ > :: <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a -> <a href="#" title="Bug1004"+ >Product</a+ > f g a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Rep1:23"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Rep1:23"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g :: k -> <a href="#" title="Data.Kind"+ >Type</a+ >) = <a href="#" title="GHC.Generics"+ >D1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaData</a+ > "Product" "Data.Functor.Product" "base" '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >C1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaCons</a+ > "Pair" '<a href="#" title="GHC.Generics"+ >PrefixI</a+ > '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Nothing</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="GHC.TypeLits"+ >Symbol</a+ >) '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec1</a+ > f) <a href="#" title="GHC.Generics"+ >:*:</a+ > <a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Nothing</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="GHC.TypeLits"+ >Symbol</a+ >) '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec1</a+ > g)))</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Rep:24"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.9.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Product:Rep:24"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Data.Functor.Product</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug1004"+ >Product</a+ > f g a) = <a href="#" title="GHC.Generics"+ >D1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaData</a+ > "Product" "Data.Functor.Product" "base" '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >C1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaCons</a+ > "Pair" '<a href="#" title="GHC.Generics"+ >PrefixI</a+ > '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Nothing</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="GHC.TypeLits"+ >Symbol</a+ >) '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec0</a+ > (f a)) <a href="#" title="GHC.Generics"+ >:*:</a+ > <a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Nothing</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="GHC.TypeLits"+ >Symbol</a+ >) '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec0</a+ > (g a))))</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,226 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1033</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1033</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Foo:Generic:1"+ ></span+ > <a href="#" title="GHC.Generics"+ >Generic</a+ > <a href="#" title="Bug1033"+ >Foo</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Foo:Generic:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1033</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > <a href="#" title="Bug1033"+ >Foo</a+ > :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >from</a+ > :: <a href="#" title="Bug1033"+ >Foo</a+ > -> <a href="#" title="GHC.Generics"+ >Rep</a+ > <a href="#" title="Bug1033"+ >Foo</a+ > x <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >to</a+ > :: <a href="#" title="GHC.Generics"+ >Rep</a+ > <a href="#" title="Bug1033"+ >Foo</a+ > x -> <a href="#" title="Bug1033"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Foo:Rep:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > <a href="#" title="Bug1033"+ >Foo</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >This does some generic foos.</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Foo:Rep:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1033</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > <a href="#" title="Bug1033"+ >Foo</a+ > = <a href="#" title="GHC.Generics"+ >D1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaData</a+ > "Foo" "Bug1033" "main" '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >C1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaCons</a+ > "Foo" '<a href="#" title="GHC.Generics"+ >PrefixI</a+ > '<a href="#" title="Data.Bool"+ >False</a+ >) (<a href="#" title="GHC.Generics"+ >U1</a+ > :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ >))</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,150 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1035</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1035</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > = <a href="#"+ >Bar</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Bar</a+ > = <a href="#"+ >Foo</a+ ></li+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A link to <code+ ><a href="#" title="Bug1035"+ >Foo</a+ ></code+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,116 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1050</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1050</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:T" class="def"+ >T</a+ > :: (<span class="keyword"+ >forall</span+ > k. k -> <a href="#" title="Data.Kind"+ >Type</a+ >) -> <span class="keyword"+ >forall</span+ > k. k -> <a href="#" title="Data.Kind"+ >Type</a+ > <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:MkT" class="def"+ >MkT</a+ > :: <span class="keyword"+ >forall</span+ > (f :: <span class="keyword"+ >forall</span+ > k. k -> <a href="#" title="Data.Kind"+ >Type</a+ >) k (a :: k). f a -> <a href="#" title="Bug1050"+ >T</a+ > f a</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:mkT" class="def"+ >mkT</a+ > :: <span class="keyword"+ >forall</span+ > {k} {f :: <span class="keyword"+ >forall</span+ > k. k -> <a href="#" title="Data.Kind"+ >Type</a+ >} {a :: k}. f a -> <a href="#" title="Bug1050"+ >T</a+ > f a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,96 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1054</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1054</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Header with <code+ >foo</code+ > link</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:1"+ ><h1+ >Header with <code+ >foo</code+ > link</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1063</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1063</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > (c => d) => <a id="t:Implies" class="def"+ >Implies</a+ > c d <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Implies"+ >Instances</h4+ ><details id="i:Implies" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Implies:Implies:1"+ ></span+ > (c => d) => <a href="#" title="Bug1063"+ >Implies</a+ > c d</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Implies:Implies:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1063</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,120 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1067A</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1067A</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >P</a+ > :: <a href="#" title="Bug1067A"+ >Foo</a+ ></li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A foo</p+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:P" class="def"+ >P</a+ > :: <a href="#" title="Bug1067A"+ >Foo</a+ ></td+ ><td class="doc"+ ><p+ >A pattern</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,90 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1067B</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1067B</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >P</a+ > :: <a href="#" title="Bug1067A"+ >Foo</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:P" class="def"+ >P</a+ > :: <a href="#" title="Bug1067A"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A pattern</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,560 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug1103</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug1103</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo1" class="def"+ >Foo1</a+ > :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo1"+ >Instances</h4+ ><details id="i:Foo1" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo1:Foo1:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo1:Foo1:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo1Bool" class="def"+ >Foo1Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo1:Foo1:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo1:Foo1:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo1</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo2" class="def"+ >Foo2</a+ > :: k -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo2"+ >Instances</h4+ ><details id="i:Foo2" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo2Bool" class="def"+ >Foo2Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo2:Foo2:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo2:Foo2:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo2</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Foo3" class="def"+ >Foo3</a+ > :: k <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo3"+ >Instances</h4+ ><details id="i:Foo3" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ > -> <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (a :: <a href="#" title="Data.Char"+ >Char</a+ >)</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > = <a id="v:Foo3Bool" class="def"+ >Foo3Bool</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo3:Foo3:5"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo3:Foo3:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug1103</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug1103"+ >Foo3</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,188 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug195</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug195</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T" class="def"+ >T</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A" class="def"+ >A</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:someField" class="def"+ >someField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someField of A</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:someOtherField" class="def"+ >someOtherField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someOtherField of A</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B" class="def"+ >B</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:someField" class="def"+ >someField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someField of A</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:someOtherField" class="def"+ >someOtherField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someOtherField of A</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C" class="def"+ >C</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:someField" class="def"+ >someField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someField of A</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:someOtherField" class="def"+ >someOtherField</a+ > :: ()</dfn+ ><div class="doc"+ ><p+ >Doc for someOtherField of A</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,68 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug2</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="A"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,109 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug201</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug201</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: ()</li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><pre+ >This leading whitespace+should be dropped+</pre+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><pre+ > But this one+ should not+</pre+ ><pre+ >this should+be dropped</pre+ ><pre+ >and so should this+because there's a space before closing @+</pre+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug253</title+ ><link href="linuwial.css" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="quick-jump.css"+ /><link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="index.html"+ >Contents</a+ ></li+ ><li+ ><a href="doc-index.html"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug253</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This module tests that if we're trying to link to a <em+ >qualified</em+ >+ identifier that's not in scope, we get an anchor as if it was a+ variable. Previous behaviour was to treat it as a type constructor+ so issue like #253 arose. Also see <code+ >rename</code+ > function comments in+ source.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#v:foo"+ >foo</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: () <a href="#v:foo" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This link should generate <code+ >#v</code+ > anchor: <code+ ><a href="DoesNotExist.html#v:fakeFakeFake" title="DoesNotExist"+ >fakeFakeFake</a+ ></code+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,216 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug26</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug26</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This module tests the ‘@since …’ annotation.</p+ ><p+ ><em+ >Since: 1.2.3</em+ ></p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: ()</li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: ()</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >C</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >c_f</a+ > :: a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Foo</p+ ><p+ ><em+ >Since: 2.10.8</em+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Bar</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:C" class="def"+ >C</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Class</p+ ><p+ ><em+ >Since: 1.0</em+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:c_f" class="def"+ >c_f</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ ><em+ >Since: 1.2.3</em+ ></p+ ></div+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:C"+ >Instances</h4+ ><details id="i:C" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:C:C:1"+ ></span+ > <a href="#" title="Bug26"+ >C</a+ > ()</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >instance for ()</p+ ><p+ ><em+ >Since: 0.7.8</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:C:C:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug26</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >c_f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,84 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug280</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th valign="top"+ >Copyright</th+ ><td+ >Foo<br+ />Bar<br+ />Baz</td+ ></tr+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug280</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >The module description</p+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,378 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug294</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug294</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:A" class="def"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:A"+ >Instances</h4+ ><details id="i:A" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:A:DP:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >DP</a+ > <a href="#" title="Bug294"+ >A</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:A:DP:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug294</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >DP</a+ > <a href="#" title="Bug294"+ >A</a+ > = <a id="v:ProblemCtor-39-" class="def"+ >ProblemCtor'</a+ > <a href="#" title="Bug294"+ >A</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:A:TP:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TP</a+ > <a href="#" title="Bug294"+ >A</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:A:TP:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug294</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TP</a+ > <a href="#" title="Bug294"+ >A</a+ > = <a id="v:ProblemCtor" class="def"+ >ProblemCtor</a+ > <a href="#" title="Bug294"+ >A</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:problemField" class="def"+ >problemField</a+ > :: TO <a href="#" title="Bug294"+ >A</a+ > -> <a href="#" title="Bug294"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:problemField-39-" class="def"+ >problemField'</a+ > :: DO <a href="#" title="Bug294"+ >A</a+ > -> <a href="#" title="Bug294"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:gadtField" class="def"+ >gadtField</a+ > :: GADT <a href="#" title="Bug294"+ >A</a+ > -> <a href="#" title="Bug294"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:TP" class="def"+ >TP</a+ > t :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:TP"+ >Instances</h4+ ><details id="i:TP" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:TP:TP:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TP</a+ > <a href="#" title="Bug294"+ >A</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:TP:TP:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug294</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TP</a+ > <a href="#" title="Bug294"+ >A</a+ > = <a id="v:ProblemCtor" class="def"+ >ProblemCtor</a+ > <a href="#" title="Bug294"+ >A</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:DP" class="def"+ >DP</a+ > t :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:DP"+ >Instances</h4+ ><details id="i:DP" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:DP:DP:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >DP</a+ > <a href="#" title="Bug294"+ >A</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:DP:DP:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug294</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >DP</a+ > <a href="#" title="Bug294"+ >A</a+ > = <a id="v:ProblemCtor-39-" class="def"+ >ProblemCtor'</a+ > <a href="#" title="Bug294"+ >A</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:TO-39-" class="def"+ >TO'</a+ > t :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:TO-39-"+ >Instances</h4+ ><details id="i:TO-39-" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:TO-39-:TO-39-:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TO'</a+ > a</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:TO-39-:TO-39-:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug294</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Bug294"+ >TO'</a+ > a = <a id="v:PolyCtor" class="def"+ >PolyCtor</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,146 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug298</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug298</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >(<^>)</a+ > :: (a -> a) -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >(<^)</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >(^>)</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >(⋆^)</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:-60--94--62-" class="def"+ >(<^>)</a+ > :: (a -> a) -> a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-60--94-" class="def"+ >(<^)</a+ > :: a -> a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-94--62-" class="def"+ >(^>)</a+ > :: a -> a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-8902--94-" class="def"+ >(⋆^)</a+ > :: a -> a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Links to <code+ ><a href="#" title="Bug298"+ ><^></a+ ></code+ > and <code+ ><a href="#" title="Bug298"+ >^></a+ ></code+ >, <code+ ><a href="#" title="Bug298"+ ><^</a+ ></code+ > and <code+ ><a href="#" title="Bug298"+ >⋆^</a+ ></code+ >.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,87 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug3</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug3</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >/multi-line+ emphasis/</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,118 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug308</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug308</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: ()</li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >start<a id="startAnchor"+ ></a+ > followed by middle<a id="middleAnchor"+ ></a+ > and end<a id="endAnchor"+ ></a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >start <a href="#"+ >Bug308</a+ ></p+ ><p+ >startOldStyle <a href="#"+ >Bug308</a+ ></p+ ><p+ >middle <a href="#"+ >Bug308</a+ ></p+ ><p+ >end <a href="#"+ >Bug308</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,96 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug308CrossModule</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug308CrossModule</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >h</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:h" class="def"+ >h</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >start <a href="#"+ >Bug308</a+ ></p+ ><p+ >startOldStyle <a href="#"+ >Bug308</a+ ></p+ ><p+ >middle <a href="#"+ >Bug308</a+ ></p+ ><p+ >end <a href="#"+ >Bug308</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,110 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug310</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug310</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > (a :: <a href="#" title="Numeric.Natural"+ >Natural</a+ >) <a href="#"+ >+</a+ > (b :: <a href="#" title="Numeric.Natural"+ >Natural</a+ >) :: <a href="#" title="Numeric.Natural"+ >Natural</a+ > <span class="keyword"+ >where ...</span+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > (a :: <a href="#" title="Numeric.Natural"+ >Natural</a+ >) <a id="t:-43-" class="def"+ >+</a+ > (b :: <a href="#" title="Numeric.Natural"+ >Natural</a+ >) :: <a href="#" title="Numeric.Natural"+ >Natural</a+ > <span class="keyword"+ >where ...</span+ > <span class="fixity"+ >infixl 6</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Addition of type-level naturals.</p+ ><p+ ><em+ >Since: base-4.7.0.0</em+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,139 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug313</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug313</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >The first list is incorrectly numbered as 1. 2. 1.; the second example+ renders fine (1. 2. 3.).</p+ ><p+ >See <a href="#"+ >https://github.com/haskell/haddock/issues/313</a+ ></p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >a</a+ > :: a</li+ ><li class="src short"+ ><a href="#"+ >b</a+ > :: a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:a" class="def"+ >a</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Some text.</p+ ><ol+ ><li value="1"+ >Item 1</li+ ><li value="2"+ ><p+ >Item 2</p+ ><pre+ >Some code</pre+ ></li+ ><li value="3"+ >Item 3</li+ ></ol+ ><p+ >Some more text.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:b" class="def"+ >b</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Some text.</p+ ><ol+ ><li value="1"+ >Item 1</li+ ><li value="2"+ ><p+ >Item 2</p+ ><pre+ >Some code</pre+ ></li+ ><li value="3"+ >Item 3</li+ ></ol+ ><p+ >Some more text.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,136 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug335</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug335</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: ()</li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><h3 class="subheading details-toggle-control details-toggle" data-details-id="ch:f0"+ >ExF:</h3+ ><details id="ch:f0"+ ><summary class="hide-when-js-enabled"+ >Expand</summary+ ><p+ >abc</p+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><h3 class="subheading details-toggle-control details-toggle" data-details-id="ch:g0"+ >ExG:</h3+ ><details id="ch:g0"+ ><summary class="hide-when-js-enabled"+ >Expand</summary+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >a+</code+ ></strong+ >b+</pre+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >c+</code+ ></strong+ >d+</pre+ ><h4+ >Under ex</h4+ ><p+ >foo</p+ ></details+ ><h2+ >Out of Ex</h2+ ><p+ >foo</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug4</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug4</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >don't use apostrophe's in the wrong place's</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,88 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug458</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug458</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >(⊆)</a+ > :: () -> () -> ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:-8838-" class="def"+ >(⊆)</a+ > :: () -> () -> () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >See the defn of <code+ ><code+ ><a href="#" title="Bug458"+ >⊆</a+ ></code+ ></code+ >.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,252 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug466</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug466</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Cl" class="def"+ >Cl</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:Fam" class="def"+ >Fam</a+ > a :: [*] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Cl"+ >Instances</h4+ ><details id="i:Cl" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Cl:Cl:1"+ ></span+ > <a href="#" title="Bug466"+ >Cl</a+ > <a href="#" title="Bug466"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Cl:Cl:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug466</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="Bug466"+ >Fam</a+ > <a href="#" title="Bug466"+ >X</a+ > :: [<a href="#" title="Data.Kind"+ >Type</a+ >] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:X" class="def"+ >X</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:X"+ >Instances</h4+ ><details id="i:X" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Cl:1"+ ></span+ > <a href="#" title="Bug466"+ >Cl</a+ > <a href="#" title="Bug466"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Cl:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug466</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="Bug466"+ >Fam</a+ > <a href="#" title="Bug466"+ >X</a+ > :: [<a href="#" title="Data.Kind"+ >Type</a+ >] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Fam:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="Bug466"+ >Fam</a+ > <a href="#" title="Bug466"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Fam:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug466</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="Bug466"+ >Fam</a+ > <a href="#" title="Bug466"+ >X</a+ > = '[<a href="#" title="Data.Char"+ >Char</a+ >]</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,281 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug546</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug546</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >x</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ><li class="src short"+ ><a href="#"+ >compile</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Test:</p+ ><dl+ ><dt+ ><code+ >[code with square \ brackets]</code+ ></dt+ ><dd+ >lorem ipsum</dd+ ></dl+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:compile" class="def"+ >compile</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><dl+ ><dt+ ><code+ >[..]</code+ ></dt+ ><dd+ >Matches any of the enclosed characters. Ranges of characters can+ be specified by separating the endpoints with a <code+ >'-'</code+ >. <code+ >'-'</code+ > or+ <code+ >']'</code+ > can be matched by including them as the first character(s)+ in the list. Never matches path separators: <code+ >[/]</code+ > matches+ nothing at all. Named character classes can also be matched:+ <code+ >[:x:]</code+ > within <code+ >[]</code+ > specifies the class named <code+ >x</code+ >, which matches+ certain predefined characters. See below for a full list.</dd+ ><dt+ ><code+ >[^..]</code+ > or <code+ >[!..]</code+ ></dt+ ><dd+ >Like <code+ >[..]</code+ >, but matches any character <em+ >not</em+ > listed.+ Note that <code+ >[^-x]</code+ > is not the inverse of <code+ >[-x]</code+ >, but+ the range <code+ >[^-x]</code+ >.</dd+ ><dt+ ><code+ ><m-n></code+ ></dt+ ><dd+ >Matches any integer in the range m to n, inclusive. The range may+ be open-ended by leaving out either number: <code+ >"<->"</code+ >, for+ instance, matches any integer.</dd+ ><dt+ ><code+ >**/</code+ ></dt+ ><dd+ >Matches any number of characters, including path separators,+ excluding the empty string.</dd+ ></dl+ ><p+ >Supported character classes:</p+ ><dl+ ><dt+ ><code+ >[:alnum:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"0-9A-Za-z"</code+ >.</dd+ ><dt+ ><code+ >[:alpha:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"A-Za-z"</code+ >.</dd+ ><dt+ ><code+ >[:blank:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"\t "</code+ >.</dd+ ><dt+ ><code+ >[:cntrl:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"\0-\x1f\x7f"</code+ >.</dd+ ><dt+ ><code+ >[:digit:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"0-9"</code+ >.</dd+ ><dt+ ><code+ >[:graph:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"!-~"</code+ >.</dd+ ><dt+ ><code+ >[:lower:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"a-z"</code+ >.</dd+ ><dt+ ><code+ >[:print:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >" -~"</code+ >.</dd+ ><dt+ ><code+ >[:punct:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"!-/:-@[-`{-~"</code+ >.</dd+ ><dt+ ><code+ >[:space:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"\t-\r "</code+ >.</dd+ ><dt+ ><code+ >[:upper:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"A-Z"</code+ >.</dd+ ><dt+ ><code+ >[:xdigit:]</code+ ></dt+ ><dd+ >Equivalent to <code+ >"0-9A-Fa-f"</code+ >.</dd+ ></dl+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,636 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug548</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug548</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:WrappedArrow" class="def"+ >WrappedArrow</a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ >) b c <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:WrapArrow" class="def"+ >WrapArrow</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:unwrapArrow" class="def"+ >unwrapArrow</a+ > :: a b c</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:WrappedArrow"+ >Instances</h4+ ><details id="i:WrappedArrow" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Generic1:1"+ ></span+ > <a href="#" title="GHC.Generics"+ >Generic1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Generic1:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b) :: k -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >from1</a+ > :: <span class="keyword"+ >forall</span+ > (a0 :: k). <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b) a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >to1</a+ > :: <span class="keyword"+ >forall</span+ > (a0 :: k). <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b) a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Alternative:2"+ ></span+ > (<a href="#" title="Control.Arrow"+ >ArrowZero</a+ > a, <a href="#" title="Control.Arrow"+ >ArrowPlus</a+ > a) => <a href="#" title="Control.Applicative"+ >Alternative</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-2.1</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Alternative:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >empty</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<|>)</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >some</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b [a0] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >many</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b [a0] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Applicative:3"+ ></span+ > <a href="#" title="Control.Arrow"+ >Arrow</a+ > a => <a href="#" title="Control.Applicative"+ >Applicative</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-2.1</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Applicative:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >pure</a+ > :: a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*>)</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b (a0 -> b0) -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftA2</a+ > :: (a0 -> b0 -> c) -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(*>)</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*)</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Functor:4"+ ></span+ > <a href="#" title="Control.Arrow"+ >Arrow</a+ > a => <a href="#" title="Data.Functor"+ >Functor</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-2.1</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Functor:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a0 -> b0) -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<$)</a+ > :: a0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b b0 -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Generic:5"+ ></span+ > <a href="#" title="GHC.Generics"+ >Generic</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c)</span+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Generic:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c) :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >from</a+ > :: <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c -> <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c) x <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >to</a+ > :: <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c) x -> <a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Rep1:6"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.7.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Rep1:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep1</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b :: <a href="#" title="Data.Kind"+ >Type</a+ > -> <a href="#" title="Data.Kind"+ >Type</a+ >) = <a href="#" title="GHC.Generics"+ >D1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaData</a+ > "WrappedArrow" "Control.Applicative" "base" '<a href="#" title="Data.Bool"+ >True</a+ >) (<a href="#" title="GHC.Generics"+ >C1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaCons</a+ > "WrapArrow" '<a href="#" title="GHC.Generics"+ >PrefixI</a+ > '<a href="#" title="Data.Bool"+ >True</a+ >) (<a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Just</a+ > "unwrapArrow") '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec1</a+ > (a b))))</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:WrappedArrow:Rep:7"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c)</span+ ></td+ ><td class="doc"+ ><p+ ><em+ >Since: base-4.7.0.0</em+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:WrappedArrow:Rep:7"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Control.Applicative</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="GHC.Generics"+ >Rep</a+ > (<a href="#" title="Bug548"+ >WrappedArrow</a+ > a b c) = <a href="#" title="GHC.Generics"+ >D1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaData</a+ > "WrappedArrow" "Control.Applicative" "base" '<a href="#" title="Data.Bool"+ >True</a+ >) (<a href="#" title="GHC.Generics"+ >C1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaCons</a+ > "WrapArrow" '<a href="#" title="GHC.Generics"+ >PrefixI</a+ > '<a href="#" title="Data.Bool"+ >True</a+ >) (<a href="#" title="GHC.Generics"+ >S1</a+ > ('<a href="#" title="GHC.Generics"+ >MetaSel</a+ > ('<a href="#" title="Data.Maybe"+ >Just</a+ > "unwrapArrow") '<a href="#" title="GHC.Generics"+ >NoSourceUnpackedness</a+ > '<a href="#" title="GHC.Generics"+ >NoSourceStrictness</a+ > '<a href="#" title="GHC.Generics"+ >DecidedLazy</a+ >) (<a href="#" title="GHC.Generics"+ >Rec0</a+ > (a b c))))</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,94 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug574</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug574</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Something with a spliced type</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,340 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug6</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug6</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Exporting records.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >A</a+ > = <a href="#"+ >A</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >B</a+ > = <a href="#"+ >B</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >b</a+ > :: <a href="#" title="Bug6"+ >B</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >C</a+ > = <a href="#"+ >C</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >c1</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li+ ><a href="#"+ >c2</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >D</a+ > = <a href="#"+ >D</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >E</a+ > = <a href="#"+ >E</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:A" class="def"+ >A</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This record is exported without its field</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A" class="def"+ >A</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:B" class="def"+ >B</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >.. with its field, but the field is named separately in the export list+ (the field isn't documented separately since it is already documented here)</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:B" class="def"+ >B</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:b" class="def"+ >b</a+ > :: <a href="#" title="Bug6"+ >B</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:C" class="def"+ >C</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >.. with fields names as subordinate names in the export</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:C" class="def"+ >C</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:c1" class="def"+ >c1</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc empty"+ > </div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:c2" class="def"+ >c2</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:D" class="def"+ >D</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >.. with only some of the fields exported (we can't handle this one -+ how do we render the declaration?)</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:D" class="def"+ >D</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:E" class="def"+ >E</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >a newtype with a field</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:E" class="def"+ >E</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,284 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug613</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug613</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Functor</a+ > f <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >fmap</a+ > :: (a -> b) -> f a -> f b</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >ThreeVars</a+ > a0 a b = <a href="#"+ >ThreeVars</a+ > a b</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Functor" class="def"+ >Functor</a+ > f <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:fmap" class="def"+ >fmap</a+ > :: (a -> b) -> f a -> f b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Functor"+ >Instances</h4+ ><details id="i:Functor" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Functor:Functor:1"+ ></span+ > <a href="#" title="Bug613"+ >Functor</a+ > (<a href="#" title="Data.Either"+ >Either</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Functor:Functor:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug613</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a0 -> b) -> <a href="#" title="Data.Either"+ >Either</a+ > a a0 -> <a href="#" title="Data.Either"+ >Either</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Functor:Functor:2"+ ></span+ > <a href="#" title="Bug613"+ >Functor</a+ > (<a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Functor:Functor:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug613</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a1 -> b) -> <a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a a1 -> <a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:ThreeVars" class="def"+ >ThreeVars</a+ > a0 a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Phantom type a0 is added to block the first renaming from a to a0. This ensures that the renamer doesn't create a new conflict</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:ThreeVars" class="def"+ >ThreeVars</a+ > a b</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:ThreeVars"+ >Instances</h4+ ><details id="i:ThreeVars" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:ThreeVars:Functor:1"+ ></span+ > <a href="#" title="Bug613"+ >Functor</a+ > (<a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:ThreeVars:Functor:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug613</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a1 -> b) -> <a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a a1 -> <a href="#" title="Bug613"+ >ThreeVars</a+ > a0 a b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,110 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug647</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug647</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Bug647" class="def"+ >Bug647</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: a</td+ ><td class="doc"+ ><p+ >doc for arg1</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> a</td+ ><td class="doc"+ ><p+ >doc for arg2</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> a</td+ ><td class="doc"+ ><p+ >doc for arg3</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,208 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug679</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug679</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Bar:Foo:1"+ ></span+ > <a href="#" title="Bug679"+ >Foo</a+ > (<a href="#" title="Bug679"+ >Bar</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Bar:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug679</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Bug679"+ >Bar</a+ > a -> <a href="#" title="Bug679"+ >Bar</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:1"+ ></span+ > <a href="#" title="Bug679"+ >Foo</a+ > (<a href="#" title="Bug679"+ >Bar</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug679</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Bug679"+ >Bar</a+ > a -> <a href="#" title="Bug679"+ >Bar</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,215 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug7</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug7</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This module caused a duplicate instance in the documentation for the Foo+ type.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > = <a href="#"+ >Foo</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Bar</a+ > x y</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >The Foo datatype</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Foo:Bar:1"+ ></span+ > <a href="#" title="Bug7"+ >Bar</a+ > <a href="#" title="Bug7"+ >Foo</a+ > <a href="#" title="Bug7"+ >Foo</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Just one instance</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Foo:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug7</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > x y <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >The Bar class</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:1"+ ></span+ > <a href="#" title="Bug7"+ >Bar</a+ > <a href="#" title="Bug7"+ >Foo</a+ > <a href="#" title="Bug7"+ >Foo</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Just one instance</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug7</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,154 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug8</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug8</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Typ" class="def"+ >Typ</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Type" class="def"+ >Type</a+ > (<a href="#" title="Bug8"+ >Typ</a+ >, [<a href="#" title="Bug8"+ >Typ</a+ >])</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:TFree" class="def"+ >TFree</a+ > (<a href="#" title="Bug8"+ >Typ</a+ >, [<a href="#" title="Bug8"+ >Typ</a+ >])</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-45--45--62-" class="def"+ >(-->)</a+ > :: p -> p -> <a href="#" title="Bug8"+ >Typ</a+ > <span class="fixity"+ >infix 9</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-45--45--45--62-" class="def"+ >(--->)</a+ > :: <a href="#" title="Data.Foldable"+ >Foldable</a+ > t0 => t0 t -> <a href="#" title="Bug8"+ >Typ</a+ > -> <a href="#" title="Bug8"+ >Typ</a+ > <span class="fixity"+ >infix 9</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:s" class="def"+ >s</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:t" class="def"+ >t</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:main" class="def"+ >main</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,142 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug85</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug85</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > :: (* -> *) -> * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ > :: f x -> <a href="#" title="Bug85"+ >Foo</a+ > f (f x)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Baz" class="def"+ >Baz</a+ > :: * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Baz-39-" class="def"+ >Baz'</a+ > :: <a href="#" title="Bug85"+ >Baz</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Qux" class="def"+ >Qux</a+ > <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Quux" class="def"+ >Quux</a+ > :: <a href="#" title="Bug85"+ >Qux</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,92 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug865</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug865</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >link</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:link" class="def"+ >link</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >An emphasized link <a href="#"+ >yes <em+ >this</em+ > is emphasized while this is+ <code+ >monospaced</code+ ></a+ >. And here is an image:</p+ ><p+ ><img src="https://www.haskell.org/static/img/haskell-logo.svg" title="emphasis stripped"+ /></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,204 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug923</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug923</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T</a+ > :: (* -> (*, *)) -> * <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >T</a+ > :: a -> <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a)</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T" class="def"+ >T</a+ > :: (* -> (*, *)) -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A promoted tuple type</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:T" class="def"+ >T</a+ > :: a -> <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:T"+ >Instances</h4+ ><details id="i:T" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:T:Eq:1"+ ></span+ > <a href="#" title="Data.Eq"+ >Eq</a+ > a => <a href="#" title="Data.Eq"+ >Eq</a+ > (<a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a :: <a href="#" title="Data.Kind"+ >Type</a+ > -> (<a href="#" title="Data.Kind"+ >Type</a+ >, <a href="#" title="Data.Kind"+ >Type</a+ >)))</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >A promoted tuple type in an instance</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:T:Eq:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Bug923</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >(==)</a+ > :: <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a) -> <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a) -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(/=)</a+ > :: <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a) -> <a href="#" title="Bug923"+ >T</a+ > ('<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > a) -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,82 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug952</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug952</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >See 'case', 'of', '--' compared to 'Q.case', 'Q.of', 'Q.--'</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,154 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug953</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug953</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > = <a href="#"+ >Foo'</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Bar</a+ > = <a href="#"+ >Bar'</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A foo</p+ ><h4 class="subheading details-toggle-control details-toggle" data-details-id="ch:Foo0"+ >Examples</h4+ ><details id="ch:Foo0"+ ><summary class="hide-when-js-enabled"+ >Expand</summary+ ><p+ >Foo example body</p+ ></details+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo-39-" class="def"+ >Foo'</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A bar</p+ ><h4 class="subheading details-toggle-control details-toggle" data-details-id="ch:Bar0"+ >Examples</h4+ ><details id="ch:Bar0"+ ><summary class="hide-when-js-enabled"+ >Expand</summary+ ><p+ >Bar example body</p+ ></details+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar-39-" class="def"+ >Bar'</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,178 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bug973</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bug973</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >showRead</a+ > :: <span class="keyword"+ >forall</span+ > a b. (<a href="#" title="Text.Show"+ >Show</a+ > a, <a href="#" title="Text.Read"+ >Read</a+ > b) => a -> b</li+ ><li class="src short"+ ><a href="#"+ >showRead'</a+ > :: <span class="keyword"+ >forall</span+ > b a. (<a href="#" title="Text.Show"+ >Show</a+ > a, <a href="#" title="Text.Read"+ >Read</a+ > b) => a -> b</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:showRead" class="def"+ >showRead</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > a b. (<a href="#" title="Text.Show"+ >Show</a+ > a, <a href="#" title="Text.Read"+ >Read</a+ > b)</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >=> a</td+ ><td class="doc"+ ><p+ >this gets turned into a string...</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> b</td+ ><td class="doc"+ ><p+ >...from which this is read</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:showRead-39-" class="def"+ >showRead'</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > b a. (<a href="#" title="Text.Show"+ >Show</a+ > a, <a href="#" title="Text.Read"+ >Read</a+ > b)</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >=> a</td+ ><td class="doc"+ ><p+ >this gets turned into a string...</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> b</td+ ><td class="doc"+ ><p+ >...from which this is read</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >Same as <code+ ><a href="#" title="Bug973"+ >showRead</a+ ></code+ >, but with type variable order flipped</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,200 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >BugDeprecated</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >BugDeprecated</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >baz</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >one</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >two</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >three</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for foo</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for bar</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:baz" class="def"+ >baz</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for baz</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:one" class="def"+ >one</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for one</p+ ></div+ ><p+ >some documentation for one</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:two" class="def"+ >two</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for two</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:three" class="def"+ >three</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for three</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,234 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >BugExportHeadings</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >BugExportHeadings</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Foo</a+ ></li+ ><li+ ><a href="#"+ >Bar</a+ ></li+ ><li+ ><a href="#"+ >Baz</a+ ></li+ ><li+ ><a href="#"+ >One</a+ ></li+ ><li+ ><a href="#"+ >Two</a+ ></li+ ><li+ ><a href="#"+ >Three</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >baz</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >one</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >two</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >three</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:1"+ ><h1+ >Foo</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:2"+ ><h1+ >Bar</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:3"+ ><h1+ >Baz</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:baz" class="def"+ >baz</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:4"+ ><h1+ >One</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:one" class="def"+ >one</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for one</p+ ></div+ ></div+ ></div+ ><a href="#" id="g:5"+ ><h1+ >Two</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:two" class="def"+ >two</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for two</p+ ></div+ ></div+ ></div+ ><a href="#" id="g:6"+ ><h1+ >Three</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:three" class="def"+ >three</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: for three</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,84 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Bugs</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Bugs</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:A" class="def"+ >A</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A" class="def"+ >A</a+ > a (a -> <a href="#" title="Data.Int"+ >Int</a+ >)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,464 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >BundledPatterns</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >BundledPatterns</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Vec</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >Nil</a+ > :: <a href="#" title="BundledPatterns"+ >Vec</a+ > 0 a</li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >(:>)</a+ > :: a -> <a href="#" title="BundledPatterns"+ >Vec</a+ > n a -> <a href="#" title="BundledPatterns"+ >Vec</a+ > (n <a href="#" title="Bug310"+ >+</a+ > 1) a</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >RTree</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >LR</a+ > :: a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > 0 a</li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >BR</a+ > :: <a href="#" title="BundledPatterns"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > (d <a href="#" title="Bug310"+ >+</a+ > 1) a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Vec" class="def"+ >Vec</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Fixed size vectors.</p+ ><ul+ ><li+ >Lists with their length encoded in their type</li+ ><li+ ><code+ ><a href="#" title="BundledPatterns"+ >Vec</a+ ></code+ >tor elements have an <strong+ >ASCENDING</strong+ > subscript starting from 0 and+ ending at <code+ ><code+ ><a href="#" title="Data.Foldable"+ >length</a+ ></code+ > - 1</code+ >.</li+ ></ul+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Nil" class="def"+ >Nil</a+ > :: <a href="#" title="BundledPatterns"+ >Vec</a+ > 0 a</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v::-62-" class="def"+ >(:>)</a+ > :: a -> <a href="#" title="BundledPatterns"+ >Vec</a+ > n a -> <a href="#" title="BundledPatterns"+ >Vec</a+ > (n <a href="#" title="Bug310"+ >+</a+ > 1) a <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Add an element to the head of a vector.</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >3:>4:>5:>Nil+</code+ ></strong+ ><3,4,5>+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = 3:>4:>5:>Nil+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => Vec 3 a+</pre+ ><p+ >Can be used as a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (x :> y :> _) = x + y+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => Vec ((n + 1) + 1) a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (3:>4:>5:>6:>7:>Nil)+</code+ ></strong+ >7+</pre+ ><p+ >Also in conjunctions with (<code+ >:<</code+ >):</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let g (a :> b :> (_ :< y :< x)) = a + b + x + y+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t g+</code+ ></strong+ >g :: Num a => Vec ((((n + 1) + 1) + 1) + 1) a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >g (1:>2:>3:>4:>5:>Nil)+</code+ ></strong+ >12+</pre+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:RTree" class="def"+ >RTree</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Perfect depth binary tree.</p+ ><ul+ ><li+ >Only has elements at the leaf of the tree</li+ ><li+ >A tree of depth <em+ >d</em+ > has <em+ >2^d</em+ > elements.</li+ ></ul+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:LR" class="def"+ >LR</a+ > :: a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > 0 a</td+ ><td class="doc"+ ><p+ >Leaf of a perfect depth tree</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >LR 1+</code+ ></strong+ >1+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = LR 1+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => RTree 0 a+</pre+ ><p+ >Can be used as a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (LR a) (LR b) = a + b+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => RTree 0 a -> RTree 0 a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (LR 1) (LR 2)+</code+ ></strong+ >3+</pre+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:BR" class="def"+ >BR</a+ > :: <a href="#" title="BundledPatterns"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns"+ >RTree</a+ > (d <a href="#" title="Bug310"+ >+</a+ > 1) a</td+ ><td class="doc"+ ><p+ >Branch of a perfect depth tree</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >BR (LR 1) (LR 2)+</code+ ></strong+ ><1,2>+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = BR (LR 1) (LR 2)+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => RTree 1 a+</pre+ ><p+ >Case be used a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (BR (LR a) (LR b)) = LR (a + b)+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => RTree 1 a -> RTree 0 a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (BR (LR 1) (LR 2))+</code+ ></strong+ >3+</pre+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,462 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >BundledPatterns2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >BundledPatterns2</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Vec</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >(:>)</a+ > :: a -> <a href="#" title="BundledPatterns2"+ >Vec</a+ > n a -> <a href="#" title="BundledPatterns2"+ >Vec</a+ > (n <a href="#" title="Bug310"+ >+</a+ > 1) a</li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Empty</a+ > :: <a href="#" title="BundledPatterns2"+ >Vec</a+ > 0 a</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >RTree</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >LR</a+ > :: a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > 0 a</li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >BR</a+ > :: <a href="#" title="BundledPatterns2"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > (d <a href="#" title="Bug310"+ >+</a+ > 1) a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Vec" class="def"+ >Vec</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Fixed size vectors.</p+ ><ul+ ><li+ >Lists with their length encoded in their type</li+ ><li+ ><code+ ><a href="#" title="BundledPatterns2"+ >Vec</a+ ></code+ >tor elements have an <strong+ >ASCENDING</strong+ > subscript starting from 0 and+ ending at <code+ ><code+ ><a href="#" title="Data.Foldable"+ >length</a+ ></code+ > - 1</code+ >.</li+ ></ul+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v::-62-" class="def"+ >(:>)</a+ > :: a -> <a href="#" title="BundledPatterns2"+ >Vec</a+ > n a -> <a href="#" title="BundledPatterns2"+ >Vec</a+ > (n <a href="#" title="Bug310"+ >+</a+ > 1) a <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Add an element to the head of a vector.</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >3:>4:>5:>Nil+</code+ ></strong+ ><3,4,5>+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = 3:>4:>5:>Nil+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => Vec 3 a+</pre+ ><p+ >Can be used as a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (x :> y :> _) = x + y+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => Vec ((n + 1) + 1) a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (3:>4:>5:>6:>7:>Nil)+</code+ ></strong+ >7+</pre+ ><p+ >Also in conjunctions with (<code+ >:<</code+ >):</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let g (a :> b :> (_ :< y :< x)) = a + b + x + y+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t g+</code+ ></strong+ >g :: Num a => Vec ((((n + 1) + 1) + 1) + 1) a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >g (1:>2:>3:>4:>5:>Nil)+</code+ ></strong+ >12+</pre+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Empty" class="def"+ >Empty</a+ > :: <a href="#" title="BundledPatterns2"+ >Vec</a+ > 0 a</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:RTree" class="def"+ >RTree</a+ > :: <a href="#" title="GHC.TypeNats"+ >Nat</a+ > -> * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Perfect depth binary tree.</p+ ><ul+ ><li+ >Only has elements at the leaf of the tree</li+ ><li+ >A tree of depth <em+ >d</em+ > has <em+ >2^d</em+ > elements.</li+ ></ul+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:LR" class="def"+ >LR</a+ > :: a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > 0 a</td+ ><td class="doc"+ ><p+ >Leaf of a perfect depth tree</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >LR 1+</code+ ></strong+ >1+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = LR 1+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => RTree 0 a+</pre+ ><p+ >Can be used as a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (LR a) (LR b) = a + b+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => RTree 0 a -> RTree 0 a -> a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (LR 1) (LR 2)+</code+ ></strong+ >3+</pre+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:BR" class="def"+ >BR</a+ > :: <a href="#" title="BundledPatterns2"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > d a -> <a href="#" title="BundledPatterns2"+ >RTree</a+ > (d <a href="#" title="Bug310"+ >+</a+ > 1) a</td+ ><td class="doc"+ ><p+ >Branch of a perfect depth tree</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >BR (LR 1) (LR 2)+</code+ ></strong+ ><1,2>+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let x = BR (LR 1) (LR 2)+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t x+</code+ ></strong+ >x :: Num a => RTree 1 a+</pre+ ><p+ >Case be used a pattern:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >let f (BR (LR a) (LR b)) = LR (a + b)+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >:t f+</code+ ></strong+ >f :: Num a => RTree 1 a -> RTree 0 a+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >f (BR (LR 1) (LR 2))+</code+ ></strong+ >3+</pre+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,728 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >ConstructorArgs</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >ConstructorArgs</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >Rec</a+ > { <ul class="subs"+ ><li+ ><a href="#"+ >x</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ ><a href="#"+ >y</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ > }</li+ ><li+ >| <a href="#"+ >Baz</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ >| <a href="#"+ >Boa</a+ > !<a href="#" title="Data.Int"+ >Int</a+ > !<a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ >| <a href="#" title="Data.Int"+ >Int</a+ > <a href="#"+ >:|</a+ > <a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ >| <a href="#" title="Data.Int"+ >Int</a+ > <a href="#"+ >:*</a+ > <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Boo</a+ > <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >Foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ><li+ ><a href="#"+ >Foa</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Fo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ><li+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Fo'</a+ > :: <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Bo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Bo'</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <span class="fixity"+ >infixr 1</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Rec" class="def"+ >Rec</a+ ></td+ ><td class="doc"+ ><p+ >doc on a record</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Rec</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:y" class="def"+ >y</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Rec</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Baz" class="def"+ >Baz</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc"+ ><p+ >old prefix doc style</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Boa" class="def"+ >Boa</a+ > <span class="fixity"+ >infixr 2</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="ConstructorArgs"+ >Boa</a+ ></code+ > constrictor</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >!<a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Boa</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ >!<a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Boa</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a href="#" title="Data.Int"+ >Int</a+ > <a id="v::-124-" class="def"+ >:|</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc"+ ><p+ >old infix doc style</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v::-42-" class="def"+ >(:*)</a+ > <span class="fixity"+ >infixr 3</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="ConstructorArgs"+ >:*</a+ ></code+ > constructor</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ > field of the <code+ ><a href="#" title="ConstructorArgs"+ >:*</a+ ></code+ > constructor</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >doc on the <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ > field of the <code+ ><a href="#" title="ConstructorArgs"+ >:*</a+ ></code+ > constructor</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Boo" class="def"+ >Boo</a+ > <span class="keyword"+ >where</span+ > <span class="fixity"+ >infixr 4</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ > <span class="fixity"+ >infixr 1</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Info about a <code+ ><a href="#" title="ConstructorArgs"+ >Foo</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ ><code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Foo</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ >-> <a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ ><code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ > field of <code+ ><a href="#" title="ConstructorArgs"+ >Foo</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ >-> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></dfn+ ><div class="doc"+ ><p+ >Make a <code+ ><a href="#" title="ConstructorArgs"+ >Boo</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Foa" class="def"+ >Foa</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></td+ ><td class="doc"+ ><p+ >no argument docs GADT</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="subs bundled-patterns"+ ><p class="caption"+ >Bundled Patterns</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Fo" class="def"+ >Fo</a+ > <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Info about bundled <code+ ><a href="#" title="ConstructorArgs"+ >Fo</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >an <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ >-> <a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ >-> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="ConstructorArgs"+ >Boo</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Fo-39-" class="def"+ >Fo'</a+ > :: <a href="#" title="ConstructorArgs"+ >Boo</a+ ></td+ ><td class="doc"+ ><p+ >Bundled and no argument docs</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Bo" class="def"+ >Bo</a+ > <span class="fixity"+ >infixr 6</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc"+ ><p+ >an <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc"+ ><p+ >a <code+ ><a href="#" title="Data.String"+ >String</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="ConstructorArgs"+ >Boo</a+ ></td+ ><td class="doc"+ ><p+ >a <code+ ><a href="#" title="ConstructorArgs"+ >Boo</a+ ></code+ > pattern</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >Info about not-bundled <code+ ><a href="#" title="ConstructorArgs"+ >Bo</a+ ></code+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Bo-39-" class="def"+ >Bo'</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="ConstructorArgs"+ >Boo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Not bundled and no argument docs</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,124 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >ConstructorPatternExport</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >ConstructorPatternExport</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:FooCons" class="def"+ >FooCons</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> a -> Foo a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:MyRecCons" class="def"+ >MyRecCons</a+ > :: <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > -> MyRec <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v::-43-" class="def"+ >(:+)</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> a -> MyInfix a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:BlubCons" class="def"+ >BlubCons</a+ > :: () => <a href="#" title="Text.Show"+ >Show</a+ > b => b -> Blub <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:MyGADTCons" class="def"+ >MyGADTCons</a+ > :: a -> <a href="#" title="Data.Int"+ >Int</a+ > -> MyGADT (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.String"+ >String</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,287 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >CrossPackageDocs</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();setSynopsis("mini_CrossPackageDocs.html");};+//]]>+</script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href=""+ >Contents</a+ ></li+ ><li+ ><a href=""+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe</td+ ></tr+ ></table+ ><p class="caption"+ >CrossPackageDocs</p+ ></div+ ><div id="synopsis"+ ><p id="control.syn" class="caption expander" onclick="toggleSection('syn')"+ >Synopsis</p+ ><ul id="section.syn" class="hide" onclick="toggleSection('syn')"+ ><li class="src short"+ ><a href=""+ >map</a+ > :: (a -> b) -> [a] -> [b]</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href=""+ >IsString</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href=""+ >fromString</a+ > :: <a href=""+ >String</a+ > -> a</li+ ></ul+ ></li+ ><li class="src short"+ ><a href=""+ >runInteractiveProcess</a+ > :: <a href=""+ >FilePath</a+ > -> [<a href=""+ >String</a+ >] -> <a href=""+ >Maybe</a+ > <a href=""+ >FilePath</a+ > -> <a href=""+ >Maybe</a+ > [(<a href=""+ >String</a+ >, <a href=""+ >String</a+ >)] -> <a href=""+ >IO</a+ > (<a href=""+ >Handle</a+ >, <a href=""+ >Handle</a+ >, <a href=""+ >Handle</a+ >, <a href=""+ >ProcessHandle</a+ >)</li+ ></ul+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a name="v:map" class="def"+ >map</a+ > :: (a -> b) -> [a] -> [b]</p+ ><div class="doc"+ ><p+ ><code+ ><a href=""+ >map</a+ ></code+ > <code+ >f xs</code+ > is the list obtained by applying <code+ >f</code+ > to each element+ of <code+ >xs</code+ >, i.e.,</p+ ><pre+ > map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn]+ map f [x1, x2, ...] == [f x1, f x2, ...]</pre+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a name="t:IsString" class="def"+ >IsString</a+ > a <span class="keyword"+ >where</span+ ></p+ ><div class="doc"+ ><p+ >Class for string-like datastructures; used by the overloaded string+ extension (-XOverloadedStrings in GHC).</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a name="v:fromString" class="def"+ >fromString</a+ > :: <a href=""+ >String</a+ > -> a</p+ ></div+ ><div class="subs instances"+ ><p id="control.i:IsString" class="caption collapser" onclick="toggleSection('i:IsString')"+ >Instances</p+ ><div id="section.i:IsString" class="show"+ ><table+ ><tr+ ><td class="src"+ ><a href=""+ >IsString</a+ > [<a href=""+ >Char</a+ >]</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a name="v:runInteractiveProcess" class="def"+ >runInteractiveProcess</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <a href=""+ >FilePath</a+ ></td+ ><td class="doc"+ ><p+ >Filename of the executable (see <code+ ><a href=""+ >proc</a+ ></code+ > for details)</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> [<a href=""+ >String</a+ >]</td+ ><td class="doc"+ ><p+ >Arguments to pass to the executable</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href=""+ >Maybe</a+ > <a href=""+ >FilePath</a+ ></td+ ><td class="doc"+ ><p+ >Optional path to the working directory</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href=""+ >Maybe</a+ > [(<a href=""+ >String</a+ >, <a href=""+ >String</a+ >)]</td+ ><td class="doc"+ ><p+ >Optional environment (otherwise inherit)</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href=""+ >IO</a+ > (<a href=""+ >Handle</a+ >, <a href=""+ >Handle</a+ >, <a href=""+ >Handle</a+ >, <a href=""+ >ProcessHandle</a+ >)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >Runs a raw command, and returns <code+ ><a href=""+ >Handle</a+ ></code+ >s that may be used to communicate+ with the process via its <code+ >stdin</code+ >, <code+ >stdout</code+ > and <code+ >stderr</code+ > respectively.</p+ ><p+ >For example, to start a process and feed a string to its stdin:</p+ ><pre+ > (inp,out,err,pid) <- runInteractiveProcess "..."+ forkIO (hPutStr inp str)</pre+ ><p+ >The <code+ ><a href=""+ >Handle</a+ ></code+ >s are initially in binary mode; if you need them to be+ in text mode then use <code+ ><a href=""+ >hSetBinaryMode</a+ ></code+ >.</p+ ></div+ ></div+ ></div+ ></div+ ><div id="footer"+ ><p+ >Produced by <a href=""+ >Haddock</a+ > version 2.15.0</p+ ></div+ ></body+ ></html+>
@@ -0,0 +1,160 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DefaultAssociatedTypes</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DefaultAssociatedTypes</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Foo</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >type</span+ > <a href="#"+ >Qux</a+ > a :: *</li+ ><li+ ><a href="#"+ >bar</a+ >, <a href="#"+ >baz</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for Foo.</p+ ></div+ ><div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:Qux" class="def"+ >Qux</a+ > a :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for Qux</p+ ></div+ > <div class="subs default"+ ><p class="caption"+ ></p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="DefaultAssociatedTypes"+ >Qux</a+ > a = [a]</p+ ></div+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for bar and baz.</p+ ></div+ ><p class="src"+ ><a id="v:baz" class="def"+ >baz</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for bar and baz.</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,186 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DefaultSignatures</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DefaultSignatures</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Foo</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >bar</a+ >, <a href="#"+ >baz</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ ><a href="#"+ >baz'</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for Foo.</p+ ></div+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ ><a href="#" title="DefaultSignatures"+ >baz</a+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for bar and baz.</p+ ></div+ > <div class="subs default"+ ><p class="caption"+ ></p+ ><p class="src"+ ><span class="keyword"+ >default</span+ > <a id="v:bar" class="def"+ >bar</a+ > :: <a href="#" title="Text.Show"+ >Show</a+ > a => a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><p class="src"+ ><a id="v:baz" class="def"+ >baz</a+ > :: a -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for bar and baz.</p+ ></div+ ><p class="src"+ ><a id="v:baz-39-" class="def"+ >baz'</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Documentation for baz'.</p+ ></div+ > <div class="subs default"+ ><p class="caption"+ ></p+ ><p class="src"+ ><span class="keyword"+ >default</span+ > <a id="v:baz-39-" class="def"+ >baz'</a+ > :: <a href="#" title="Text.Read"+ >Read</a+ > a => <a href="#" title="Data.String"+ >String</a+ > -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,166 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedClass</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedClass</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >SomeClass</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >foo</a+ > :: a -> a</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >SomeOtherClass</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >bar</a+ > :: a -> a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:SomeClass" class="def"+ >SomeClass</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeClass</p+ ></div+ ><p+ >some class</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: foo</p+ ></div+ ><p+ >documentation for foo</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:SomeOtherClass" class="def"+ >SomeOtherClass</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeOtherClass</p+ ></div+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: bar</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,196 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedData</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedData</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >Foo</a+ ></li+ ><li+ >| <a href="#"+ >Bar</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >One</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >One</a+ ></li+ ><li+ >| <a href="#"+ >Two</a+ ></li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Foo</p+ ></div+ ><p+ >type Foo</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Foo</p+ ></div+ ><p+ >constructor Foo</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Bar</p+ ></div+ ><p+ >constructor Bar</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:One" class="def"+ >One</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: One</p+ ></div+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:One" class="def"+ >One</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: One</p+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Two" class="def"+ >Two</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Two</p+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,114 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedFunction</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedFunction</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: use <code+ ><a href="#" title="DeprecatedFunction"+ >bar</a+ ></code+ > instead</p+ ></div+ ><p+ >some documentation for foo</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >some documentation for bar</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,88 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedFunction2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedFunction2</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: use bar instead</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,88 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedFunction3</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedFunction3</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: use bar instead</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,84 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedModule</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedModule</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Use <a href="#"+ >Foo</a+ > instead</p+ ></div+ ><p+ >Documentation for <a href="#"+ >DeprecatedModule</a+ >.</p+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,78 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedModule2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedModule2</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: Use Foo instead</p+ ></div+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,162 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedNewtype</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedNewtype</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >SomeNewType</a+ > = <a href="#"+ >SomeNewTypeConst</a+ > <a href="#" title="Data.String"+ >String</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >SomeOtherNewType</a+ > = <a href="#"+ >SomeOtherNewTypeConst</a+ > <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:SomeNewType" class="def"+ >SomeNewType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeNewType</p+ ></div+ ><p+ >some documentation</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:SomeNewTypeConst" class="def"+ >SomeNewTypeConst</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeNewTypeConst</p+ ></div+ ><p+ >constructor docu </p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:SomeOtherNewType" class="def"+ >SomeOtherNewType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeOtherNewType</p+ ></div+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:SomeOtherNewTypeConst" class="def"+ >SomeOtherNewTypeConst</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeOtherNewTypeConst</p+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,135 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedReExport</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedReExport</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Re-exported from an other module</a+ ></li+ ><li+ ><a href="#"+ >Re-exported from an other package</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >What is tested here:</p+ ><ul+ ><li+ >Deprecation messages are shown for re-exported items.</li+ ></ul+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:1"+ ><h1+ >Re-exported from an other module</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: use <code+ ><a href="#" title="DeprecatedFunction"+ >bar</a+ ></code+ > instead</p+ ></div+ ><p+ >some documentation for foo</p+ ></div+ ></div+ ><a href="#" id="g:2"+ ><h1+ >Re-exported from an other package</h1+ ></a+ ><div class="doc"+ ><p+ >Not yet working, see <a href="#"+ >http://trac.haskell.org/haddock/ticket/223</a+ >+ , isEmptyChan</p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,154 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedRecord</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedRecord</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ > = <a href="#"+ >Foo</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >fooName</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></li+ ><li+ ><a href="#"+ >fooValue</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ >}</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >type Foo</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Foo" class="def"+ >Foo</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:fooName" class="def"+ >fooName</a+ > :: <a href="#" title="Data.String"+ >String</a+ ></dfn+ ><div class="doc"+ ><p+ >some name</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:fooValue" class="def"+ >fooValue</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: do not use this</p+ ></div+ ><p+ >some value</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,112 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedTypeFamily</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedTypeFamily</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > <a href="#"+ >SomeTypeFamily</a+ > k :: * -> *</li+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > <a href="#"+ >SomeOtherTypeFamily</a+ > k :: * -> *</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:SomeTypeFamily" class="def"+ >SomeTypeFamily</a+ > k :: * -> * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeTypeFamily</p+ ></div+ ><p+ >some documentation</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:SomeOtherTypeFamily" class="def"+ >SomeOtherTypeFamily</a+ > k :: * -> * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: SomeOtherTypeFamily</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,120 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DeprecatedTypeSynonym</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DeprecatedTypeSynonym</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >type</span+ > <a href="#"+ >TypeSyn</a+ > = <a href="#" title="Data.String"+ >String</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type</span+ > <a href="#"+ >OtherTypeSyn</a+ > = <a href="#" title="Data.String"+ >String</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:TypeSyn" class="def"+ >TypeSyn</a+ > = <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: TypeSyn</p+ ></div+ ><p+ >some documentation</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:OtherTypeSyn" class="def"+ >OtherTypeSyn</a+ > = <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Deprecated: OtherTypeSyn</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,164 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >DuplicateRecordFields</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >DuplicateRecordFields</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:RawReplay" class="def"+ >RawReplay</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:RawReplay" class="def"+ >RawReplay</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:headerSize" class="def"+ >headerSize</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The byte size of the first section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:headerCRC" class="def"+ >headerCRC</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The CRC of the first section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:header" class="def"+ >header</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The first section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:contentSize" class="def"+ >contentSize</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The byte size of the second section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:contentCRC" class="def"+ >contentCRC</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The CRC of the second section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:content" class="def"+ >content</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >The second section.</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:footer" class="def"+ >footer</a+ > :: Int</dfn+ ><div class="doc"+ ><p+ >Arbitrary data after the second section. In replays generated by+ Rocket League, this is always empty. However it is not technically+ invalid to put something here.</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,179 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Examples</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Examples</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >fib</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > -> <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:fib" class="def"+ >fib</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > -> <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Fibonacci number of given <code+ ><a href="#" title="Prelude"+ >Integer</a+ ></code+ >.</p+ ><p+ >Examples:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >fib 5+</code+ ></strong+ >5+<code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >fib 10+</code+ ></strong+ >55+</pre+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >fib 10+</code+ ></strong+ >55+</pre+ ><p+ >One more Example:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >fib 5+</code+ ></strong+ >5+</pre+ ><p+ >One more Example:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >fib 5+</code+ ></strong+ >5+</pre+ ><p+ >Example with an import:</p+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >import Data.Char+</code+ ></strong+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >isSpace 'a'+</code+ ></strong+ >False+</pre+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >putStrLn "foo\n\nbar"+</code+ ></strong+ >foo++bar+</pre+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,88 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Extensions</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ><tr+ ><th+ >Extensions</th+ ><td+ >ExplicitForAll</td+ ></tr+ ></table+ ><p class="caption"+ >Extensions</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foobar</a+ > :: t</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foobar" class="def"+ >foobar</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Bar</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,298 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >FunArgs</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >FunArgs</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > a. <a href="#" title="Data.Ord"+ >Ord</a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >=> <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc"+ ><p+ >First argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> a</td+ ><td class="doc"+ ><p+ >Second argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Data.Bool"+ >Bool</a+ ></td+ ><td class="doc"+ ><p+ >Third argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> (a -> a)</td+ ><td class="doc"+ ><p+ >Fourth argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> ()</td+ ><td class="doc"+ ><p+ >Result</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: a</td+ ><td class="doc"+ ><p+ >First argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> b</td+ ><td class="doc"+ ><p+ >Second argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> c</td+ ><td class="doc"+ ><p+ >Third argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> d</td+ ><td class="doc"+ ><p+ >Result</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:h" class="def"+ >h</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > a b c. a</td+ ><td class="doc"+ ><p+ >First argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> b</td+ ><td class="doc"+ ><p+ >Second argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> c</td+ ><td class="doc"+ ><p+ >Third argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <span class="keyword"+ >forall</span+ > d. d</td+ ><td class="doc"+ ><p+ >Result</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:i" class="def"+ >i</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > a (b :: ()) d. d <a href="#" title="Data.Type.Equality"+ >~</a+ > '<a href="#" title="GHC.Tuple.Prim"+ >()</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >=> <span class="keyword"+ >forall</span+ > c. a b c d</td+ ><td class="doc"+ ><p+ >abcd</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> ()</td+ ><td class="doc"+ ><p+ >Result</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:j" class="def"+ >j</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <span class="keyword"+ >forall</span+ > proxy (a :: ()) b. proxy a</td+ ><td class="doc"+ ><p+ >First argument</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> b</td+ ><td class="doc"+ ><p+ >Result</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,232 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >GADTRecords</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >GADTRecords</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >H1</a+ > a b <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >C1</a+ > :: <a href="#" title="GADTRecords"+ >H1</a+ > a b</li+ ><li+ ><a href="#"+ >C2</a+ > :: <a href="#" title="Data.Ord"+ >Ord</a+ > a => [a] -> <a href="#" title="GADTRecords"+ >H1</a+ > a a</li+ ><li+ ><a href="#"+ >C3</a+ > :: {..} -> <a href="#" title="GADTRecords"+ >H1</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li+ ><a href="#"+ >C4</a+ > :: {..} -> <a href="#" title="GADTRecords"+ >H1</a+ > <a href="#" title="Data.Int"+ >Int</a+ > a</li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:H1" class="def"+ >H1</a+ > a b <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >h1</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:C1" class="def"+ >C1</a+ > :: <a href="#" title="GADTRecords"+ >H1</a+ > a b</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C2" class="def"+ >C2</a+ > :: <a href="#" title="Data.Ord"+ >Ord</a+ > a => [a] -> <a href="#" title="GADTRecords"+ >H1</a+ > a a</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C3" class="def"+ >C3</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: { <a id="v:field" class="def"+ >field</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >hello docs</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > } -> <a href="#" title="GADTRecords"+ >H1</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C4" class="def"+ >C4</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: { <a id="v:field2" class="def"+ >field2</a+ > :: a</dfn+ ><div class="doc"+ ><p+ >hello2 docs</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > } -> <a href="#" title="GADTRecords"+ >H1</a+ > <a href="#" title="Data.Int"+ >Int</a+ > a</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,200 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >GadtConstructorArgs</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >GadtConstructorArgs</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Boo" class="def"+ >Boo</a+ > <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Fot" class="def"+ >Fot</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: { <a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >an <code+ ><a href="#" title="GadtConstructorArgs"+ >x</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > , <a id="v:y" class="def"+ >y</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="GadtConstructorArgs"+ >y</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > } -> <a href="#" title="GadtConstructorArgs"+ >Boo</a+ ></dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Fob" class="def"+ >Fob</a+ ></td+ ><td class="doc"+ ><p+ >Record GADT with docs</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ >:: { <a id="v:w" class="def"+ >w</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="GadtConstructorArgs"+ >w</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > , <a id="v:z" class="def"+ >z</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="GadtConstructorArgs"+ >z</a+ ></code+ ></p+ ></div+ ></li+ ><li+ ><dfn class="src"+ > } -> <a href="#" title="GadtConstructorArgs"+ >Boo</a+ ></dfn+ ><div class="doc"+ ><p+ >a <code+ ><a href="#" title="GadtConstructorArgs"+ >Boo</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,443 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Hash</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Hash</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >The <code+ >HashTable</code+ > type</a+ ><ul+ ><li+ ><a href="#"+ >Operations on <code+ >HashTable</code+ >s</a+ ></li+ ></ul+ ></li+ ><li+ ><a href="#"+ >The <code+ >Hash</code+ > class</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Implementation of fixed-size hash tables, with a type+ class for constructing hash values for structured types.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >HashTable</a+ > key val</li+ ><li class="src short"+ ><a href="#"+ >new</a+ > :: (<a href="#" title="Data.Eq"+ >Eq</a+ > key, <a href="#" title="Hash"+ >Hash</a+ > key) => <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="System.IO"+ >IO</a+ > (<a href="#" title="Hash"+ >HashTable</a+ > key val)</li+ ><li class="src short"+ ><a href="#"+ >insert</a+ > :: (<a href="#" title="Data.Eq"+ >Eq</a+ > key, <a href="#" title="Hash"+ >Hash</a+ > key) => key -> val -> <a href="#" title="System.IO"+ >IO</a+ > ()</li+ ><li class="src short"+ ><a href="#"+ >lookup</a+ > :: <a href="#" title="Hash"+ >Hash</a+ > key => key -> <a href="#" title="System.IO"+ >IO</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > val)</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Hash</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >hash</a+ > :: a -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:1"+ ><h1+ >The <code+ >HashTable</code+ > type</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:HashTable" class="def"+ >HashTable</a+ > key val <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A hash table with keys of type <code+ >key</code+ > and values of type <code+ >val</code+ >.+ The type <code+ >key</code+ > should be an instance of <code+ ><a href="#" title="Data.Eq"+ >Eq</a+ ></code+ >.</p+ ></div+ ></div+ ><a href="#" id="g:2"+ ><h2+ >Operations on <code+ >HashTable</code+ >s</h2+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:new" class="def"+ >new</a+ > :: (<a href="#" title="Data.Eq"+ >Eq</a+ > key, <a href="#" title="Hash"+ >Hash</a+ > key) => <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="System.IO"+ >IO</a+ > (<a href="#" title="Hash"+ >HashTable</a+ > key val) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Builds a new hash table with a given size</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:insert" class="def"+ >insert</a+ > :: (<a href="#" title="Data.Eq"+ >Eq</a+ > key, <a href="#" title="Hash"+ >Hash</a+ > key) => key -> val -> <a href="#" title="System.IO"+ >IO</a+ > () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Inserts a new element into the hash table</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:lookup" class="def"+ >lookup</a+ > :: <a href="#" title="Hash"+ >Hash</a+ > key => key -> <a href="#" title="System.IO"+ >IO</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > val) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Looks up a key in the hash table, returns <code+ ><code+ ><a href="#" title="Data.Maybe"+ >Just</a+ ></code+ > val</code+ > if the key+ was found, or <code+ ><a href="#" title="Data.Maybe"+ >Nothing</a+ ></code+ > otherwise.</p+ ></div+ ></div+ ><a href="#" id="g:3"+ ><h1+ >The <code+ >Hash</code+ > class</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Hash" class="def"+ >Hash</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A class of types which can be hashed.</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:hash" class="def"+ >hash</a+ > :: a -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >hashes the value of type <code+ >a</code+ > into an <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ ></p+ ></div+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Hash"+ >Instances</h4+ ><details id="i:Hash" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Hash:Hash:1"+ ></span+ > <a href="#" title="Hash"+ >Hash</a+ > <a href="#" title="Prelude"+ >Float</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Hash:Hash:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Hash</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >hash</a+ > :: <a href="#" title="Prelude"+ >Float</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Hash:Hash:2"+ ></span+ > <a href="#" title="Hash"+ >Hash</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Hash:Hash:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Hash</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >hash</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Hash:Hash:3"+ ></span+ > (<a href="#" title="Hash"+ >Hash</a+ > a, <a href="#" title="Hash"+ >Hash</a+ > b) => <a href="#" title="Hash"+ >Hash</a+ > (a, b)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Hash:Hash:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Hash</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >hash</a+ > :: (a, b) -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,326 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >HiddenInstances</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >HiddenInstances</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >VisibleClass</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >VisibleData</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:VisibleClass" class="def"+ >VisibleClass</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should be visible</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:VisibleClass"+ >Instances</h4+ ><details id="i:VisibleClass" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:VisibleClass:VisibleClass:1"+ ></span+ > <a href="#" title="HiddenInstances"+ >VisibleClass</a+ > <a href="#" title="HiddenInstances"+ >VisibleData</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:VisibleClass:VisibleClass:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstances</a+ ></p+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:VisibleClass:VisibleClass:2"+ ></span+ > <a href="#" title="HiddenInstances"+ >VisibleClass</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:VisibleClass:VisibleClass:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstances</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:VisibleData" class="def"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should be visible</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:VisibleData"+ >Instances</h4+ ><details id="i:VisibleData" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:VisibleData:Num:1"+ ></span+ > <a href="#" title="Prelude"+ >Num</a+ > <a href="#" title="HiddenInstances"+ >VisibleData</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:VisibleData:Num:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >(+)</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(-)</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(*)</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >negate</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >abs</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >signum</a+ > :: <a href="#" title="HiddenInstances"+ >VisibleData</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >fromInteger</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > -> <a href="#" title="HiddenInstances"+ >VisibleData</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:VisibleData:VisibleClass:2"+ ></span+ > <a href="#" title="HiddenInstances"+ >VisibleClass</a+ > <a href="#" title="HiddenInstances"+ >VisibleData</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:VisibleData:VisibleClass:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstances</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,186 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >HiddenInstancesB</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >HiddenInstancesB</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Foo</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Bar</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should be visible</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:1"+ ></span+ > <a href="#" title="HiddenInstancesB"+ >Foo</a+ > <a href="#" title="HiddenInstancesB"+ >Bar</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstancesA</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Should be visible</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Bar:Foo:1"+ ></span+ > <a href="#" title="HiddenInstancesB"+ >Foo</a+ > <a href="#" title="HiddenInstancesB"+ >Bar</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Bar:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >HiddenInstancesA</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,92 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Hyperlinks</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Hyperlinks</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A plain URL: <a href="#"+ >http://example.com/</a+ ></p+ ><p+ >A URL with a label: <a href="#"+ >some link</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,290 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Identifiers</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Identifiers</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Id</a+ > = <a href="#"+ >Id</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > a <a href="#"+ >:*</a+ > b = a <a href="#"+ >:*</a+ > b</li+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Id" class="def"+ >Id</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Id" class="def"+ >Id</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a id="t::-42-" class="def"+ >:*</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ >a <a id="v::-42-" class="def"+ >:*</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Unadorned:</p+ ><ul+ ><li+ >Unqualified: <code+ ><a href="#" title="GHC.List"+ >++</a+ ></code+ >, <code+ ><a href="#" title="Data.Foldable"+ >elem</a+ ></code+ ></li+ ><li+ >Qualified: <code+ ><a href="#" title="GHC.List"+ >++</a+ ></code+ >, <code+ ><a href="#" title="Data.Lis"+ >elem</a+ ></code+ ></li+ ><li+ >Namespaced: <code+ ><a href="#" title="GHC.List"+ >++</a+ ></code+ >, <code+ >++</code+ >, <code+ ><a href="#" title="Data.Foldable"+ >elem</a+ ></code+ >, <code+ >elem</code+ >, <code+ ><a href="#" title="Identifiers"+ >Id</a+ ></code+ >, <code+ ><a href="#" title="Identifiers"+ >Id</a+ ></code+ >, <code+ ><a href="#" title="Identifiers"+ >:*</a+ ></code+ >, <code+ ><a href="#" title="Identifiers"+ >:*</a+ ></code+ ></li+ ></ul+ ></li+ ><li+ ><p+ >Parenthesized:</p+ ><ul+ ><li+ >Unqualified: <code+ ><code+ ><a href="#" title="GHC.List"+ >(++)</a+ ></code+ > [1,2,3] [4,5,6]</code+ ></li+ ><li+ >Qualified: <code+ ><code+ ><a href="#" title="GHC.List"+ >(++)</a+ ></code+ > [1,2,3] [4,5,6]</code+ ></li+ ><li+ >Namespaced: <code+ ><a href="#" title="GHC.List"+ >(++)</a+ ></code+ >, <code+ >++</code+ >, <code+ ><a href="#" title="Identifiers"+ >(:*)</a+ ></code+ >, <code+ ><a href="#" title="Identifiers"+ >(:*)</a+ ></code+ ></li+ ></ul+ ></li+ ><li+ ><p+ >Backticked:</p+ ><ul+ ><li+ >Unqualified: <code+ >1 <code+ ><a href="#" title="Data.Foldable"+ >`elem`</a+ ></code+ > [-3..3]</code+ ></li+ ><li+ >Qualified: <code+ >1 <code+ ><a href="#" title="Data.Foldable"+ >`elem`</a+ ></code+ > [-3..3]</code+ ></li+ ><li+ >Namespaced: <code+ ><a href="#" title="Data.Foldable"+ >`elem`</a+ ></code+ >, <code+ >`elem`</code+ >, <code+ ><a href="#" title="Identifiers"+ >`Id`</a+ ></code+ >, <code+ ><a href="#" title="Identifiers"+ >`Id`</a+ ></code+ ></li+ ></ul+ ></li+ ><li+ ><p+ >Edge cases:</p+ ><ul+ ><li+ >Tuples: <code+ >()</code+ >, <code+ >(,,,)</code+ ></li+ ></ul+ ></li+ ></ul+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,106 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >IgnoreExports</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >IgnoreExports</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ ></li+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >documentation for Foo</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >documentation for foo</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,120 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >ImplicitParams</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >ImplicitParams</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:X" class="def"+ >X</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:c" class="def"+ >c</a+ > :: (?x :: <a href="#" title="ImplicitParams"+ >X</a+ >) => <a href="#" title="ImplicitParams"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:d" class="def"+ >d</a+ > :: (?x :: <a href="#" title="ImplicitParams"+ >X</a+ >, ?y :: <a href="#" title="ImplicitParams"+ >X</a+ >) => (<a href="#" title="ImplicitParams"+ >X</a+ >, <a href="#" title="ImplicitParams"+ >X</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: ((?x :: <a href="#" title="ImplicitParams"+ >X</a+ >) => a) -> a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,2152 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Instances</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Instances</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > a <a id="t:-60--126--126-" class="def"+ ><~~</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Xyzzy" class="def"+ >Xyzzy</a+ > (b -> (a, a))</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:-60--126--126-"+ >Instances</h4+ ><details id="i:-60--126--126-" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:-60--126--126-:Foo:1"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="Instances"+ >(<~~)</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:-60--126--126-:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: (a <a href="#" title="Instances"+ ><~~</a+ > <a href="#" title="Data.Int"+ >Int</a+ >) -> a0 -> a <a href="#" title="Instances"+ ><~~</a+ > a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: (a <a href="#" title="Instances"+ ><~~</a+ > (a <a href="#" title="Instances"+ ><~~</a+ > a0)) -> <a href="#" title="Data.Int"+ >Int</a+ > -> a <a href="#" title="Instances"+ ><~~</a+ > (a <a href="#" title="Instances"+ ><~~</a+ > <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > f <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >Nothing</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: f <a href="#" title="Data.Int"+ >Int</a+ > -> a -> f a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:foo-39-" class="def"+ >foo'</a+ > :: f (f a) -> <a href="#" title="Data.Int"+ >Int</a+ > -> f (f <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:1"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > <a href="#" title="Data.Maybe"+ >Maybe</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Int"+ >Int</a+ > -> a -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > a) -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:2"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > <a href="#" title="GHC.List"+ >List</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: [<a href="#" title="Data.Int"+ >Int</a+ >] -> a -> [a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: [[a]] -> <a href="#" title="Data.Int"+ >Int</a+ > -> [[<a href="#" title="Data.Int"+ >Int</a+ >]] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:3"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="Data.Either"+ >Either</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Data.Either"+ >Either</a+ > a <a href="#" title="Data.Int"+ >Int</a+ > -> a0 -> <a href="#" title="Data.Either"+ >Either</a+ > a a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: <a href="#" title="Data.Either"+ >Either</a+ > a (<a href="#" title="Data.Either"+ >Either</a+ > a a0) -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Either"+ >Either</a+ > a (<a href="#" title="Data.Either"+ >Either</a+ > a <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:4"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="Instances"+ >(<~~)</a+ > a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: (a <a href="#" title="Instances"+ ><~~</a+ > <a href="#" title="Data.Int"+ >Int</a+ >) -> a0 -> a <a href="#" title="Instances"+ ><~~</a+ > a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: (a <a href="#" title="Instances"+ ><~~</a+ > (a <a href="#" title="Instances"+ ><~~</a+ > a0)) -> <a href="#" title="Data.Int"+ >Int</a+ > -> a <a href="#" title="Instances"+ ><~~</a+ > (a <a href="#" title="Instances"+ ><~~</a+ > <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:5"+ ></span+ > (<a href="#" title="Data.Eq"+ >Eq</a+ > a, <a href="#" title="Instances"+ >Foo</a+ > f) => <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="GHC.Tuple.Prim"+ >(,)</a+ > (f a))</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: (f a, <a href="#" title="Data.Int"+ >Int</a+ >) -> a0 -> (f a, a0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: (f a, (f a, a0)) -> <a href="#" title="Data.Int"+ >Int</a+ > -> (f a, (f a, <a href="#" title="Data.Int"+ >Int</a+ >)) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:6"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a b)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b <a href="#" title="Data.Int"+ >Int</a+ > -> a0 -> <a href="#" title="Instances"+ >Quux</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b (<a href="#" title="Instances"+ >Quux</a+ > a b a0) -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Instances"+ >Quux</a+ > a b (<a href="#" title="Instances"+ >Quux</a+ > a b <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:7"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="GHC.Tuple.Prim"+ >(,,)</a+ > a a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:7"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: (a, a, <a href="#" title="Data.Int"+ >Int</a+ >) -> a0 -> (a, a, a0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: (a, a, (a, a, a0)) -> <a href="#" title="Data.Int"+ >Int</a+ > -> (a, a, (a, a, <a href="#" title="Data.Int"+ >Int</a+ >)) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Foo:Foo:8"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > ((->) a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Foo:Foo:8"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: (a -> <a href="#" title="Data.Int"+ >Int</a+ >) -> a0 -> a -> a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: (a -> (a -> a0)) -> <a href="#" title="Data.Int"+ >Int</a+ > -> a -> (a -> <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="#" title="Instances"+ >Foo</a+ > f => <a id="t:Bar" class="def"+ >Bar</a+ > f a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >Nothing</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: f a -> f <a href="#" title="Data.Bool"+ >Bool</a+ > -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:bar-39-" class="def"+ >bar'</a+ > :: f (f a) -> f (f (f b)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:bar0" class="def"+ >bar0</a+ > :: (f a, f a) -> (f b, f c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:bar1" class="def"+ >bar1</a+ > :: (f a, f a) -> (f b, f c) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:1"+ ></span+ > <a href="#" title="Instances"+ >Bar</a+ > <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ >) -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ >, <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ >) -> (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b, <a href="#" title="Data.Maybe"+ >Maybe</a+ > c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ >, <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ >) -> (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b, <a href="#" title="Data.Maybe"+ >Maybe</a+ > c) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:2"+ ></span+ > <a href="#" title="Instances"+ >Bar</a+ > <a href="#" title="Data.Maybe"+ >Maybe</a+ > [a]</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > [a] -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> [a] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > [a]) -> <a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: (<a href="#" title="Data.Maybe"+ >Maybe</a+ > [a], <a href="#" title="Data.Maybe"+ >Maybe</a+ > [a]) -> (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b, <a href="#" title="Data.Maybe"+ >Maybe</a+ > c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: (<a href="#" title="Data.Maybe"+ >Maybe</a+ > [a], <a href="#" title="Data.Maybe"+ >Maybe</a+ > [a]) -> (<a href="#" title="Data.Maybe"+ >Maybe</a+ > b, <a href="#" title="Data.Maybe"+ >Maybe</a+ > c) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:3"+ ></span+ > <a href="#" title="Instances"+ >Bar</a+ > <a href="#" title="GHC.List"+ >List</a+ > (a, a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: [(a, a)] -> [<a href="#" title="Data.Bool"+ >Bool</a+ >] -> (a, a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: [[(a, a)]] -> [[[b]]] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: ([(a, a)], [(a, a)]) -> ([b], [c]) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: ([(a, a)], [(a, a)]) -> ([b], [c]) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:4"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > f => <a href="#" title="Instances"+ >Bar</a+ > (<a href="#" title="Data.Either"+ >Either</a+ > a) (f a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Data.Either"+ >Either</a+ > a (f a) -> <a href="#" title="Data.Either"+ >Either</a+ > a <a href="#" title="Data.Bool"+ >Bool</a+ > -> f a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: <a href="#" title="Data.Either"+ >Either</a+ > a (<a href="#" title="Data.Either"+ >Either</a+ > a (f a)) -> <a href="#" title="Data.Either"+ >Either</a+ > a (<a href="#" title="Data.Either"+ >Either</a+ > a (<a href="#" title="Data.Either"+ >Either</a+ > a b)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: (<a href="#" title="Data.Either"+ >Either</a+ > a (f a), <a href="#" title="Data.Either"+ >Either</a+ > a (f a)) -> (<a href="#" title="Data.Either"+ >Either</a+ > a b, <a href="#" title="Data.Either"+ >Either</a+ > a c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: (<a href="#" title="Data.Either"+ >Either</a+ > a (f a), <a href="#" title="Data.Either"+ >Either</a+ > a (f a)) -> (<a href="#" title="Data.Either"+ >Either</a+ > a b, <a href="#" title="Data.Either"+ >Either</a+ > a c) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:5"+ ></span+ > <a href="#" title="Instances"+ >Bar</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a c) (<a href="#" title="Instances"+ >Quux</a+ > a b c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c) -> <a href="#" title="Instances"+ >Quux</a+ > a c <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Instances"+ >Quux</a+ > a b c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c b0)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c), <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> (<a href="#" title="Instances"+ >Quux</a+ > a c b0, <a href="#" title="Instances"+ >Quux</a+ > a c c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c), <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> (<a href="#" title="Instances"+ >Quux</a+ > a c b0, <a href="#" title="Instances"+ >Quux</a+ > a c c0) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Bar:Bar:6"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="GHC.Tuple.Prim"+ >(,,)</a+ > a b) => <a href="#" title="Instances"+ >Bar</a+ > (<a href="#" title="GHC.Tuple.Prim"+ >(,,)</a+ > a b) (a, b, a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Bar:Bar:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: (a, b, (a, b, a)) -> (a, b, <a href="#" title="Data.Bool"+ >Bool</a+ >) -> (a, b, a) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: (a, b, (a, b, (a, b, a))) -> (a, b, (a, b, (a, b, b0))) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: ((a, b, (a, b, a)), (a, b, (a, b, a))) -> ((a, b, b0), (a, b, c)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: ((a, b, (a, b, a)), (a, b, (a, b, a))) -> ((a, b, b0), (a, b, c)) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Baz" class="def"+ >Baz</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >Nothing</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:baz" class="def"+ >baz</a+ > :: a -> (<span class="keyword"+ >forall</span+ > a. a -> a) -> (b, <span class="keyword"+ >forall</span+ > c. c -> a) -> (b, c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:baz-39-" class="def"+ >baz'</a+ > :: b -> (<span class="keyword"+ >forall</span+ > b. b -> a) -> (<span class="keyword"+ >forall</span+ > b. b -> a) -> [(b, a)] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:baz-39--39-" class="def"+ >baz''</a+ > :: b -> (<span class="keyword"+ >forall</span+ > b. (<span class="keyword"+ >forall</span+ > b. b -> a) -> c) -> <span class="keyword"+ >forall</span+ > c. c -> b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Baz"+ >Instances</h4+ ><details id="i:Baz" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Baz:Baz:1"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > [c]</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Baz:Baz:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: [c] -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b, <span class="keyword"+ >forall</span+ > c1. c1 -> [c]) -> (b, c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b -> (<span class="keyword"+ >forall</span+ > b1. b1 -> [c]) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> [c]) -> [(b, [c])] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> [c]) -> c0) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Baz:Baz:2"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > (a -> b)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Baz:Baz:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: (a -> b) -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b0, <span class="keyword"+ >forall</span+ > c1. c1 -> a -> b) -> (b0, c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. b1 -> a -> b) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> a -> b) -> [(b0, a -> b)] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> a -> b) -> c) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Baz:Baz:3"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a b c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Baz:Baz:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b c -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b0, <span class="keyword"+ >forall</span+ > c1. c1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> (b0, c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. b1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> [(b0, <a href="#" title="Instances"+ >Quux</a+ > a b c)] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> c0) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Baz:Baz:4"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > (a, b, c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Baz:Baz:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: (a, b, c) -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b0, <span class="keyword"+ >forall</span+ > c1. c1 -> (a, b, c)) -> (b0, c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. b1 -> (a, b, c)) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> (a, b, c)) -> [(b0, (a, b, c))] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> (a, b, c)) -> c0) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Baz:Baz:5"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > (a, [b], b, a)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Baz:Baz:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: (a, [b], b, a) -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b0, <span class="keyword"+ >forall</span+ > c1. c1 -> (a, [b], b, a)) -> (b0, c) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. b1 -> (a, [b], b, a)) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> (a, [b], b, a)) -> [(b0, (a, [b], b, a))] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> (a, [b], b, a)) -> c) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Quux" class="def"+ >Quux</a+ > a b c <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Qx" class="def"+ >Qx</a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Qux" class="def"+ >Qux</a+ > a b</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Quux" class="def"+ >Quux</a+ > a b c</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Quux"+ >Instances</h4+ ><details id="i:Quux" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Quux:Foo:1"+ ></span+ > <a href="#" title="Instances"+ >Foo</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a b)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Quux:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b <a href="#" title="Data.Int"+ >Int</a+ > -> a0 -> <a href="#" title="Instances"+ >Quux</a+ > a b a0 <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >foo'</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b (<a href="#" title="Instances"+ >Quux</a+ > a b a0) -> <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Instances"+ >Quux</a+ > a b (<a href="#" title="Instances"+ >Quux</a+ > a b <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Quux:Bar:2"+ ></span+ > <a href="#" title="Instances"+ >Bar</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a c) (<a href="#" title="Instances"+ >Quux</a+ > a b c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Quux:Bar:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c) -> <a href="#" title="Instances"+ >Quux</a+ > a c <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Instances"+ >Quux</a+ > a b c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar'</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a c b0)) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar0</a+ > :: (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c), <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> (<a href="#" title="Instances"+ >Quux</a+ > a c b0, <a href="#" title="Instances"+ >Quux</a+ > a c c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >bar1</a+ > :: (<a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c), <a href="#" title="Instances"+ >Quux</a+ > a c (<a href="#" title="Instances"+ >Quux</a+ > a b c)) -> (<a href="#" title="Instances"+ >Quux</a+ > a c b0, <a href="#" title="Instances"+ >Quux</a+ > a c c0) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Quux:Baz:3"+ ></span+ > <a href="#" title="Instances"+ >Baz</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a b c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Quux:Baz:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >baz</a+ > :: <a href="#" title="Instances"+ >Quux</a+ > a b c -> (<span class="keyword"+ >forall</span+ > a1. a1 -> a1) -> (b0, <span class="keyword"+ >forall</span+ > c1. c1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> (b0, c0) <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz'</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. b1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> (<span class="keyword"+ >forall</span+ > b1. b1 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> [(b0, <a href="#" title="Instances"+ >Quux</a+ > a b c)] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >baz''</a+ > :: b0 -> (<span class="keyword"+ >forall</span+ > b1. (<span class="keyword"+ >forall</span+ > b2. b2 -> <a href="#" title="Instances"+ >Quux</a+ > a b c) -> c0) -> <span class="keyword"+ >forall</span+ > c1. c1 -> b0 <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Quux:Thud:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="Instances"+ >Thud</a+ > <a href="#" title="Data.Int"+ >Int</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a [a] c)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Quux:Thud:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Instances"+ >Thud</a+ > <a href="#" title="Data.Int"+ >Int</a+ > (<a href="#" title="Instances"+ >Quux</a+ > a [a] c) <ul class="inst"+ ><li class="inst"+ >= <a id="v:Thuud" class="def"+ >Thuud</a+ > a</li+ ><li class="inst"+ >| <a id="v:Thuuud" class="def"+ >Thuuud</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Norf" class="def"+ >Norf</a+ > a b <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >Nothing</p+ ></div+ ><div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:Plugh" class="def"+ >Plugh</a+ > a c b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Thud" class="def"+ >Thud</a+ > a c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:norf" class="def"+ >norf</a+ > :: <a href="#" title="Instances"+ >Plugh</a+ > a c b -> a -> (a -> c) -> b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Norf"+ >Instances</h4+ ><details id="i:Norf" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Norf:Norf:1"+ ></span+ > <a href="#" title="Instances"+ >Norf</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Norf:Norf:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="Instances"+ >Plugh</a+ > <a href="#" title="Data.Int"+ >Int</a+ > c <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Instances"+ >Thud</a+ > <a href="#" title="Data.Int"+ >Int</a+ > c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >norf</a+ > :: <a href="#" title="Instances"+ >Plugh</a+ > <a href="#" title="Data.Int"+ >Int</a+ > c <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > -> (<a href="#" title="Data.Int"+ >Int</a+ > -> c) -> <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Norf:Norf:2"+ ></span+ > <a href="#" title="Instances"+ >Norf</a+ > [a] [b]</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Norf:Norf:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Instances</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="Instances"+ >Plugh</a+ > [a] c [b] <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="Instances"+ >Thud</a+ > [a] c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >norf</a+ > :: <a href="#" title="Instances"+ >Plugh</a+ > [a] c [b] -> [a] -> ([a] -> c) -> [b] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,114 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >LinearTypes</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >LinearTypes</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >unrestricted</a+ > :: a -> b</li+ ><li class="src short"+ ><a href="#"+ >linear</a+ > :: a %1 -> b</li+ ><li class="src short"+ ><a href="#"+ >poly</a+ > :: a %m -> b</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:unrestricted" class="def"+ >unrestricted</a+ > :: a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Does something unrestricted.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:linear" class="def"+ >linear</a+ > :: a %1 -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Does something linear.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:poly" class="def"+ >poly</a+ > :: a %m -> b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Does something polymorphic.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,114 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Math</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Math</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Math (display) for <code+ >normalDensity</code+ ></p+ ><p+ ><span class="mathjax"+ >\[+ \int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}+ \]</span+ ></p+ ><p+ ><span class="mathjax"+ >\(\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\)</span+ ></p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Math (inline) for <code+ >normalDensity</code+ >+ <span class="mathjax"+ >\(\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\)</span+ >+ <span class="mathjax"+ >\[\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\]</span+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,348 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Minimal</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Minimal</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This tests the new MINIMAL pragma present in GHC 7.8</p+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ ><a href="#" title="Minimal"+ >foo</a+ >, <a href="#" title="Minimal"+ >bar</a+ > | <a href="#" title="Minimal"+ >bar</a+ >, <a href="#" title="Minimal"+ >bat</a+ > | <a href="#" title="Minimal"+ >foo</a+ >, <a href="#" title="Minimal"+ >bat</a+ > | <a href="#" title="Minimal"+ >fooBarBat</a+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Any two of these are required...</p+ ></div+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:bat" class="def"+ >bat</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:fooBarBat" class="def"+ >fooBarBat</a+ > :: (a, a, a) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >.. or just this</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Weird" class="def"+ >Weird</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >(<a href="#" title="Minimal"+ >a</a+ >, <a href="#" title="Minimal"+ >b</a+ >, <a href="#" title="Minimal"+ >c</a+ > | (<a href="#" title="Minimal"+ >d</a+ > | <a href="#" title="Minimal"+ >e</a+ >, (<a href="#" title="Minimal"+ >f</a+ > | <a href="#" title="Minimal"+ >g</a+ >)))</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:a" class="def"+ >a</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:b" class="def"+ >b</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:c" class="def"+ >c</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:d" class="def"+ >d</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:e" class="def"+ >e</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:NoMins" class="def"+ >NoMins</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ ><a href="#" title="Minimal"+ >x</a+ >, <a href="#" title="Minimal"+ >y</a+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:y" class="def"+ >y</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:z" class="def"+ >z</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:FullMin" class="def"+ >FullMin</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:aaa" class="def"+ >aaa</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:bbb" class="def"+ >bbb</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:PartialMin" class="def"+ >PartialMin</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ ><a href="#" title="Minimal"+ >ccc</a+ >, ddd</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:ccc" class="def"+ >ccc</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:EmptyMin" class="def"+ >EmptyMin</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >Nothing</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:eee" class="def"+ >eee</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:fff" class="def"+ >fff</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,84 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >ModuleWithWarning</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >ModuleWithWarning</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><div class="warning"+ ><p+ >Warning: This is an unstable interface. Prefer functions from <a href="#"+ >Prelude</a+ > instead!</p+ ></div+ ><p+ >Documentation for <a href="#"+ >ModuleWithWarning</a+ >.</p+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,70 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >NamedDoc</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >NamedDoc</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="doc"+ ><p+ >bar</p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,150 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >NamespacedIdentifiers</title+ ><link href="linuwial.css" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="quick-jump.css"+ /><link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="index.html"+ >Contents</a+ ></li+ ><li+ ><a href="doc-index.html"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >NamespacedIdentifiers</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#t:Foo"+ >Foo</a+ > = <a href="#v:Bar"+ >Bar</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#t:Bar"+ >Bar</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#t:Foo" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A link to:</p+ ><ul+ ><li+ >the type <code+ ><a href="NamespacedIdentifiers.html#t:Bar" title="NamespacedIdentifiers"+ >Bar</a+ ></code+ ></li+ ><li+ >the constructor <code+ ><a href="NamespacedIdentifiers.html#v:Bar" title="NamespacedIdentifiers"+ >Bar</a+ ></code+ ></li+ ><li+ >the unimported but qualified type <code+ ><a href="A.html#t:A" title="A"+ >A</a+ ></code+ ></li+ ><li+ >the unimported but qualified value <code+ ><a href="A.html#v:A" title="A"+ >A</a+ ></code+ ></li+ ></ul+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Bar" class="def"+ >Bar</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > <a href="#t:Bar" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A link to the value <code+ >Foo</code+ > (which shouldn't exist).</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,364 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Nesting</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Nesting</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >d</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >e</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >h</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >i</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >j</a+ > :: t</li+ ><li class="src short"+ ><a href="#"+ >k</a+ > :: t</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:d" class="def"+ >d</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >We can</p+ ><ul+ ><li+ ><p+ >easily go back</p+ ><ol+ ><li value="1"+ >some indentation</li+ ></ol+ ></li+ ><li+ >levels</li+ ></ul+ ></li+ ></ul+ ><ol+ ><li value="1"+ ><pre+ >back at the top</pre+ ></li+ ></ol+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:e" class="def"+ >e</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Beginning of list</p+ ><ul+ ><li+ >second list</li+ ></ul+ ></li+ ><li+ >Some indented list but+the presence of this text pushes it out of nesting back to the top.</li+ ></ul+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Beginning of list</p+ ><pre+ >nested code+ we preserve the space correctly+</pre+ ></li+ ></ul+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Beginning of list</p+ ><ul+ ><li+ >Nested list</li+ ></ul+ ></li+ ></ul+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:h" class="def"+ >h</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Beginning of list</p+ ><pre+ >nested+bird+tracks</pre+ ></li+ ></ul+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:i" class="def"+ >i</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ ><p+ >Beginning of list+This belongs to the list above!</p+ ><pre+ >nested+bird+tracks++another line+ with indentation</pre+ ><pre+ >nested bird tracks+ without leading space</pre+ ><ul+ ><li+ ><p+ >Next list+More of the indented list.</p+ ><ul+ ><li+ ><p+ >Deeper</p+ ><ul+ ><li+ ><p+ >Deeper</p+ ><ul+ ><li+ >Even deeper!</li+ ><li+ >No newline separation even in indented lists.</li+ ></ul+ ></li+ ></ul+ ></li+ ></ul+ ></li+ ></ul+ ></li+ ></ul+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:j" class="def"+ >j</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><dl+ ><dt+ >All this</dt+ ><dd+ >Works for+definition lists too.<pre+ >nested+bird+tracks</pre+ ><ul+ ><li+ ><p+ >Next list+with more of the indented list content.</p+ ><p+ >Even more content on a new line.</p+ ><ol+ ><li value="1"+ ><p+ >Different type of list</p+ ><ol+ ><li value="2"+ >Deeper</li+ ></ol+ ><pre class="screen"+ ><code class="prompt"+ >>>> </code+ ><strong class="userinput"+ ><code+ >Here's an example in a list+</code+ ></strong+ >example result+</pre+ ><dl+ ><dt+ >b</dt+ ><dd+ >Even deeper!</dd+ ><dt+ >c</dt+ ><dd+ >No newline separation even in indented lists.+ We can have any paragraph level element that we normally+ can, like headers</dd+ ></dl+ ><h3+ >Level 3 header</h3+ ><p+ >with some content…</p+ ><ul+ ><li+ >and even more lists inside</li+ ></ul+ ></li+ ></ol+ ></li+ ></ul+ ></dd+ ></dl+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:k" class="def"+ >k</a+ > :: t <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><ul+ ><li+ >list may start at arbitrary depth</li+ ><li+ >and consecutive items at that depth+ belong to the same list</li+ ><li+ ><p+ >of course we can still</p+ ><ul+ ><li+ >nest items like we are used to</li+ ></ul+ ></li+ ><li+ >and then get back to initial list</li+ ></ul+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,90 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >NoLayout</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >NoLayout</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >the function <code+ ><a href="#" title="NoLayout"+ >g</a+ ></code+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >NonGreedy</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >NonGreedy</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ ><a href="#"+ >url1</a+ > <a href="#"+ >url2</a+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,532 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Operators</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Operators</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Test operators with or without fixity declarations</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >(+-)</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >(*/)</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: a -> a -> a</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Foo</a+ ><ul class="subs"+ ><li+ >= <a href="#" title="Operators"+ >Foo</a+ > <a href="#"+ >`Bar`</a+ > <a href="#" title="Operators"+ >Foo</a+ ></li+ ><li+ >| <a href="#" title="Operators"+ >Foo</a+ > <a href="#"+ >:-</a+ > <a href="#" title="Operators"+ >Foo</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >(:+)</a+ > :: a -> a -> [a]</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > a <a href="#"+ ><-></a+ > b <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >(:<->)</a+ > :: a -> b -> a <a href="#" title="Operators"+ ><-></a+ > b</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > a <a href="#"+ >++</a+ > b</li+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > a <a href="#"+ >**</a+ > b</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > a <a href="#"+ >><></a+ > b | a -> b <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >type</span+ > a <a href="#"+ ><><</a+ > b :: *</li+ ><li+ ><span class="keyword"+ >data</span+ > a <a href="#"+ >><<</a+ > b</li+ ><li+ ><a href="#"+ >(>><)</a+ >, <a href="#"+ >(<<>)</a+ > :: a -> b -> ()</li+ ><li+ ><a href="#"+ >(**>)</a+ >, <a href="#"+ >(**<)</a+ >, <a href="#"+ >(>**)</a+ >, <a href="#"+ >(<**)</a+ > :: a -> a -> ()</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type</span+ > <a href="#"+ >(>-<)</a+ > a b = a <a href="#" title="Operators"+ ><-></a+ > b</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:-43--45-" class="def"+ >(+-)</a+ > :: a -> a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Operator with no fixity</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:-42--47-" class="def"+ >(*/)</a+ > :: a -> a -> a <span class="fixity"+ >infixr 7</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Operator with infixr 7</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: a -> a -> a <span class="fixity"+ >infixl 3</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Named function with infixl 3</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Data type with operator constructors</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a href="#" title="Operators"+ >Foo</a+ > <a id="v:Bar" class="def"+ >`Bar`</a+ > <a href="#" title="Operators"+ >Foo</a+ > <span class="fixity"+ >infixl 3</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Has infixl 3</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a href="#" title="Operators"+ >Foo</a+ > <a id="v::-45-" class="def"+ >:-</a+ > <a href="#" title="Operators"+ >Foo</a+ > <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc"+ ><p+ >Has infixr 5</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v::-43-" class="def"+ >(:+)</a+ > :: a -> a -> [a] <span class="fixity"+ >infixr 3</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern synonym, infixr 3</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a id="t:-60--45--62-" class="def"+ ><-></a+ > b <span class="keyword"+ >where</span+ > <span class="fixity"+ >infixl 6</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Type name, infixl 6 and GADT constructor</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v::-60--45--62-" class="def"+ >(:<->)</a+ > :: a -> b -> a <a href="#" title="Operators"+ ><-></a+ > b <span class="fixity"+ >infixr 6</span+ ><span class="rightedge"+ ></span+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > a <a id="t:-43--43-" class="def"+ >++</a+ > b <span class="fixity"+ >infix 3</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Type family with fixity</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > a <a id="t:-42--42-" class="def"+ >**</a+ > b <span class="fixity"+ >infix 9</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Data family with fixity</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > a <a id="t:-62--60--62-" class="def"+ >><></a+ > b | a -> b <span class="keyword"+ >where</span+ > <span class="fixity"+ >infixr 1</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Class with fixity, including associated types</p+ ></div+ ><div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > a <a id="t:-60--62--60-" class="def"+ ><><</a+ > b :: * <span class="fixity"+ >infixl 2</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a id="t:-62--60--60-" class="def"+ >><<</a+ > b <span class="fixity"+ >infixl 3</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:-62--62--60-" class="def"+ >(>><)</a+ > :: a -> b -> () <span class="fixity"+ >infixr 4</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:-60--60--62-" class="def"+ >(<<>)</a+ > :: a -> b -> () <span class="fixity"+ >infixl 5</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:-42--42--62-" class="def"+ >(**>)</a+ > :: a -> a -> () <span class="fixity"+ >infixr 8</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Multiple fixities</p+ ></div+ ><p class="src"+ ><a id="v:-42--42--60-" class="def"+ >(**<)</a+ > :: a -> a -> () <span class="fixity"+ >infixl 8</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Multiple fixities</p+ ></div+ ><p class="src"+ ><a id="v:-62--42--42-" class="def"+ >(>**)</a+ > :: a -> a -> () <span class="fixity"+ >infixr 8</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Multiple fixities</p+ ></div+ ><p class="src"+ ><a id="v:-60--42--42-" class="def"+ >(<**)</a+ > :: a -> a -> () <span class="fixity"+ >infixl 8</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Multiple fixities</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:-62--45--60-" class="def"+ >(>-<)</a+ > a b = a <a href="#" title="Operators"+ ><-></a+ > b <span class="fixity"+ >infixl 6</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Type synonym with fixity</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,116 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >OrphanInstances</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >OrphanInstances</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Orphan instances</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Orphan instances</h1+ ><div id="section.orphans"+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:o:ic:AClass:AClass:1"+ ></span+ > <a href="#" title="OrphanInstancesClass"+ >AClass</a+ > <a href="#" title="OrphanInstancesType"+ >AType</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >This is an orphan instance.</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:o:ic:AClass:AClass:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >aClass</a+ > :: <a href="#" title="OrphanInstancesType"+ >AType</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,136 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >OrphanInstancesClass</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >OrphanInstancesClass</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:AClass" class="def"+ >AClass</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:aClass" class="def"+ >aClass</a+ > :: a -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:AClass"+ >Instances</h4+ ><details id="i:AClass" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:AClass:AClass:1"+ ></span+ > <a href="#" title="OrphanInstancesClass"+ >AClass</a+ > <a href="#" title="OrphanInstancesType"+ >AType</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >This is an orphan instance.</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:AClass:AClass:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >OrphanInstances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >aClass</a+ > :: <a href="#" title="OrphanInstancesType"+ >AType</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,138 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >OrphanInstancesType</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >OrphanInstancesType</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:AType" class="def"+ >AType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:AType" class="def"+ >AType</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:AType"+ >Instances</h4+ ><details id="i:AType" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:AType:AClass:1"+ ></span+ > <a href="#" title="OrphanInstancesClass"+ >AClass</a+ > <a href="#" title="OrphanInstancesType"+ >AType</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >This is an orphan instance.</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:AType:AClass:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >OrphanInstances</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >aClass</a+ > :: <a href="#" title="OrphanInstancesType"+ >AType</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >PR643</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >PR643</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >test</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:test" class="def"+ >test</a+ > :: () <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Some big documentation</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >PR643_1</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >PR643_1</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >test</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:test" class="def"+ >test</a+ > :: () <span class="fixity"+ >infixr 5</span+ ><span class="rightedge"+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Some big documentation</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,379 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >PatternSyns</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >PatternSyns</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Testing some pattern synonyms</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >FooType</a+ > x = <a href="#"+ >FooCtor</a+ > x</li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Foo</a+ > :: x -> <a href="#" title="PatternSyns"+ >FooType</a+ > x</li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Bar</a+ > :: x -> <a href="#" title="PatternSyns"+ >FooType</a+ > (<a href="#" title="PatternSyns"+ >FooType</a+ > x)</li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >(:<->)</a+ > :: x1 -> x2 -> (<a href="#" title="PatternSyns"+ >FooType</a+ > x1, <a href="#" title="PatternSyns"+ >FooType</a+ > (<a href="#" title="PatternSyns"+ >FooType</a+ > x2))</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >BlubType</a+ > = <span class="keyword"+ >forall</span+ > x.<a href="#" title="Text.Show"+ >Show</a+ > x => <a href="#"+ >BlubCtor</a+ > x</li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >Blub</a+ > :: () => <a href="#" title="Text.Show"+ >Show</a+ > x => x -> <a href="#" title="PatternSyns"+ >BlubType</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > (a :: *) <a href="#"+ >><</a+ > b = <a href="#"+ >Empty</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >E</a+ > :: a <a href="#" title="PatternSyns"+ >><</a+ > b</li+ ><li class="src short"+ ><span class="keyword"+ >pattern</span+ > <a href="#"+ >PatWithExplicitSig</a+ > :: <a href="#" title="Data.Eq"+ >Eq</a+ > somex => somex -> <a href="#" title="PatternSyns"+ >FooType</a+ > somex</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:FooType" class="def"+ >FooType</a+ > x <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >FooType doc</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:FooCtor" class="def"+ >FooCtor</a+ > x</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Foo" class="def"+ >Foo</a+ > :: x -> <a href="#" title="PatternSyns"+ >FooType</a+ > x <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern synonym for <code+ ><a href="#" title="PatternSyns"+ >Foo</a+ ></code+ > x</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Bar" class="def"+ >Bar</a+ > :: x -> <a href="#" title="PatternSyns"+ >FooType</a+ > (<a href="#" title="PatternSyns"+ >FooType</a+ > x) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern synonym for <code+ ><a href="#" title="PatternSyns"+ >Bar</a+ ></code+ > x</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v::-60--45--62-" class="def"+ >(:<->)</a+ > :: x1 -> x2 -> (<a href="#" title="PatternSyns"+ >FooType</a+ > x1, <a href="#" title="PatternSyns"+ >FooType</a+ > (<a href="#" title="PatternSyns"+ >FooType</a+ > x2)) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern synonym for (<code+ ><a href="#" title="PatternSyns"+ >:<-></a+ ></code+ >)</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:BlubType" class="def"+ >BlubType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >BlubType is existentially quantified</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >forall</span+ > x.<a href="#" title="Text.Show"+ >Show</a+ > x => <a id="v:BlubCtor" class="def"+ >BlubCtor</a+ > x</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:Blub" class="def"+ >Blub</a+ > :: () => <a href="#" title="Text.Show"+ >Show</a+ > x => x -> <a href="#" title="PatternSyns"+ >BlubType</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern synonym for <code+ ><a href="#" title="PatternSyns"+ >Blub</a+ ></code+ > x</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > (a :: *) <a id="t:-62--60-" class="def"+ >><</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for (<code+ ><a href="#" title="PatternSyns"+ >><</a+ ></code+ >)</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Empty" class="def"+ >Empty</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:E" class="def"+ >E</a+ > :: a <a href="#" title="PatternSyns"+ >><</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Pattern for <code+ ><a href="#" title="PatternSyns"+ >Empty</a+ ></code+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >pattern</span+ > <a id="v:PatWithExplicitSig" class="def"+ >PatWithExplicitSig</a+ > :: <a href="#" title="Data.Eq"+ >Eq</a+ > somex => somex -> <a href="#" title="PatternSyns"+ >FooType</a+ > somex <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Earlier ghc versions didn't allow explicit signatures+ on pattern synonyms.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,210 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >PromotedTypes</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >PromotedTypes</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:RevList" class="def"+ >RevList</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:RNil" class="def"+ >RNil</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >(<a href="#" title="PromotedTypes"+ >RevList</a+ > a) <a id="v::-62-" class="def"+ >:></a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Pattern" class="def"+ >Pattern</a+ > :: [*] -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Nil" class="def"+ >Nil</a+ > :: <a href="#" title="PromotedTypes"+ >Pattern</a+ > '[]</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Cons" class="def"+ >Cons</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > h -> <a href="#" title="PromotedTypes"+ >Pattern</a+ > t -> <a href="#" title="PromotedTypes"+ >Pattern</a+ > (h ': t)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:RevPattern" class="def"+ >RevPattern</a+ > :: <a href="#" title="PromotedTypes"+ >RevList</a+ > * -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:RevNil" class="def"+ >RevNil</a+ > :: <a href="#" title="PromotedTypes"+ >RevPattern</a+ > <a href="#" title="PromotedTypes"+ >RNil</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:RevCons" class="def"+ >RevCons</a+ > :: <a href="#" title="Data.Maybe"+ >Maybe</a+ > h -> <a href="#" title="PromotedTypes"+ >RevPattern</a+ > t -> <a href="#" title="PromotedTypes"+ >RevPattern</a+ > (t <a href="#" title="PromotedTypes"+ >:></a+ > h)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Tuple" class="def"+ >Tuple</a+ > :: (*, *) -> * <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Tuple" class="def"+ >Tuple</a+ > :: a -> b -> <a href="#" title="PromotedTypes"+ >Tuple</a+ > '(a, b)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,96 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Properties</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Properties</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >fib</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > -> <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:fib" class="def"+ >fib</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > -> <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Fibonacci number of given <code+ ><a href="#" title="Prelude"+ >Integer</a+ ></code+ >.</p+ ><pre+ >fib n <= fib (n + 1)</pre+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,71 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >PruneWithWarning</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >PruneWithWarning</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >What is tested here:</p+ ><ul+ ><li+ >If a binding has a deprecation message but no documentation, it is pruned+ when <code+ >OPTIONS_HADDOCK prune</code+ > is used.</li+ ></ul+ ></div+ ></div+ ><div id="interface"+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,108 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >QuantifiedConstraints</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >QuantifiedConstraints</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:fooed" class="def"+ >fooed</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:needsParensAroundContext" class="def"+ >needsParensAroundContext</a+ > :: (<span class="keyword"+ >forall</span+ > x. <a href="#" title="QuantifiedConstraints"+ >Foo</a+ > (f x)) => f <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:needsNoParensAroundContext" class="def"+ >needsNoParensAroundContext</a+ > :: <a href="#" title="QuantifiedConstraints"+ >Foo</a+ > (f <a href="#" title="Data.Int"+ >Int</a+ >) => f <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,350 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >QuasiExpr</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >QuasiExpr</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Expr" class="def"+ >Expr</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:IntExpr" class="def"+ >IntExpr</a+ > <a href="#" title="Prelude"+ >Integer</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:AntiIntExpr" class="def"+ >AntiIntExpr</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:BinopExpr" class="def"+ >BinopExpr</a+ > <a href="#" title="QuasiExpr"+ >BinOp</a+ > <a href="#" title="QuasiExpr"+ >Expr</a+ > <a href="#" title="QuasiExpr"+ >Expr</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:AntiExpr" class="def"+ >AntiExpr</a+ > <a href="#" title="Data.String"+ >String</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Expr"+ >Instances</h4+ ><details id="i:Expr" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Expr:Show:1"+ ></span+ > <a href="#" title="Text.Show"+ >Show</a+ > <a href="#" title="QuasiExpr"+ >Expr</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Expr:Show:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >QuasiExpr</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >showsPrec</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="QuasiExpr"+ >Expr</a+ > -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >show</a+ > :: <a href="#" title="QuasiExpr"+ >Expr</a+ > -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >showList</a+ > :: [<a href="#" title="QuasiExpr"+ >Expr</a+ >] -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:BinOp" class="def"+ >BinOp</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:AddOp" class="def"+ >AddOp</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:SubOp" class="def"+ >SubOp</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:MulOp" class="def"+ >MulOp</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:DivOp" class="def"+ >DivOp</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:BinOp"+ >Instances</h4+ ><details id="i:BinOp" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:BinOp:Show:1"+ ></span+ > <a href="#" title="Text.Show"+ >Show</a+ > <a href="#" title="QuasiExpr"+ >BinOp</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:BinOp:Show:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >QuasiExpr</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >showsPrec</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="QuasiExpr"+ >BinOp</a+ > -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >show</a+ > :: <a href="#" title="QuasiExpr"+ >BinOp</a+ > -> <a href="#" title="Data.String"+ >String</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >showList</a+ > :: [<a href="#" title="QuasiExpr"+ >BinOp</a+ >] -> <a href="#" title="Text.Show"+ >ShowS</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:eval" class="def"+ >eval</a+ > :: <a href="#" title="QuasiExpr"+ >Expr</a+ > -> <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:expr" class="def"+ >expr</a+ > :: <a href="#" title="Language.Haskell.TH.Quote"+ >QuasiQuoter</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:parseExprExp" class="def"+ >parseExprExp</a+ > :: <a href="#" title="Data.String"+ >String</a+ > -> <a href="#" title="Language.Haskell.TH.Syntax"+ >Q</a+ > <a href="#" title="Language.Haskell.TH.Syntax"+ >Exp</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,68 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >QuasiQuote</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >QuasiQuote</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:val" class="def"+ >val</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,96 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >SectionLabels</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >SectionLabels</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Section heading</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >n</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:custom"+ ><h1+ >Section heading</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:n" class="def"+ >n</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,246 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >SpuriousSuperclassConstraints</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >SpuriousSuperclassConstraints</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >What is tested here:</p+ ><p+ >Due to a change in GHC 7.6.1 we had a bug that superclass contraints were+ included in the instances list. Edward K. repported it here:</p+ ><p+ ><a href="#"+ >http://www.haskell.org/pipermail/haskell-cafe/2012-September/103600.html</a+ ></p+ ><p+ >And here is the corresponding thread on glasgow-haskell-users:</p+ ><p+ ><a href="#"+ >http://www.haskell.org/pipermail/glasgow-haskell-users/2012-September/022914.html</a+ ></p+ ><p+ >It has been fixed in:</p+ ><pre+ >6ccf78e15a525282fef61bc4f58a279aa9c21771+Fix spurious superclass constraints bug.</pre+ ></div+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:SomeType" class="def"+ >SomeType</a+ > (f :: * -> *) a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:SomeType"+ >Instances</h4+ ><details id="i:SomeType" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:SomeType:Applicative:1"+ ></span+ > <a href="#" title="Control.Applicative"+ >Applicative</a+ > f => <a href="#" title="Control.Applicative"+ >Applicative</a+ > (<a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:SomeType:Applicative:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >SpuriousSuperclassConstraints</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >pure</a+ > :: a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*>)</a+ > :: <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f (a -> b) -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >liftA2</a+ > :: (a -> b -> c) -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f c <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(*>)</a+ > :: <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<*)</a+ > :: <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:SomeType:Functor:2"+ ></span+ > <a href="#" title="Data.Functor"+ >Functor</a+ > (<a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:SomeType:Functor:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >SpuriousSuperclassConstraints</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >fmap</a+ > :: (a -> b) -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >(<$)</a+ > :: a -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f b -> <a href="#" title="SpuriousSuperclassConstraints"+ >SomeType</a+ > f a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,70 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TH</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TH</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:decl" class="def"+ >decl</a+ > :: <a href="#" title="Language.Haskell.TH.Syntax"+ >Q</a+ > [<a href="#" title="Language.Haskell.TH.Syntax"+ >Dec</a+ >] <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,66 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TH2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TH2</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: p -> p <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,248 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Table</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Table</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This tests the table markup</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >tableWithHeader</a+ > :: a -> a</li+ ><li class="src short"+ ><a href="#"+ >tableWithoutHeader</a+ > :: a -> a</li+ ><li class="src short"+ ><a href="#"+ >fancyTable</a+ > :: a -> a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:tableWithHeader" class="def"+ >tableWithHeader</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Table with header.</p+ ><table+ ><thead+ ><tr+ ><th+ >code</th+ ><th+ >message</th+ ><th+ >description</th+ ></tr+ ></thead+ ><tbody+ ><tr+ ><td+ >200</td+ ><td+ ><code+ >OK</code+ ></td+ ><td+ >operation successful</td+ ></tr+ ><tr+ ><td+ >204</td+ ><td+ ><code+ >No Content</code+ ></td+ ><td+ >operation successful, no body returned</td+ ></tr+ ></tbody+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:tableWithoutHeader" class="def"+ >tableWithoutHeader</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Table without header.</p+ ><table+ ><tbody+ ><tr+ ><td+ >200</td+ ><td+ ><code+ >OK</code+ ></td+ ><td+ >operation successful</td+ ></tr+ ><tr+ ><td+ >204</td+ ><td+ ><code+ >No Content</code+ ></td+ ><td+ >operation successful, no body returned</td+ ></tr+ ><tr+ ><td+ >404</td+ ><td+ ><code+ >Not Found</code+ ></td+ ><td+ >resource not found</td+ ></tr+ ></tbody+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:fancyTable" class="def"+ >fancyTable</a+ > :: a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Fancy table.</p+ ><table+ ><thead+ ><tr+ ><th+ >Header row, column 1+(header rows optional)</th+ ><th+ >Header 2+</th+ ><th+ >Header 3+</th+ ><th+ >Header 4+</th+ ></tr+ ></thead+ ><tbody+ ><tr+ ><td+ >body row 1, column 1</td+ ><td+ >column 2</td+ ><td+ >column 3</td+ ><td+ >column 4</td+ ></tr+ ><tr+ ><td+ ><code+ ><a href="#" title="Table"+ >tableWithHeader</a+ ></code+ ></td+ ><td colspan="3"+ >Cells may span columns.</td+ ></tr+ ><tr+ ><td+ >body row 3</td+ ><td rowspan="2"+ >Cells may+span rows.+</td+ ><td colspan="2" rowspan="2"+ ><span class="mathjax"+ >\[+f(n) = \sum_{i=1}+\]</span+ ></td+ ></tr+ ><tr+ ><td+ >body row 4</td+ ></tr+ ></tbody+ ></table+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,2418 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Test</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th valign="top"+ >Copyright</th+ ><td+ >(c) Simon Marlow 2002</td+ ></tr+ ><tr+ ><th+ >License</th+ ><td+ >BSD-style</td+ ></tr+ ><tr+ ><th+ >Maintainer</th+ ><td+ >libraries@haskell.org</td+ ></tr+ ><tr+ ><th+ >Stability</th+ ><td+ >provisional</td+ ></tr+ ><tr+ ><th+ >Portability</th+ ><td+ >portable</td+ ></tr+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Test</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Type declarations</a+ ><ul+ ><li+ ><a href="#"+ >Data types</a+ ></li+ ><li+ ><a href="#"+ >Records</a+ ></li+ ></ul+ ></li+ ><li+ ><a href="#"+ >Class declarations</a+ ></li+ ><li+ ><a href="#"+ >Function types</a+ ></li+ ><li+ ><a href="#"+ >Auxiliary stuff</a+ ></li+ ><li+ ><a href="#"+ >A hidden module</a+ ></li+ ><li+ ><a href="#"+ >A visible module</a+ ></li+ ><li+ ><a href="#"+ >Existential / Universal types</a+ ></li+ ><li+ ><a href="#"+ >Type signatures with argument docs</a+ ></li+ ><li+ ><a href="#"+ >A section</a+ ><ul+ ><li+ ><a href="#"+ >A subsection</a+ ></li+ ></ul+ ></li+ ></ul+ ></div+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >This module illustrates & tests most of the features of Haddock.+ Testing references from the description: <code+ ><a href="#" title="Test"+ >T</a+ ></code+ >, <code+ ><a href="#" title="Test"+ >f</a+ ></code+ >, <code+ ><a href="#" title="Test"+ >g</a+ ></code+ >, <code+ ><a href="#" title="Visible"+ >visible</a+ ></code+ >.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T</a+ > a b<ul class="subs"+ ><li+ >= <a href="#"+ >A</a+ > <a href="#" title="Data.Int"+ >Int</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Prelude"+ >Float</a+ >)</li+ ><li+ >| <a href="#"+ >B</a+ > (<a href="#" title="Test"+ >T</a+ > a b, <a href="#" title="Test"+ >T</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Prelude"+ >Float</a+ >)</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T2</a+ > a b</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T3</a+ > a b<ul class="subs"+ ><li+ >= <a href="#"+ >A1</a+ > a</li+ ><li+ >| <a href="#"+ >B1</a+ > b</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T4</a+ > a b<ul class="subs"+ ><li+ >= <a href="#"+ >A2</a+ > a</li+ ><li+ >| <a href="#"+ >B2</a+ > b</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T5</a+ > a b<ul class="subs"+ ><li+ >= <a href="#"+ >A3</a+ > a</li+ ><li+ >| <a href="#"+ >B3</a+ > b</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >T6</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >A4</a+ ></li+ ><li+ >| <a href="#"+ >B4</a+ ></li+ ><li+ >| <a href="#"+ >C4</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N1</a+ > a = <a href="#"+ >N1</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N2</a+ > a b = <a href="#"+ >N2</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >n</a+ > :: a b</li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N3</a+ > a b = <a href="#"+ >N3</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >n3</a+ > :: a b</li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >N4</a+ > a b</li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N5</a+ > a b = <a href="#"+ >N5</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >n5</a+ > :: a b</li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N6</a+ > a b = <a href="#"+ >N6</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >n6</a+ > :: a b</li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >newtype</span+ > <a href="#"+ >N7</a+ > a b = <a href="#"+ >N7</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >n7</a+ > :: a b</li+ ></ul+ >}</li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >R</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >C1</a+ > { <ul class="subs"+ ><li+ ><a href="#"+ >p</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li+ ><a href="#"+ >q</a+ > :: <span class="keyword"+ >forall</span+ > a. a -> a</li+ ><li+ ><a href="#"+ >r</a+ >, <a href="#"+ >s</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ > }</li+ ><li+ >| <a href="#"+ >C2</a+ > { <ul class="subs"+ ><li+ ><a href="#"+ >t</a+ > :: T1 -> <a href="#" title="Test"+ >T2</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Test"+ >T3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Test"+ >T4</a+ > <a href="#" title="Prelude"+ >Float</a+ > <a href="#" title="Prelude"+ >Float</a+ > -> <a href="#" title="Test"+ >T5</a+ > () ()</li+ ><li+ ><a href="#"+ >u</a+ >, <a href="#"+ >v</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ > }</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >R1</a+ > = <a href="#"+ >C3</a+ > {<ul class="subs"+ ><li+ ><a href="#"+ >s1</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li+ ><a href="#"+ >s2</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li+ ><a href="#"+ >s3</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ >}</li+ ><li class="src short"+ ><a href="#"+ >p</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >q</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <span class="keyword"+ >forall</span+ > a. a -> a</li+ ><li class="src short"+ ><a href="#"+ >u</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#" title="Test"+ >D</a+ > a => <a href="#"+ >C</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >a</a+ > :: <a href="#" title="System.IO"+ >IO</a+ > a</li+ ><li+ ><a href="#"+ >b</a+ > :: [a]</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >D</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >d</a+ > :: <a href="#" title="Test"+ >T</a+ > a b</li+ ><li+ ><a href="#"+ >e</a+ > :: (a, a)</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >E</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >F</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><a href="#"+ >ff</a+ > :: a</li+ ></ul+ ></li+ ><li class="src short"+ ><a href="#"+ >a</a+ > :: <a href="#" title="Test"+ >C</a+ > a => <a href="#" title="System.IO"+ >IO</a+ > a</li+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: <a href="#" title="Test"+ >C</a+ > a => a -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >g</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="System.IO"+ >IO</a+ > CInt</li+ ><li class="src short"+ ><a href="#"+ >hidden</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ >module <a href="#"+ >Visible</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Ex</a+ > a<ul class="subs"+ ><li+ >= <span class="keyword"+ >forall</span+ > b.<a href="#" title="Test"+ >C</a+ > b => <a href="#"+ >Ex1</a+ > b</li+ ><li+ >| <span class="keyword"+ >forall</span+ > b. <a href="#"+ >Ex2</a+ > b</li+ ><li+ >| <span class="keyword"+ >forall</span+ > b.<a href="#" title="Test"+ >C</a+ > a => <a href="#"+ >Ex3</a+ > b</li+ ><li+ >| <a href="#"+ >Ex4</a+ > (<span class="keyword"+ >forall</span+ > a. a -> a)</li+ ></ul+ ></li+ ><li class="src short"+ ><a href="#"+ >k</a+ > :: <a href="#" title="Test"+ >T</a+ > () () -> <a href="#" title="Test"+ >T2</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ > -> (<a href="#" title="Test"+ >T3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Test"+ >T4</a+ > <a href="#" title="Prelude"+ >Float</a+ > <a href="#" title="Prelude"+ >Float</a+ >) -> <a href="#" title="Test"+ >T5</a+ > () () -> <a href="#" title="System.IO"+ >IO</a+ > ()</li+ ><li class="src short"+ ><a href="#"+ >l</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ >, <a href="#" title="Data.Int"+ >Int</a+ >, <a href="#" title="Prelude"+ >Float</a+ >) -> <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >m</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <a href="#" title="Test"+ >N1</a+ > () -> <a href="#" title="System.IO"+ >IO</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >o</a+ > :: <a href="#" title="Prelude"+ >Float</a+ > -> <a href="#" title="System.IO"+ >IO</a+ > <a href="#" title="Prelude"+ >Float</a+ ></li+ ><li class="src short"+ ><a href="#"+ >f'</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >withType</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ><li class="src short"+ ><a href="#"+ >withoutType</a+ > :: a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><a href="#" id="g:1"+ ><h1+ >Type declarations</h1+ ></a+ ><a href="#" id="g:2"+ ><h2+ >Data types</h2+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T" class="def"+ >T</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This comment applies to the <em+ >following</em+ > declaration+ and it continues until the next non-comment line</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A" class="def"+ >A</a+ > <a href="#" title="Data.Int"+ >Int</a+ > (<a href="#" title="Data.Maybe"+ >Maybe</a+ > <a href="#" title="Prelude"+ >Float</a+ >)</td+ ><td class="doc"+ ><p+ >This comment describes the <code+ ><a href="#" title="Test"+ >A</a+ ></code+ > constructor</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B" class="def"+ >B</a+ > (<a href="#" title="Test"+ >T</a+ > a b, <a href="#" title="Test"+ >T</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Prelude"+ >Float</a+ >)</td+ ><td class="doc"+ ><p+ >This comment describes the <code+ ><a href="#" title="Test"+ >B</a+ ></code+ > constructor</p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T2" class="def"+ >T2</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >An abstract data declaration</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T3" class="def"+ >T3</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A data declaration with no documentation annotations on the constructors</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A1" class="def"+ >A1</a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B1" class="def"+ >B1</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T4" class="def"+ >T4</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A2" class="def"+ >A2</a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B2" class="def"+ >B2</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T5" class="def"+ >T5</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A3" class="def"+ >A3</a+ > a</td+ ><td class="doc"+ ><p+ >documents <code+ ><a href="#" title="Test"+ >A3</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B3" class="def"+ >B3</a+ > b</td+ ><td class="doc"+ ><p+ >documents <code+ ><a href="#" title="Test"+ >B3</a+ ></code+ ></p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:T6" class="def"+ >T6</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Testing alternative comment styles</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:A4" class="def"+ >A4</a+ ></td+ ><td class="doc"+ ><p+ >This is the doc for <code+ ><a href="#" title="Test"+ >A4</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:B4" class="def"+ >B4</a+ ></td+ ><td class="doc"+ ><p+ >This is the doc for <code+ ><a href="#" title="Test"+ >B4</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C4" class="def"+ >C4</a+ ></td+ ><td class="doc"+ ><p+ >This is the doc for <code+ ><a href="#" title="Test"+ >C4</a+ ></code+ ></p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N1" class="def"+ >N1</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A newtype</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N1" class="def"+ >N1</a+ > a</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N2" class="def"+ >N2</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A newtype with a fieldname</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N2" class="def"+ >N2</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:n" class="def"+ >n</a+ > :: a b</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N3" class="def"+ >N3</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A newtype with a fieldname, documentation on the field</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N3" class="def"+ >N3</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:n3" class="def"+ >n3</a+ > :: a b</dfn+ ><div class="doc"+ ><p+ >this is the <code+ ><a href="#" title="Test"+ >n3</a+ ></code+ > field</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:N4" class="def"+ >N4</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >An abstract newtype - we show this one as data rather than newtype because+ the difference isn't visible to the programmer for an abstract type.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N5" class="def"+ >N5</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N5" class="def"+ >N5</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:n5" class="def"+ >n5</a+ > :: a b</dfn+ ><div class="doc"+ ><p+ >no docs on the datatype or the constructor</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N6" class="def"+ >N6</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N6" class="def"+ >N6</a+ ></td+ ><td class="doc"+ ><p+ >docs on the constructor only</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:n6" class="def"+ >n6</a+ > :: a b</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:N7" class="def"+ >N7</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >docs on the newtype and the constructor</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:N7" class="def"+ >N7</a+ ></td+ ><td class="doc"+ ><p+ >The <code+ ><a href="#" title="Test"+ >N7</a+ ></code+ > constructor</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:n7" class="def"+ >n7</a+ > :: a b</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><a href="#" id="g:3"+ ><h2+ >Records</h2+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:R" class="def"+ >R</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This is the documentation for the <code+ ><a href="#" title="Test"+ >R</a+ ></code+ > record, which has four fields,+ <code+ ><a href="#" title="Test"+ >p</a+ ></code+ >, <code+ ><a href="#" title="Test"+ >q</a+ ></code+ >, <code+ ><a href="#" title="Test"+ >r</a+ ></code+ >, and <code+ ><a href="#" title="Test"+ >s</a+ ></code+ >.</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:C1" class="def"+ >C1</a+ ></td+ ><td class="doc"+ ><p+ >This is the <code+ ><a href="#" title="Test"+ >C1</a+ ></code+ > record constructor, with the following fields:</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:p" class="def"+ >p</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >This comment applies to the <code+ ><a href="#" title="Test"+ >p</a+ ></code+ > field</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:q" class="def"+ >q</a+ > :: <span class="keyword"+ >forall</span+ > a. a -> a</dfn+ ><div class="doc"+ ><p+ >This comment applies to the <code+ ><a href="#" title="Test"+ >q</a+ ></code+ > field</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:r" class="def"+ >r</a+ >, <a id="v:s" class="def"+ >s</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >This comment applies to both <code+ ><a href="#" title="Test"+ >r</a+ ></code+ > and <code+ ><a href="#" title="Test"+ >s</a+ ></code+ ></p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:C2" class="def"+ >C2</a+ ></td+ ><td class="doc"+ ><p+ >This is the <code+ ><a href="#" title="Test"+ >C2</a+ ></code+ > record constructor, also with some fields:</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:t" class="def"+ >t</a+ > :: T1 -> <a href="#" title="Test"+ >T2</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Test"+ >T3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Test"+ >T4</a+ > <a href="#" title="Prelude"+ >Float</a+ > <a href="#" title="Prelude"+ >Float</a+ > -> <a href="#" title="Test"+ >T5</a+ > () ()</dfn+ ><div class="doc empty"+ > </div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:u" class="def"+ >u</a+ >, <a id="v:v" class="def"+ >v</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:R1" class="def"+ >R1</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Testing different record commenting styles</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:C3" class="def"+ >C3</a+ ></td+ ><td class="doc"+ ><p+ >This is the <code+ ><a href="#" title="Test"+ >C3</a+ ></code+ > record constructor</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:s1" class="def"+ >s1</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >The <code+ ><a href="#" title="Test"+ >s1</a+ ></code+ > record selector</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:s2" class="def"+ >s2</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >The <code+ ><a href="#" title="Test"+ >s2</a+ ></code+ > record selector</p+ ></div+ ></li+ ><li+ ><dfn class="src"+ ><a id="v:s3" class="def"+ >s3</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></dfn+ ><div class="doc"+ ><p+ >The <code+ ><a href="#" title="Test"+ >s3</a+ ></code+ > record selector</p+ ></div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="doc"+ ><p+ >test that we can export record selectors on their own:</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:p" class="def"+ >p</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This comment applies to the <code+ ><a href="#" title="Test"+ >p</a+ ></code+ > field</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:q" class="def"+ >q</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <span class="keyword"+ >forall</span+ > a. a -> a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This comment applies to the <code+ ><a href="#" title="Test"+ >q</a+ ></code+ > field</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:u" class="def"+ >u</a+ > :: <a href="#" title="Test"+ >R</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:4"+ ><h1+ >Class declarations</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="#" title="Test"+ >D</a+ > a => <a id="t:C" class="def"+ >C</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This comment applies to the <em+ >previous</em+ > declaration (the <code+ ><a href="#" title="Test"+ >C</a+ ></code+ > class)</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:a" class="def"+ >a</a+ > :: <a href="#" title="System.IO"+ >IO</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >this is a description of the <code+ ><a href="#" title="Test"+ >a</a+ ></code+ > method</p+ ></div+ ><p class="src"+ ><a id="v:b" class="def"+ >b</a+ > :: [a] <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >this is a description of the <code+ ><a href="#" title="Test"+ >b</a+ ></code+ > method</p+ ></div+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:D" class="def"+ >D</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This is a class declaration with no separate docs for the methods</p+ ></div+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:d" class="def"+ >d</a+ > :: <a href="#" title="Test"+ >T</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a id="v:e" class="def"+ >e</a+ > :: (a, a) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:D"+ >Instances</h4+ ><details id="i:D" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:D:D:1"+ ></span+ > <a href="#" title="Test"+ >D</a+ > <a href="#" title="Prelude"+ >Float</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:D:D:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Test</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >d</a+ > :: <a href="#" title="Test"+ >T</a+ > <a href="#" title="Prelude"+ >Float</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >e</a+ > :: (<a href="#" title="Prelude"+ >Float</a+ >, <a href="#" title="Prelude"+ >Float</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:D:D:2"+ ></span+ > <a href="#" title="Test"+ >D</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:D:D:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >Test</a+ ></p+ > <div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a href="#"+ >d</a+ > :: <a href="#" title="Test"+ >T</a+ > <a href="#" title="Data.Int"+ >Int</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><a href="#"+ >e</a+ > :: (<a href="#" title="Data.Int"+ >Int</a+ >, <a href="#" title="Data.Int"+ >Int</a+ >) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:E" class="def"+ >E</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >This is a class declaration with no methods (or no methods exported)</p+ ></div+ ><div class="subs minimal"+ ><p class="caption"+ >Minimal complete definition</p+ ><p class="src"+ >ee</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:F" class="def"+ >F</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:ff" class="def"+ >ff</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ><div class="doc"+ ><p+ >Test that we can export a class method on its own:</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:a" class="def"+ >a</a+ > :: <a href="#" title="Test"+ >C</a+ > a => <a href="#" title="System.IO"+ >IO</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >this is a description of the <code+ ><a href="#" title="Test"+ >a</a+ ></code+ > method</p+ ></div+ ></div+ ><a href="#" id="g:5"+ ><h1+ >Function types</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: <a href="#" title="Test"+ >C</a+ > a => a -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >In a comment string we can refer to identifiers in scope with+single quotes like this: <code+ ><a href="#" title="Test"+ >T</a+ ></code+ >, and we can refer to modules by+using double quotes: <a href="#"+ >Foo</a+ >. We can add emphasis <em+ >like this</em+ >.</p+ ><ul+ ><li+ >This is a bulleted list</li+ ><li+ >This is the next item (different kind of bullet)</li+ ></ul+ ><ol+ ><li value="1"+ >This is an ordered list</li+ ><li value="2"+ >This is the next item (different kind of bullet)</li+ ></ol+ ><dl+ ><dt+ >cat</dt+ ><dd+ >a small, furry, domesticated mammal</dd+ ><dt+ >pineapple</dt+ ><dd+ >a fruit grown in the tropics</dd+ ></dl+ ><pre+ > This is a block of code, which can include other markup: <code+ ><a href="#" title="Test"+ >R</a+ ></code+ >+ formatting+ is+ significant+</pre+ ><pre+ >this is another block of code</pre+ ><p+ >We can also include URLs in documentation: <a href="#"+ >http://www.haskell.org/</a+ >.</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="System.IO"+ >IO</a+ > CInt <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >we can export foreign declarations too</p+ ></div+ ></div+ ><a href="#" id="g:6"+ ><h1+ >Auxiliary stuff</h1+ ></a+ ><div class="doc"+ ><p+ >This is some documentation that is attached to a name ($aux1)+ rather than a source declaration. The documentation may be+ referred to in the export list using its name.</p+ ><pre+ > code block in named doc</pre+ ></div+ ><div class="doc"+ ><p+ >This is some documentation that is attached to a name ($aux2)</p+ ></div+ ><div class="doc"+ ><pre+ > code block on its own in named doc</pre+ ></div+ ><div class="doc"+ ><pre+ > code block on its own in named doc (after newline)</pre+ ></div+ ><div class="doc"+ ><p+ >a nested, named doc comment</p+ ><p+ >with a paragraph,</p+ ><pre+ > and a code block</pre+ ></div+ ><div class="doc"+ ><pre+ >test+test1</pre+ ><pre+ > test2+ test3+</pre+ ></div+ ><div class="doc"+ ><pre+ >test1+test2+</pre+ ></div+ ><div class="doc"+ ><pre+ >test3+test4</pre+ ></div+ ><div class="doc"+ ><pre+ >test1+test2+</pre+ ><pre+ >test3+test4</pre+ ></div+ ><div class="doc"+ ><pre+ >test3+test4</pre+ ><pre+ >test1+test2+</pre+ ></div+ ><div class="doc"+ ><p+ >aux11:</p+ ><pre+ >test3+test4</pre+ ><pre+ >test1+test2+</pre+ ></div+ ><div class="doc"+ ><pre+ >foo</pre+ ><pre+ >bar</pre+ ></div+ ><div class="doc"+ ><p+ >This is some inline documentation in the export list</p+ ><pre+ >a code block using bird-tracks+each line must begin with > (which isn't significant unless it+is at the beginning of the line).</pre+ ></div+ ><a href="#" id="g:7"+ ><h1+ >A hidden module</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:hidden" class="def"+ >hidden</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:8"+ ><h1+ >A visible module</h1+ ></a+ ><div class="top"+ ><p class="src"+ >module <a href="#"+ >Visible</a+ ></p+ ></div+ ><div class="doc"+ ><p+ >nested-style doc comments </p+ ></div+ ><a href="#" id="g:9"+ ><h1+ >Existential / Universal types</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Ex" class="def"+ >Ex</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A data-type using existential/universal types</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><span class="keyword"+ >forall</span+ > b.<a href="#" title="Test"+ >C</a+ > b => <a id="v:Ex1" class="def"+ >Ex1</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >forall</span+ > b. <a id="v:Ex2" class="def"+ >Ex2</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><span class="keyword"+ >forall</span+ > b.<a href="#" title="Test"+ >C</a+ > a => <a id="v:Ex3" class="def"+ >Ex3</a+ > b</td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:Ex4" class="def"+ >Ex4</a+ > (<span class="keyword"+ >forall</span+ > a. a -> a)</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><a href="#" id="g:10"+ ><h1+ >Type signatures with argument docs</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:k" class="def"+ >k</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <a href="#" title="Test"+ >T</a+ > () ()</td+ ><td class="doc"+ ><p+ >This argument has type <code+ ><a href="#" title="Test"+ >T</a+ ></code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Test"+ >T2</a+ > <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc"+ ><p+ >This argument has type 'T2 Int Int'</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> (<a href="#" title="Test"+ >T3</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ > -> <a href="#" title="Test"+ >T4</a+ > <a href="#" title="Prelude"+ >Float</a+ > <a href="#" title="Prelude"+ >Float</a+ >)</td+ ><td class="doc"+ ><p+ >This argument has type <code+ >T3 Bool Bool -> T4 Float Float</code+ ></p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Test"+ >T5</a+ > () ()</td+ ><td class="doc"+ ><p+ >This argument has a very long description that should+ hopefully cause some wrapping to happen when it is finally+ rendered by Haddock in the generated HTML page.</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="System.IO"+ >IO</a+ > ()</td+ ><td class="doc"+ ><p+ >This is the result type</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >This is a function with documentation for each argument</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:l" class="def"+ >l</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: (<a href="#" title="Data.Int"+ >Int</a+ >, <a href="#" title="Data.Int"+ >Int</a+ >, <a href="#" title="Prelude"+ >Float</a+ >)</td+ ><td class="doc"+ ><p+ >takes a triple</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc"+ ><p+ >returns an <code+ ><a href="#" title="Data.Int"+ >Int</a+ ></code+ ></p+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:m" class="def"+ >m</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <a href="#" title="Test"+ >R</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="Test"+ >N1</a+ > ()</td+ ><td class="doc"+ ><p+ >one of the arguments</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="System.IO"+ >IO</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc"+ ><p+ >and the return value</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >This function has some arg docs</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:o" class="def"+ >o</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs arguments"+ ><p class="caption"+ >Arguments</p+ ><table+ ><tr+ ><td class="src"+ >:: <a href="#" title="Prelude"+ >Float</a+ ></td+ ><td class="doc"+ ><p+ >The input float</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ >-> <a href="#" title="System.IO"+ >IO</a+ > <a href="#" title="Prelude"+ >Float</a+ ></td+ ><td class="doc"+ ><p+ >The output float</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="doc"+ ><p+ >A foreign import with argument docs</p+ ></div+ ></div+ ><a href="#" id="g:11"+ ><h1+ >A section</h1+ ></a+ ><a href="#" id="g:12"+ ><h2+ >A subsection</h2+ ></a+ ><div class="doc"+ ><pre+ >a literal line</pre+ ><p+ >$ a non <em+ >literal</em+ > line $</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f-39-" class="def"+ >f'</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >a function with a prime can be referred to as <code+ ><a href="#" title="Test"+ >f'</a+ ></code+ >+ but f' doesn't get link'd 'f''</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:withType" class="def"+ >withType</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Comment on a definition with type signature</p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:withoutType" class="def"+ >withoutType</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Comment on a definition without type signature</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,99 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Threaded</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Threaded</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Ensures haddock built with <code+ >-threaded</code+ >.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ ><code+ >$(forkTH)</code+ > fails at compile time if haddock isn't using the+ threaded RTS.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,104 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Threaded_TH</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Threaded_TH</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Imported by <code+ >Threaded</code+ >, since a TH splice can't be used in the+ module where it is defined.</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >forkTH</a+ > :: <a href="#" title="Language.Haskell.TH.Syntax"+ >Q</a+ > <a href="#" title="Language.Haskell.TH.Syntax"+ >Exp</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:forkTH" class="def"+ >forkTH</a+ > :: <a href="#" title="Language.Haskell.TH.Syntax"+ >Q</a+ > <a href="#" title="Language.Haskell.TH.Syntax"+ >Exp</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >forkOS requires the threaded RTS, so this TH fails if haddock was+ built without <code+ >-threaded</code+ >.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Ticket112</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Ticket112</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >...given a raw <code+ ><a href="#" title="GHC.Exts"+ >Addr#</a+ ></code+ > to the string, and the length of the string.</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,84 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Ticket61</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Ticket61</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:C" class="def"+ >C</a+ > a <span class="keyword"+ >where</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs methods"+ ><p class="caption"+ >Methods</p+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A comment about f</p+ ></div+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,122 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Ticket75</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Ticket75</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > a <a href="#"+ >:-</a+ > b = <a href="#"+ >Q</a+ ></li+ ><li class="src short"+ ><a href="#"+ >f</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a id="t::-45-" class="def"+ >:-</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:Q" class="def"+ >Q</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A reference to <code+ ><a href="#" title="Ticket75"+ >:-</a+ ></code+ ></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,116 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TitledPicture</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TitledPicture</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >foo</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ><li class="src short"+ ><a href="#"+ >bar</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:foo" class="def"+ >foo</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Picture for <code+ ><a href="#" title="TitledPicture"+ >foo</a+ ></code+ > without a title <img src="bar"+ /></p+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:bar" class="def"+ >bar</a+ > :: <a href="#" title="Prelude"+ >Integer</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Picture for <code+ ><a href="#" title="TitledPicture"+ >bar</a+ ></code+ > with title <img src="un∣∁∘" title="δ∈"+ /></p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,1928 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TypeFamilies</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TypeFamilies</p+ ></div+ ><div id="description"+ ><p class="caption"+ >Description</p+ ><div class="doc"+ ><p+ >Doc for: module TypeFamilies</p+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >X</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >X</a+ ></li+ ><li+ >| <a href="#"+ >XX</a+ ></li+ ><li+ >| <a href="#"+ >XXX</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Y</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Z</a+ ><ul class="subs"+ ><li+ >= <a href="#"+ >ZA</a+ ></li+ ><li+ >| <a href="#"+ >ZB</a+ ></li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Test</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > <a href="#"+ >Foo</a+ > a :: k</li+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > <a href="#"+ >Bat</a+ > (a :: k) :: *</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > <a href="#"+ >Assoc</a+ > a <span class="keyword"+ >where</span+ ><ul class="subs"+ ><li+ ><span class="keyword"+ >data</span+ > <a href="#"+ >AssocD</a+ > a :: *</li+ ><li+ ><span class="keyword"+ >type</span+ > <a href="#"+ >AssocT</a+ > a :: *</li+ ></ul+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > <a href="#"+ >Bar</a+ > b <span class="keyword"+ >where ...</span+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > (a :: k) <a href="#"+ ><></a+ > (b :: k) :: k</li+ ><li class="src short"+ ><span class="keyword"+ >class</span+ > (a :: k) <a href="#"+ >><</a+ > (b :: k)</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: data X</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:X" class="def"+ >X</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: X</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:XX" class="def"+ >XX</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: XX</p+ ></td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:XXX" class="def"+ >XXX</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: XXX</p+ ></td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:X"+ >Instances</h4+ ><details id="i:X" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Assoc:1"+ ></span+ > <a href="#" title="TypeFamilies"+ >Assoc</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Assoc X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Assoc:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Test:2"+ ></span+ > <a href="#" title="TypeFamilies"+ >Test</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Test X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Test:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:-62--60-:3"+ ></span+ > '<a href="#" title="TypeFamilies"+ >XX</a+ > <a href="#" title="TypeFamilies"+ >><</a+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:-62--60-:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Foo:4"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >External instance</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Foo:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:AssocD:5"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:AssocD:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a id="v:AssocX" class="def"+ >AssocX</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:AssocT:6"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:AssocT:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > :: <a href="#" title="Data.Kind"+ >Type</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Bat:7"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Bat:7"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <ul class="inst"+ ><li class="inst"+ >= <a id="v:BatX" class="def"+ >BatX</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></li+ ><li class="inst"+ >| <a id="v:BatXX" class="def"+ >BatXX</a+ > { <ul class="subs"+ ><li+ ><a id="v:aaa" class="def"+ >aaa</a+ > :: <a href="#" title="TypeFamilies"+ >X</a+ ></li+ ><li+ ><a id="v:bbb" class="def"+ >bbb</a+ > :: <a href="#" title="TypeFamilies"+ >Y</a+ ></li+ ></ul+ > }</li+ ></ul+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:Foo:8"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: type instance Foo X = Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:Foo:8"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:-60--62-:9"+ ></span+ > <span class="keyword"+ >type</span+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > '<a href="#" title="TypeFamilies"+ >XX</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:-60--62-:9"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > '<a href="#" title="TypeFamilies"+ >XX</a+ > = '<a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:X:-60--62-:10"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:X:-60--62-:10"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >) = <a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Y" class="def"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: data Y</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Y"+ >Instances</h4+ ><details id="i:Y" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:Assoc:1"+ ></span+ > <a href="#" title="TypeFamilies"+ >Assoc</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Assoc Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:Assoc:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:Test:2"+ ></span+ > <a href="#" title="TypeFamilies"+ >Test</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Test Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:Test:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:Bar:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:Bar:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:AssocD:4"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:AssocD:4"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a id="v:AssocY" class="def"+ >AssocY</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:AssocT:5"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:AssocT:5"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:Bat:6"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:Bat:6"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a id="v:BatY" class="def"+ >BatY</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:Foo:7"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: type instance Foo Y = X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:Foo:7"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Y:-60--62-:8"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Y:-60--62-:8"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >) = a</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Z" class="def"+ >Z</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: data Z</p+ ></div+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:ZA" class="def"+ >ZA</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a id="v:ZB" class="def"+ >ZB</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Z"+ >Instances</h4+ ><details id="i:Z" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Z:Bat:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > (z :: <a href="#" title="TypeFamilies"+ >Z</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat Z</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:Z:Bat:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > (z :: <a href="#" title="TypeFamilies"+ >Z</a+ >) <span class="keyword"+ >where</span+ ><ul class="inst"+ ><li class="inst"+ ><a id="v:BatZ1" class="def"+ >BatZ1</a+ > :: <a href="#" title="TypeFamilies"+ >Z</a+ > -> <a href="#" title="TypeFamilies"+ >Bat</a+ > '<a href="#" title="TypeFamilies"+ >ZA</a+ ></li+ ><li class="inst"+ ><a id="v:BatZ2" class="def"+ >BatZ2</a+ > :: {..} -> <a href="#" title="TypeFamilies"+ >Bat</a+ > '<a href="#" title="TypeFamilies"+ >ZB</a+ ></li+ ></ul+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Test" class="def"+ >Test</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: class Test a</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Test"+ >Instances</h4+ ><details id="i:Test" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Test:Test:1"+ ></span+ > <a href="#" title="TypeFamilies"+ >Test</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Test X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Test:Test:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Test:Test:2"+ ></span+ > <a href="#" title="TypeFamilies"+ >Test</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Test Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Test:Test:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a :: k <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: type family Foo a</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo:Foo:1"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: type instance Foo X = Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo:Foo:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: type instance Foo Y = X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo:Foo:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Bat" class="def"+ >Bat</a+ > (a :: k) :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: data family Bat a</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bat"+ >Instances</h4+ ><details id="i:Bat" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bat:Bat:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > (z :: <a href="#" title="TypeFamilies"+ >Z</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat Z</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bat:Bat:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > (z :: <a href="#" title="TypeFamilies"+ >Z</a+ >) <span class="keyword"+ >where</span+ ><ul class="inst"+ ><li class="inst"+ ><a id="v:BatZ1" class="def"+ >BatZ1</a+ > :: <a href="#" title="TypeFamilies"+ >Z</a+ > -> <a href="#" title="TypeFamilies"+ >Bat</a+ > '<a href="#" title="TypeFamilies"+ >ZA</a+ ></li+ ><li class="inst"+ ><a id="v:BatZ2" class="def"+ >BatZ2</a+ > :: {..} -> <a href="#" title="TypeFamilies"+ >Bat</a+ > '<a href="#" title="TypeFamilies"+ >ZB</a+ ></li+ ></ul+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bat:Bat:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bat:Bat:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <ul class="inst"+ ><li class="inst"+ >= <a id="v:BatX" class="def"+ >BatX</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></li+ ><li class="inst"+ >| <a id="v:BatXX" class="def"+ >BatXX</a+ > { <ul class="subs"+ ><li+ ><a id="v:aaa" class="def"+ >aaa</a+ > :: <a href="#" title="TypeFamilies"+ >X</a+ ></li+ ><li+ ><a id="v:bbb" class="def"+ >bbb</a+ > :: <a href="#" title="TypeFamilies"+ >Y</a+ ></li+ ></ul+ > }</li+ ></ul+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bat:Bat:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: data instance Bat Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bat:Bat:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >Bat</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > = <a id="v:BatY" class="def"+ >BatY</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a id="t:Assoc" class="def"+ >Assoc</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: class Assoc a</p+ ></div+ ><div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:AssocD" class="def"+ >AssocD</a+ > a :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: data AssocD a</p+ ></div+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a id="t:AssocT" class="def"+ >AssocT</a+ > a :: * <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: type AssocT a</p+ ></div+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Assoc"+ >Instances</h4+ ><details id="i:Assoc" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Assoc:Assoc:1"+ ></span+ > <a href="#" title="TypeFamilies"+ >Assoc</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Assoc X</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Assoc:Assoc:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:Assoc:Assoc:2"+ ></span+ > <a href="#" title="TypeFamilies"+ >Assoc</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Doc for: instance Assoc Y</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:Assoc:Assoc:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="subs associated-types"+ ><p class="caption"+ >Associated Types</p+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies"+ >AssocD</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >AssocT</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > b <span class="keyword"+ >where ...</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Doc for: type family Bar b</p+ ></div+ ><div class="subs equations"+ ><p class="caption"+ >Equations</p+ ><table+ ><tr+ ><td class="src"+ ><a href="#" title="TypeFamilies"+ >Bar</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >X</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a href="#" title="TypeFamilies"+ >Bar</a+ > y = <a href="#" title="TypeFamilies"+ >Y</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > (a :: k) <a id="t:-60--62-" class="def"+ ><></a+ > (b :: k) :: k <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:-60--62-"+ >Instances</h4+ ><details id="i:-60--62-" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:-60--62-:-60--62-:1"+ ></span+ > <span class="keyword"+ >type</span+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > '<a href="#" title="TypeFamilies"+ >XX</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:-60--62-:-60--62-:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > '<a href="#" title="TypeFamilies"+ >XX</a+ > = '<a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:-60--62-:-60--62-:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:-60--62-:-60--62-:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >X</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >) = <a href="#" title="TypeFamilies"+ >X</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:-60--62-:-60--62-:3"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >)</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:-60--62-:-60--62-:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies"+ >Y</a+ > <a href="#" title="TypeFamilies"+ ><></a+ > (a :: <a href="#" title="Data.Kind"+ >Type</a+ >) = a</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > (a :: k) <a id="t:-62--60-" class="def"+ >><</a+ > (b :: k) <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:-62--60-"+ >Instances</h4+ ><details id="i:-62--60-" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:ic:-62--60-:-62--60-:1"+ ></span+ > '<a href="#" title="TypeFamilies"+ >XX</a+ > <a href="#" title="TypeFamilies"+ >><</a+ > '<a href="#" title="TypeFamilies"+ >XXX</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:ic:-62--60-:-62--60-:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,400 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TypeFamilies2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TypeFamilies2</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >W</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > <a href="#"+ >Foo</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > <a href="#"+ >Bar</a+ > a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:W" class="def"+ >W</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Exported type</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:W"+ >Instances</h4+ ><details id="i:W" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:W:Bar:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Shown because BarX is still exported despite Z being hidden</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:W:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies2</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ > = <a id="v:BarX" class="def"+ >BarX</a+ > Z</div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:W:Foo:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible, but with a hidden right hand side</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:id:W:Foo:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies2</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Exported type family</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Foo"+ >Instances</h4+ ><details id="i:Foo" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo:Foo:1"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >External instance</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo:Foo:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies"+ >X</a+ > = <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Foo:Foo:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Should be visible, but with a hidden right hand side</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Foo:Foo:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies2</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies2"+ >Foo</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >Exported data family</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bar:Bar:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bar:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies"+ >Y</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bar:Bar:2"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc"+ ><p+ >Shown because BarX is still exported despite Z being hidden</p+ ></td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bar:Bar:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies2</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies2"+ >Bar</a+ > <a href="#" title="TypeFamilies2"+ >W</a+ > = <a id="v:BarX" class="def"+ >BarX</a+ > Z</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,368 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TypeFamilies3</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TypeFamilies3</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > <a href="#"+ >Foo</a+ > a <span class="keyword"+ >where ...</span+ ></li+ ><li class="src short"+ ><span class="keyword"+ >type family</span+ > <a href="#"+ >Bar</a+ > a</li+ ><li class="src short"+ ><span class="keyword"+ >data family</span+ > <a href="#"+ >Baz</a+ > a</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a id="t:Foo" class="def"+ >Foo</a+ > a <span class="keyword"+ >where ...</span+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A closed type family</p+ ></div+ ><div class="subs equations"+ ><p class="caption"+ >Equations</p+ ><table+ ><tr+ ><td class="src"+ ><a href="#" title="TypeFamilies3"+ >Foo</a+ > () = <a href="#" title="Data.Int"+ >Int</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td class="src"+ ><a href="#" title="TypeFamilies3"+ >Foo</a+ > _ = ()</td+ ><td class="doc empty"+ > </td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a id="t:Bar" class="def"+ >Bar</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >An open family</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Bar"+ >Instances</h4+ ><details id="i:Bar" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bar:Bar:1"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies3"+ >Bar</a+ > ()</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bar:Bar:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies3</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies3"+ >Bar</a+ > () = <a href="#" title="Data.Int"+ >Int</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Bar:Bar:2"+ ></span+ > <span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies3"+ >Bar</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Bar:Bar:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies3</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >type</span+ > <a href="#" title="TypeFamilies3"+ >Bar</a+ > <a href="#" title="Data.Int"+ >Int</a+ > = ()</div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a id="t:Baz" class="def"+ >Baz</a+ > a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >A data family</p+ ></div+ ><div class="subs instances"+ ><h4 class="instances details-toggle-control details-toggle" data-details-id="i:Baz"+ >Instances</h4+ ><details id="i:Baz" open="open"+ ><summary class="hide-when-js-enabled"+ >Instances details</summary+ ><table+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Baz:Baz:1"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > ()</span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Baz:Baz:1"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies3</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > () = <a id="v:Baz1" class="def"+ >Baz1</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Baz:Baz:2"+ ></span+ > <span class="keyword"+ >newtype</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > <a href="#" title="Prelude"+ >Double</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Baz:Baz:2"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies3</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >newtype</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > <a href="#" title="Prelude"+ >Double</a+ > = <a id="v:Baz3" class="def"+ >Baz3</a+ > <a href="#" title="Prelude"+ >Float</a+ ></div+ ></details+ ></td+ ></tr+ ><tr+ ><td class="src clearfix"+ ><span class="inst-left"+ ><span class="instance details-toggle-control details-toggle" data-details-id="i:if:Baz:Baz:3"+ ></span+ > <span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > <a href="#" title="Data.Int"+ >Int</a+ ></span+ > <a href="#" class="selflink"+ >#</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><details id="i:if:Baz:Baz:3"+ ><summary class="hide-when-js-enabled"+ >Instance details</summary+ ><p+ >Defined in <a href="#"+ >TypeFamilies3</a+ ></p+ > <div class="src"+ ><span class="keyword"+ >data</span+ > <a href="#" title="TypeFamilies3"+ >Baz</a+ > <a href="#" title="Data.Int"+ >Int</a+ > = <a id="v:Baz2" class="def"+ >Baz2</a+ > <a href="#" title="Data.Bool"+ >Bool</a+ ></div+ ></details+ ></td+ ></tr+ ></table+ ></details+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,200 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >TypeOperators</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >TypeOperators</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a id="t::-45-:" class="def"+ >:-:</a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > (a <a id="t::-43-:" class="def"+ >:+:</a+ > b) c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Op" class="def"+ >Op</a+ > a b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >newtype</span+ > <a id="t:O" class="def"+ >O</a+ > g f a <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="subs constructors"+ ><p class="caption"+ >Constructors</p+ ><table+ ><tr+ ><td class="src"+ ><a id="v:O" class="def"+ >O</a+ ></td+ ><td class="doc empty"+ > </td+ ></tr+ ><tr+ ><td colspan="2"+ ><div class="subs fields"+ ><p class="caption"+ >Fields</p+ ><ul+ ><li+ ><dfn class="src"+ ><a id="v:unO" class="def"+ >unO</a+ > :: g (f a)</dfn+ ><div class="doc empty"+ > </div+ ></li+ ></ul+ ></div+ ></td+ ></tr+ ></table+ ></div+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > a <a id="t:-60--61--62-" class="def"+ ><=></a+ > b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:biO" class="def"+ >biO</a+ > :: (g <a href="#" title="TypeOperators"+ >`O`</a+ > f) a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:f" class="def"+ >f</a+ > :: a <a href="#" title="Data.Type.Equality"+ >~</a+ > b => a -> b <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:g" class="def"+ >g</a+ > :: (a <a href="#" title="Data.Type.Equality"+ >~</a+ > b, b <a href="#" title="Data.Type.Equality"+ >~</a+ > c) => a -> c <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: (a <a href="#" title="TypeOperators"+ >:-:</a+ > a) <a href="#" title="TypeOperators"+ ><=></a+ > (a <a href="#" title="TypeOperators"+ >`Op`</a+ > a) => a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:y" class="def"+ >y</a+ > :: (a <a href="#" title="TypeOperators"+ ><=></a+ > a, (a <a href="#" title="TypeOperators"+ >`Op`</a+ > a) <a href="#" title="TypeOperators"+ ><=></a+ > a) => a <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,206 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >UnboxedStuff</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >UnboxedStuff</p+ ></div+ ><div id="table-of-contents"+ ><div id="contents-list"+ ><p class="caption" onclick="window.scrollTo(0,0)"+ >Contents</p+ ><ul+ ><li+ ><a href="#"+ >Unboxed type constructors</a+ ></li+ ></ul+ ></div+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >X</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Y</a+ ></li+ ><li class="src short"+ ><span class="keyword"+ >data</span+ > <a href="#"+ >Z</a+ ></li+ ><li class="src short"+ ><a href="#"+ >unboxedUnit</a+ > :: (# #) -> (# #)</li+ ><li class="src short"+ ><a href="#"+ >unboxedTuple</a+ > :: (# <a href="#" title="UnboxedStuff"+ >X</a+ >, <a href="#" title="UnboxedStuff"+ >Y</a+ > #) -> (# <a href="#" title="UnboxedStuff"+ >X</a+ >, <a href="#" title="UnboxedStuff"+ >Y</a+ >, <a href="#" title="UnboxedStuff"+ >Z</a+ > #)</li+ ><li class="src short"+ ><a href="#"+ >unboxedSum</a+ > :: (# <a href="#" title="UnboxedStuff"+ >X</a+ > | <a href="#" title="UnboxedStuff"+ >Y</a+ > #) -> (# <a href="#" title="UnboxedStuff"+ >X</a+ > | <a href="#" title="UnboxedStuff"+ >Y</a+ > | <a href="#" title="UnboxedStuff"+ >Z</a+ > #)</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:X" class="def"+ >X</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Y" class="def"+ >Y</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a id="t:Z" class="def"+ >Z</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><a href="#" id="g:1"+ ><h1+ >Unboxed type constructors</h1+ ></a+ ><div class="top"+ ><p class="src"+ ><a id="v:unboxedUnit" class="def"+ >unboxedUnit</a+ > :: (# #) -> (# #) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:unboxedTuple" class="def"+ >unboxedTuple</a+ > :: (# <a href="#" title="UnboxedStuff"+ >X</a+ >, <a href="#" title="UnboxedStuff"+ >Y</a+ > #) -> (# <a href="#" title="UnboxedStuff"+ >X</a+ >, <a href="#" title="UnboxedStuff"+ >Y</a+ >, <a href="#" title="UnboxedStuff"+ >Z</a+ > #) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a id="v:unboxedSum" class="def"+ >unboxedSum</a+ > :: (# <a href="#" title="UnboxedStuff"+ >X</a+ > | <a href="#" title="UnboxedStuff"+ >Y</a+ > #) -> (# <a href="#" title="UnboxedStuff"+ >X</a+ > | <a href="#" title="UnboxedStuff"+ >Y</a+ > | <a href="#" title="UnboxedStuff"+ >Z</a+ > #) <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,86 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Unicode</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Unicode</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >x</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ ></li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:x" class="def"+ >x</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >γλώσσα</p+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,108 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Unicode2</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Unicode2</p+ ></div+ ><div id="synopsis"+ ><details id="syn"+ ><summary+ >Synopsis</summary+ ><ul class="details-toggle" data-details-id="syn"+ ><li class="src short"+ ><a href="#"+ >ü</a+ > :: ()</li+ ></ul+ ></details+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:-252-" class="def"+ >ü</a+ > :: () <a href="#" class="selflink"+ >#</a+ ></p+ ><div class="doc"+ ><p+ >All of the following work with a unicode character ü:</p+ ><ul+ ><li+ >an italicized <em+ >ü</em+ ></li+ ><li+ >inline code <code+ >ü</code+ ></li+ ><li+ >a code block:</li+ ></ul+ ><pre+ >ü</pre+ ><ul+ ><li+ >a url <a href="#"+ >https://www.google.com/search?q=ü</a+ ></li+ ><li+ >a link to <code+ ><a href="#" title="Unicode2"+ >ü</a+ ></code+ ></li+ ></ul+ ></div+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,70 @@+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><meta name="viewport" content="width=device-width, initial-scale=1"+ /><title+ >Visible</title+ ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"+ /><link rel="stylesheet" type="text/css" href="#"+ /><link rel="stylesheet" type="text/css" href="#"+ /><script src="haddock-bundle.min.js" async="async" type="text/javascript"+ ></script+ ><script type="text/x-mathjax-config"+ >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ></head+ ><body+ ><div id="package-header"+ ><span class="caption empty"+ > </span+ ><ul class="links" id="page-menu"+ ><li+ ><a href="#"+ >Contents</a+ ></li+ ><li+ ><a href="#"+ >Index</a+ ></li+ ></ul+ ></div+ ><div id="content"+ ><div id="module-header"+ ><table class="info"+ ><tr+ ><th+ >Safe Haskell</th+ ><td+ >Safe-Inferred</td+ ></tr+ ><tr+ ><th+ >Language</th+ ><td+ >Haskell2010</td+ ></tr+ ></table+ ><p class="caption"+ >Visible</p+ ></div+ ><div id="interface"+ ><h1+ >Documentation</h1+ ><div class="top"+ ><p class="src"+ ><a id="v:visible" class="def"+ >visible</a+ > :: <a href="#" title="Data.Int"+ >Int</a+ > -> <a href="#" title="Data.Int"+ >Int</a+ > <a href="#" class="selflink"+ >#</a+ ></p+ ></div+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,61 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >A</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >A</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >A</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >other</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >test2</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >X</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >reExport</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >AdvanceTypes</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >AdvanceTypes</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Pattern</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,47 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >B</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >B</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >test</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >reExport</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >X</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug1</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug1</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug2</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug2</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >x</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug3</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug3</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug4</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug4</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,67 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug6</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug6</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >A</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >B</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >C</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >D</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >E</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug7</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug7</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >Bar</a+ > x y</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,65 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bug8</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bug8</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Typ</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >(-->)</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >(--->)</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >s</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >t</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >main</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,63 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >BugDeprecated</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >BugDeprecated</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >baz</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >one</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >two</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >three</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,75 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >BugExportHeadings</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >BugExportHeadings</p+ ></div+ ><div id="interface"+ ><h1+ >Foo</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><h1+ >Bar</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ><h1+ >Baz</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >baz</a+ ></p+ ></div+ ><h1+ >One</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >one</a+ ></p+ ></div+ ><h1+ >Two</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >two</a+ ></p+ ></div+ ><h1+ >Three</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >three</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Bugs</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Bugs</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >A</a+ > a</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,45 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >CrossPackageDocs</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >CrossPackageDocs</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >map</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >IsString</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >runInteractiveProcess</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedClass</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedClass</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >SomeClass</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >SomeOtherClass</a+ > a</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedData</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedData</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >One</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,39 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedFunction</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedFunction</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedFunction2</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedFunction2</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedFunction3</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedFunction3</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedModule</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedModule</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedModule2</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedModule2</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedNewtype</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedNewtype</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >SomeNewType</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >SomeOtherNewType</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,37 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedReExport</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedReExport</p+ ></div+ ><div id="interface"+ ><h1+ >Re-exported from an other module</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><h1+ >Re-exported from an other package</h1+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedRecord</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedRecord</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedTypeFamily</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedTypeFamily</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a href=""+ >SomeTypeFamily</a+ > k :: * -> *</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a href=""+ >SomeOtherTypeFamily</a+ > k :: * -> *</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >DeprecatedTypeSynonym</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >DeprecatedTypeSynonym</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="" target="main"+ >TypeSyn</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type</span+ > <a href="" target="main"+ >OtherTypeSyn</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Examples</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Examples</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >fib</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,57 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >FunArgs</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >FunArgs</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >g</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >h</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >i</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >j</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >GADTRecords</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >GADTRecords</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >H1</a+ > a b</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,73 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Hash</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Hash</p+ ></div+ ><div id="interface"+ ><h1+ >The <code+ >HashTable</code+ > type</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >HashTable</a+ > key val</p+ ></div+ ><h2+ >Operations on <code+ >HashTable</code+ >s</h2+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >new</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >insert</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >lookup</a+ ></p+ ></div+ ><h1+ >The <code+ >Hash</code+ > class</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >Hash</a+ > a</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >HiddenInstances</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >HiddenInstances</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >VisibleClass</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >VisibleData</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,43 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >HiddenInstancesB</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >HiddenInstancesB</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >Foo</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Bar</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Hyperlinks</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Hyperlinks</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,39 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >IgnoreExports</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >IgnoreExports</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Math</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Math</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >ModuleWithWarning</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >ModuleWithWarning</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,27 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >NamedDoc</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >NamedDoc</p+ ></div+ ><div id="interface"+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >NoLayout</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >NoLayout</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >g</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >NonGreedy</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >NonGreedy</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Properties</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Properties</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >fib</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,27 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >PruneWithWarning</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >PruneWithWarning</p+ ></div+ ><div id="interface"+ ></div+ ></body+ ></html+>
@@ -0,0 +1,61 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >QuasiExpr</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >QuasiExpr</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Expr</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >BinOp</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >eval</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >expr</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >parseExprExp</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >QuasiQuote</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >QuasiQuote</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >val</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >SpuriousSuperclassConstraints</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >SpuriousSuperclassConstraints</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >SomeType</a+ > f a</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >TH</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >TH</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >decl</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >TH2</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >TH2</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,259 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Test</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Test</p+ ></div+ ><div id="interface"+ ><h1+ >Type declarations</h1+ ><h2+ >Data types</h2+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T2</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T3</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T4</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T5</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >T6</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N1</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N2</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N3</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N4</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N5</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N6</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >N7</a+ > a b</p+ ></div+ ><h2+ >Records</h2+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >R</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >R1</a+ ></p+ ></div+ ><h1+ >Class declarations</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >C</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >D</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >E</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >F</a+ > a</p+ ></div+ ><h1+ >Function types</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ><h1+ >Auxiliary stuff</h1+ ><h1+ >A hidden module</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >hidden</a+ ></p+ ></div+ ><h1+ >A visible module</h1+ ><h1+ >Existential / Universal types</h1+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Ex</a+ > a</p+ ></div+ ><h1+ >Type signatures with argument docs</h1+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >k</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >l</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >m</a+ ></p+ ></div+ ><h1+ >A section</h1+ ><h2+ >A subsection</h2+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f'</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >withType</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >withoutType</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Ticket112</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Ticket112</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,31 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Ticket253_1</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Ticket253_1</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,39 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Ticket253_2</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Ticket253_2</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Baz</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,35 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Ticket61</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Ticket61</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >C</a+ > a</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,41 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Ticket75</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Ticket75</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a href="" target="main"+ >:-</a+ > b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,39 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >TitledPicture</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >TitledPicture</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >foo</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >bar</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,107 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >TypeFamilies</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >TypeFamilies</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >X</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Y</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Z</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >Test</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a href=""+ >Foo</a+ > a :: k</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data family</span+ > <a href=""+ >Bat</a+ > a :: *</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > <a href="" target="main"+ >Assoc</a+ > a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > <a href=""+ >Bar</a+ > b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >type family</span+ > a <a href=""+ ><></a+ > b :: k</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > a <a href="" target="main"+ >><</a+ > b</p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,97 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >TypeOperators</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >TypeOperators</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > a <a href="" target="main"+ >:-:</a+ > b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > (a <a href="" target="main"+ >:+:</a+ > b) c</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >Op</a+ > a b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >data</span+ > <a href="" target="main"+ >O</a+ > g f a</p+ ></div+ ><div class="top"+ ><p class="src"+ ><span class="keyword"+ >class</span+ > a <a href="" target="main"+ ><=></a+ > b</p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >biO</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >f</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >g</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >x</a+ ></p+ ></div+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >y</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Unicode</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Unicode</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >x</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,33 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">+<html xmlns="http://www.w3.org/1999/xhtml"+><head+ ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"+ /><title+ >Visible</title+ ><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean"+ /><script src="haddock-util.js" type="text/javascript"+ ></script+ ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"+ ></script+ ><script type="text/javascript"+ >//<![CDATA[+window.onload = function () {pageLoad();};+//]]>+</script+ ></head+ ><body id="mini"+ ><div id="module-header"+ ><p class="caption"+ >Visible</p+ ></div+ ><div id="interface"+ ><div class="top"+ ><p class="src"+ ><a href="" target="main"+ >visible</a+ ></p+ ></div+ ></div+ ></body+ ></html+>
@@ -0,0 +1,18 @@+{-# LANGUAGE Haskell2010 #-}+module A where++data A = A++other :: Int+other = 2++-- | Doc for test2+test2 :: Bool+test2 = False++-- | Should show up on the page for both modules A and B+data X = X -- ^ Doc for consructor++-- | Should show up on the page for both modules A and B+reExport :: Int+reExport = 1
@@ -0,0 +1,9 @@+{-# LANGUAGE Haskell2010 #-}+module B ( module A, test, reExport, X(..) ) where+import A ( A(..), test2, reExport, X(..) )++-- | This link shouldn't work: 'other'.+-- These links should work: 'A.other', 'Data.List.sortBy', 'test2', 'A.test2', 'Data.Maybe.fromMaybe'.+-- Module link: "Prelude".+test :: Int+test = 1
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module Bold where+-- | Some __bold text__.+--+-- * __Bold__ in a list+--+-- [__bold in a definition__] list+--+-- @ bold __in__ a __code__ block @+foo = undefined
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module Bug1 where++-- | We should have different anchors for constructors and types\/classes. This+-- hyperlink should point to the type constructor by default: 'T'.+data T = T+
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module Bug1004 (Product(..)) where++import Data.Functor.Product
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE StandaloneDeriving #-}++module Bug1033 where++import GHC.Generics++data Foo = Foo++-- | This does some generic foos.+deriving instance Generic Foo
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module Bug1035 where++data Foo = Bar++data Bar = Foo++-- | A link to 'Bar'+foo :: ()+foo = ()
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-}+module Bug1050 where++import Data.Kind++newtype T :: (forall k. k -> Type) -> (forall k. k -> Type) where+ MkT :: forall (f :: forall k. k -> Type) k (a :: k). f a -> T f a++mkT = MkT
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+module Bug1054 where++-- * Header with 'foo' link++foo = ()
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE QuantifiedConstraints #-}+{-# LANGUAGE UndecidableInstances #-}+module Bug1063 where++class (c => d) => Implies c d+instance (c => d) => Implies c d
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+{-# language PatternSynonyms #-}+module Bug1067A ( Foo(P) ) where++-- | A foo+data Foo = Foo++-- | A pattern+pattern P :: Foo+pattern P = Foo
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+{-# language PatternSynonyms #-}+module Bug1067B ( pattern P ) where++import Bug1067A
@@ -0,0 +1,25 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeFamilies #-}+module Bug1103 where++import Data.Kind++data family Foo1 :: Type -> Type+data instance Foo1 Bool = Foo1Bool+data instance Foo1 (Maybe a)++data family Foo2 :: k -> Type+data instance Foo2 Bool = Foo2Bool+data instance Foo2 (Maybe a)+data instance Foo2 :: Char -> Type+data instance Foo2 :: (Char -> Char) -> Type where++data family Foo3 :: k+data instance Foo3+data instance Foo3 Bool = Foo3Bool+data instance Foo3 (Maybe a)+data instance Foo3 :: Char -> Type+data instance Foo3 :: (Char -> Char) -> Type where
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+module Bug195 where++data T = A { someField :: () -- ^ Doc for someField of A+ , someOtherField :: () -- ^ Doc for someOtherField of A+ }+ | B { someField :: () -- ^ Doc for someField of B+ , someOtherField :: () -- ^ Doc for someOtherField of B+ }+ | C { someField :: () -- ^ Doc for someField of C+ , someOtherField :: () -- ^ Doc for someOtherField of C+ }
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+module Bug2 ( x ) where+import B+x :: A+x = A
@@ -0,0 +1,29 @@+{-# LANGUAGE Haskell2010 #-}+-- We test that leading whitespace gets properly dropped (or not!)+-- from codeblocks+module Bug201 where++-- |+-- @+-- This leading whitespace+-- should be dropped+-- @+f :: ()+f = ()++{-|+@+ But this one+ should not+@++> this should+> be dropped++@+ and so should this+ because there's a space before closing @+ @+-}+g :: ()+g = ()
@@ -0,0 +1,11 @@+{-# LANGUAGE Haskell2010 #-}+-- | This module tests that if we're trying to link to a /qualified/+-- identifier that's not in scope, we get an anchor as if it was a+-- variable. Previous behaviour was to treat it as a type constructor+-- so issue like #253 arose. Also see @rename@ function comments in+-- source.+module Bug253 where++-- | This link should generate @#v@ anchor: 'DoesNotExist.fakeFakeFake'+foo :: ()+foo = ()
@@ -0,0 +1,30 @@+{-# LANGUAGE Haskell2010 #-}+-- | This module tests the ‘@since …’ annotation.+--+-- @since 1.2.3+module Bug26 where++-- | Foo+--+-- @since 2.10.7+--+-- @since 2.10.8+f :: ()+f = ()++-- | Bar+g :: ()+g = ()++-- | Class+--+-- @since 1.0+class C a where+ -- | @since 1.2.3+ c_f :: a++-- | instance for ()+--+-- @since 0.7.8+instance C () where+ c_f = ()
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+{-|+Copyright: Foo,+ Bar,+ Baz++The module description+-}+-- The module header can start with newlines. They are not taken into account for the indentation level+module Bug280 where++x = ""
@@ -0,0 +1,38 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies, FlexibleInstances, GADTs #-}+-- This tests that we are able to extract record selectors for+-- associated types when the type itself is not exported. Making this+-- bug exhibit is very simple: simply mention a record field defined+-- inside of the associated type anywhere in the export list.+--+-- Note: ProblemCtor only shows up when T or A are exported but PolyCtor+-- only shows up when the class is exported as well, since it's polymorphic.+module Bug294 ( A, problemField, problemField', gadtField+ , TP(ProblemCtor), DP(ProblemCtor'), TO'(PolyCtor)) where++data A++class T t where+ data TO t :: *+ data TP t :: *++ t :: t++instance T A where+ data TO A = TA { problemField :: A }+ data TP A = ProblemCtor A++data family DO t :: *+data family DP t :: *++data instance DO A = DA { problemField' :: A }+data instance DP A = ProblemCtor' A++data GADT :: * -> * where+ Ctor :: { gadtField :: A } -> GADT A++class T' t where+ data TO' t :: *++instance T' a where+ data TO' a = PolyCtor
@@ -0,0 +1,23 @@+{-# LANGUAGE Haskell2010 #-}+-- We introduced a regression in 2.14.x where we don't consider+-- identifiers with ^ as valid. We test that the regression goes away+-- here. It's a silly typo in the parser, really. Same with ★ which is a valid+-- symbol according to the 2010 report.+module Bug298 where+++(<^>) :: (a -> a) -> a -> a+x <^> y = x y++(<^) :: a -> a -> a+x <^ y = x++(^>) :: a -> a -> a+x ^> y = y++(⋆^) :: a -> a -> a+x ⋆^ y = y++-- | Links to '<^>' and '^>', '<^' and '⋆^'.+f :: ()+f = ()
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module Bug3 where++-- | /multi-line+-- emphasis/+foo :: Int+foo = undefined
@@ -0,0 +1,22 @@+{-# LANGUAGE Haskell2010 #-}+-- From 2.14.x onwards we were forgetting to swallow ‘#’ as a special+-- character resulting in broken anchors if they occurred+-- mid-paragraph. Here we check that anchors get generated as+-- expected.+module Bug308 where++-- | start#startAnchor# followed by middle#middleAnchor# and end#endAnchor#+f :: ()+f = ()++{-|+start "Bug308#startAnchor"++startOldStyle "Bug308\#startAnchor"++middle "Bug308#middleAnchor"++end "Bug308#middleAnchor"+-}+g :: ()+g = ()
@@ -0,0 +1,18 @@+{-# LANGUAGE Haskell2010 #-}+-- Just like Bug308 module but here we test that referring to anchors+-- from other modules works.+module Bug308CrossModule where++import Bug308++{-|+start "Bug308#startAnchor"++startOldStyle "Bug308\#startAnchor"++middle "Bug308#middleAnchor"++end "Bug308#middleAnchor"+-}+h :: ()+h = ()
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE ExplicitNamespaces #-}+module Bug310 ( type (+) ) where++import GHC.TypeLits
@@ -0,0 +1,38 @@+{-# LANGUAGE Haskell2010 #-}+-- | The first list is incorrectly numbered as 1. 2. 1.; the second example+-- renders fine (1. 2. 3.).+--+-- See https://github.com/haskell/haddock/issues/313+module Bug313 where++{- |+Some text.++1. Item 1++2. Item 2++ > Some code++3. Item 3++Some more text.+-}+a :: a+a = undefined++{- |+Some text.++1. Item 1++2. Item 2++ > Some code++3. Item 3++-}+-- | Some more text.+b :: a+b = undefined
@@ -0,0 +1,27 @@+{-# LANGUAGE Haskell2010 #-}+-- Tests for collapsable headers+module Bug335 where++{-|+=== __ExF:__+abc+-}+f :: ()+f = ()++{-|+=== __ExG:__+>>> a+b++>>> c+d++==== Under ex+foo++== Out of Ex+foo+-}+g :: ()+g = ()
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+module Bug4 where+-- | don't use apostrophe's in the wrong place's+foo :: Int+foo = undefined+
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module Bug458 where++-- | See the defn of @'⊆'@.+(⊆) :: () -> () -> ()+_ ⊆ _ = ()+
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DataKinds, TypeFamilies, StarIsType #-}+module Bug466 where++class Cl a where+ type Fam a :: [*]++data X = X+instance Cl X where+ type Fam X = '[Char]
@@ -0,0 +1,56 @@+{-# LANGUAGE Haskell2010 #-}+module Bug546 where++-- |Test:+--+-- [@[code with square \\ brackets\]@] lorem ipsum+x = 1++-- |+--+-- [@[..\]@] Matches any of the enclosed characters. Ranges of characters can+-- be specified by separating the endpoints with a @\'-'@. @\'-'@ or+-- @']'@ can be matched by including them as the first character(s)+-- in the list. Never matches path separators: @[\/]@ matches+-- nothing at all. Named character classes can also be matched:+-- @[:x:]@ within @[]@ specifies the class named @x@, which matches+-- certain predefined characters. See below for a full list.+--+-- [@[^..\]@ or @[!..\]@] Like @[..]@, but matches any character /not/ listed.+-- Note that @[^-x]@ is not the inverse of @[-x]@, but+-- the range @[^-x]@.+--+-- [@\<m-n>@] Matches any integer in the range m to n, inclusive. The range may+-- be open-ended by leaving out either number: @\"\<->\"@, for+-- instance, matches any integer.+--+-- [@**/@] Matches any number of characters, including path separators,+-- excluding the empty string.+--+-- Supported character classes:+--+-- [@[:alnum:\]@] Equivalent to @\"0-9A-Za-z\"@.+--+-- [@[:alpha:\]@] Equivalent to @\"A-Za-z\"@.+--+-- [@[:blank:\]@] Equivalent to @\"\\t \"@.+--+-- [@[:cntrl:\]@] Equivalent to @\"\\0-\\x1f\\x7f\"@.+--+-- [@[:digit:\]@] Equivalent to @\"0-9\"@.+--+-- [@[:graph:\]@] Equivalent to @\"!-~\"@.+--+-- [@[:lower:\]@] Equivalent to @\"a-z\"@.+--+-- [@[:print:\]@] Equivalent to @\" -~\"@.+--+-- [@[:punct:\]@] Equivalent to @\"!-\/:-\@[-`{-~\"@.+--+-- [@[:space:\]@] Equivalent to @\"\\t-\\r \"@.+--+-- [@[:upper:\]@] Equivalent to @\"A-Z\"@.+--+-- [@[:xdigit:\]@] Equivalent to @\"0-9A-Fa-f\"@.+compile :: String -> String+compile = id
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module Bug548 (WrappedArrow(..)) where++import Control.Applicative
@@ -0,0 +1,24 @@+{-# LANGUAGE Haskell2010 #-}+-- | Exporting records.+module Bug6( A(A), B(B), b, C(C,c1,c2), D(D,d1), E(E) ) where++-- |+-- This record is exported without its field+data A = A { a :: Int }++-- |+-- .. with its field, but the field is named separately in the export list+-- (the field isn't documented separately since it is already documented here)+data B = B { b :: Int }++-- |+-- .. with fields names as subordinate names in the export+data C = C { c1 :: Int, c2 :: Int }++-- |+-- .. with only some of the fields exported (we can't handle this one -+-- how do we render the declaration?)+data D = D { d1 :: Int, d2 :: Int }++-- | a newtype with a field+newtype E = E { e :: Int }
@@ -0,0 +1,17 @@+{-# LANGUAGE Haskell2010 #-}+module Bug613 where++import Prelude (Either(Left, Right))++class Functor f where+ fmap :: (a -> b) -> f a -> f b++instance Functor (Either a) where+ fmap _ (Left x) = Left x+ fmap f (Right y) = Right (f y)++-- | Phantom type a0 is added to block the first renaming from a to a0. This ensures that the renamer doesn't create a new conflict+data ThreeVars a0 a b = ThreeVars a b++instance Functor (ThreeVars a0 a) where+ fmap f (ThreeVars a b) = ThreeVars a (f b)
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module Bug647 where++class Bug647 a where+ f :: a -- ^ doc for arg1+ -> a -- ^ doc for arg2+ -> a -- ^ doc for arg3
@@ -0,0 +1,25 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TemplateHaskell #-}++module Bug679 where++import Language.Haskell.TH++data Bar a = Bar++$(do+ a <- newName "a"+ + let classN = mkName "Foo"+ let methodN = mkName "foo"++ methodTy <- [t| $(varT a) -> $(varT a) |]+ let cla = ClassD [] classN [PlainTV a ()] [] [SigD methodN methodTy]+ + -- Note that we are /reusing/ the same type variable 'a' as in the class+ instanceHead <- [t| $(conT classN) (Bar $(varT a)) |]+ idCall <- [e| id |]+ let ins = InstanceD Nothing [] instanceHead [FunD methodN [Clause [] (NormalB idCall) []]]+ + pure [cla,ins])+
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE MultiParamTypeClasses #-}+-- | This module caused a duplicate instance in the documentation for the Foo+-- type.+module Bug7 where++-- | The Foo datatype+data Foo = Foo++-- | The Bar class+class Bar x y++-- | Just one instance+instance Bar Foo Foo
@@ -0,0 +1,9 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}++module Bug574 where+-- See https://github.com/haskell/haddock/issues/574++-- | Something with a spliced type+foo :: Int -> $(let i = [t| Int |] in [t| $i -> $i |])+foo x y = x + y
@@ -0,0 +1,16 @@+{-# LANGUAGE Haskell2010 #-}+module Bug8 where++infix -->+infix --->++data Typ = Type (Typ,[Typ])+ | TFree (Typ, [Typ])++x --> y = Type(s,[s,t])+(--->) :: (Foldable t0) => t0 t -> Typ -> Typ+(--->) = flip $ foldr (-->)++s = undefined+t = undefined+main = undefined
@@ -0,0 +1,15 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE GADTs, KindSignatures #-}+module Bug85 where++-- explicitly stated non-trivial kind+data Foo :: (* -> *) -> * -> * where+ Bar :: f x -> Foo f (f x)++-- Just kind * but explicitly written+data Baz :: * where+ Baz' :: Baz++-- No kind signature written down at all+data Qux where+ Quux :: Qux
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module Bug865 where++-- | An emphasized link [yes /this/ is emphasized while this is+-- @monospaced@](https://www.haskell.org/). And here is an image:+--+-- +--+link :: ()+link = ()
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE KindSignatures, FlexibleInstances, GADTs, DataKinds #-}+module Bug923 where++-- | A promoted tuple type+data T :: (* -> (*,*)) -> * where+ T :: a -> T ('(,) a)++-- | A promoted tuple type in an instance+instance Eq a => Eq (T ('(,) a)) where+ T x == T y = x == y+
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+module Bug952 where++-- | See 'case', 'of', '--' compared to 'Q.case', 'Q.of', 'Q.--'+foo :: ()+foo = ()
@@ -0,0 +1,18 @@+{-# LANGUAGE Haskell2010 #-}+module Bug953 where++{- | A foo++==== __Examples__++Foo example body+-}+data Foo = Foo'++{- | A bar++==== __Examples__++Bar example body+-}+data Bar = Bar'
@@ -0,0 +1,16 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE ExplicitForAll #-}+module Bug973 where++showRead+ :: forall a b. (Show a, Read b)+ => a -- ^ this gets turned into a string...+ -> b -- ^ ...from which this is read+showRead = read . show++-- | Same as 'showRead', but with type variable order flipped+showRead'+ :: forall b a. (Show a, Read b)+ => a -- ^ this gets turned into a string...+ -> b -- ^ ...from which this is read+showRead' = read . show
@@ -0,0 +1,27 @@+{-# LANGUAGE Haskell2010 #-}+module BugDeprecated where++foo :: Int+foo = 23++bar :: Int+bar = 23++baz :: Int+baz = 23+{-# DEPRECATED foo "for foo" #-}+{-# DEPRECATED bar "for bar" #-}+{-# DEPRECATED baz "for baz" #-}++-- | some documentation for one+one :: Int+one = 23++two :: Int+two = 23++three :: Int+three = 23+{-# DEPRECATED one "for one" #-}+{-# DEPRECATED two "for two" #-}+{-# DEPRECATED three "for three" #-}
@@ -0,0 +1,30 @@+{-# LANGUAGE Haskell2010 #-}+-- test for #192+module BugExportHeadings (+-- * Foo+ foo+-- * Bar+, bar+-- * Baz+, baz++-- * One+, one+-- * Two+, two+-- * Three+, three+) where++foo, bar, baz :: Int+foo = 23+bar = 23+baz = 23++one, two, three :: Int+one = 23+two = 23+three = 23+{-# DEPRECATED one "for one" #-}+{-# DEPRECATED two "for two" #-}+{-# DEPRECATED three "for three" #-}
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module Bugs where++data A a = A a (a -> Int)
@@ -0,0 +1,111 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DataKinds, GADTs, KindSignatures, PatternSynonyms, TypeOperators,+ ViewPatterns #-}+module BundledPatterns (Vec(Nil,(:>)), RTree (LR,BR)) where++import GHC.TypeLits+import Prelude hiding (head, tail)+import Unsafe.Coerce++-- | Fixed size vectors.+--+-- * Lists with their length encoded in their type+-- * 'Vec'tor elements have an __ASCENDING__ subscript starting from 0 and+-- ending at @'length' - 1@.+data Vec :: Nat -> * -> * where+ Nil :: Vec 0 a+ Cons :: a -> Vec n a -> Vec (n + 1) a++infixr 5 `Cons`++-- | Add an element to the head of a vector.+--+-- >>> 3:>4:>5:>Nil+-- <3,4,5>+-- >>> let x = 3:>4:>5:>Nil+-- >>> :t x+-- x :: Num a => Vec 3 a+--+-- Can be used as a pattern:+--+-- >>> let f (x :> y :> _) = x + y+-- >>> :t f+-- f :: Num a => Vec ((n + 1) + 1) a -> a+-- >>> f (3:>4:>5:>6:>7:>Nil)+-- 7+--+-- Also in conjunctions with (':<'):+--+-- >>> let g (a :> b :> (_ :< y :< x)) = a + b + x + y+-- >>> :t g+-- g :: Num a => Vec ((((n + 1) + 1) + 1) + 1) a -> a+-- >>> g (1:>2:>3:>4:>5:>Nil)+-- 12+pattern (:>) :: a -> Vec n a -> Vec (n + 1) a+pattern (:>) x xs <- ((\ys -> (head ys,tail ys)) -> (x,xs))+ where+ (:>) x xs = Cons x xs++infixr 5 :>++head :: Vec (n + 1) a -> a+head (x `Cons` _) = x++tail :: Vec (n + 1) a -> Vec n a+tail (_ `Cons` xs) = unsafeCoerce xs++-- | Perfect depth binary tree.+--+-- * Only has elements at the leaf of the tree+-- * A tree of depth /d/ has /2^d/ elements.+data RTree :: Nat -> * -> * where+ LR_ :: a -> RTree 0 a+ BR_ :: RTree d a -> RTree d a -> RTree (d+1) a++textract :: RTree 0 a -> a+textract (LR_ x) = x+{-# NOINLINE textract #-}++tsplit :: RTree (d+1) a -> (RTree d a,RTree d a)+tsplit (BR_ l r) = (unsafeCoerce l, unsafeCoerce r)+{-# NOINLINE tsplit #-}++-- | Leaf of a perfect depth tree+--+-- >>> LR 1+-- 1+-- >>> let x = LR 1+-- >>> :t x+-- x :: Num a => RTree 0 a+--+-- Can be used as a pattern:+--+-- >>> let f (LR a) (LR b) = a + b+-- >>> :t f+-- f :: Num a => RTree 0 a -> RTree 0 a -> a+-- >>> f (LR 1) (LR 2)+-- 3+pattern LR :: a -> RTree 0 a+pattern LR x <- (textract -> x)+ where+ LR x = LR_ x++-- | Branch of a perfect depth tree+--+-- >>> BR (LR 1) (LR 2)+-- <1,2>+-- >>> let x = BR (LR 1) (LR 2)+-- >>> :t x+-- x :: Num a => RTree 1 a+--+-- Case be used a pattern:+--+-- >>> let f (BR (LR a) (LR b)) = LR (a + b)+-- >>> :t f+-- f :: Num a => RTree 1 a -> RTree 0 a+-- >>> f (BR (LR 1) (LR 2))+-- 3+pattern BR :: RTree d a -> RTree d a -> RTree (d+1) a+pattern BR l r <- ((\t -> (tsplit t)) -> (l,r))+ where+ BR l r = BR_ l r
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DataKinds, GADTs, KindSignatures, PatternSynonyms #-}+module BundledPatterns2 (Vec((:>), Empty), RTree(..)) where++import GHC.TypeLits++import BundledPatterns++pattern Empty :: Vec 0 a+pattern Empty <- Nil
@@ -0,0 +1,57 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE GADTs, PatternSynonyms #-}++module ConstructorArgs (Foo(..), Boo(Foo, Foa, Fo, Fo'), pattern Bo, pattern Bo') where++data Foo+ = Rec -- ^ doc on a record+ { x :: String -- ^ doc on the `String` field of `Rec`+ , y :: String -- ^ doc on the `String` field of `Rec`+ }+ | Baz Int String -- ^ old prefix doc style+ | Boa -- ^ doc on the `Boa` constrictor+ !Int -- ^ doc on the `Int` field of `Boa`+ !String -- ^ doc on the `String` field of `Boa`+ | Int :| String -- ^ old infix doc style+ | Int -- ^ doc on the `Int` field of the `:*` constructor+ :* -- ^ doc on the `:*` constructor+ String -- ^ doc on the `String` field of the `:*` constructor++infixr 1 `Foo`+infixr 2 `Boa`+infixr 3 :*++data Boo where+ -- | Info about a 'Foo'+ Foo :: Int -- ^ `Int` field of `Foo`+ -> String -- ^ `String` field of `Foo`+ -> Boo -- ^ Make a `Boo`++ -- | no argument docs GADT+ Foa :: Int -> Boo++infixr 4 `Boo`++-- | Info about bundled 'Fo'+pattern Fo :: Int -- ^ an 'Int'+ -> String -- ^ a 'String'+ -> Boo -- ^ a 'Boo'+pattern Fo x y = Foo x y++-- | Bundled and no argument docs+pattern Fo' :: Boo+pattern Fo' = Foo 1 "hi"++infixr 5 `Fo`++-- | Info about not-bundled 'Bo'+pattern Bo :: Int -- ^ an 'Int'+ -> String -- ^ a 'String'+ -> Boo -- ^ a 'Boo' pattern+pattern Bo x y = Foo x y++-- | Not bundled and no argument docs+pattern Bo' :: Int -> String -> Boo+pattern Bo' x y = Foo x y++infixr 6 `Bo`
@@ -0,0 +1,27 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}++module ConstructorPatternExport (+ pattern FooCons+ , pattern MyRecCons+ , pattern (:+)+ , pattern BlubCons+ , pattern MyGADTCons+ ) where++data Foo a = FooCons String a++data MyRec = MyRecCons { one :: Bool, two :: Int }++data MyInfix a = String :+ a++data Blub = forall b. Show b => BlubCons b++data MyGADT :: * -> * where+ MyGADTCons :: forall a. Eq a => a -> Int -> MyGADT (Maybe String)++pattern MyGADTCons' :: () => forall a. Eq a => a -> Int -> MyGADT (Maybe String)+pattern MyGADTCons' x y = MyGADTCons x y
@@ -0,0 +1,15 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies #-}++module DefaultAssociatedTypes where++-- | Documentation for Foo.+class Foo a where+ -- | Documentation for bar and baz.+ bar, baz :: a -> String++ -- | Doc for Qux+ type Qux a :: *++ -- | Doc for default Qux+ type Qux a = [a]
@@ -0,0 +1,20 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DefaultSignatures #-}++module DefaultSignatures where++-- | Documentation for Foo.+class Foo a where+ -- | Documentation for bar and baz.+ bar, baz :: a -> String++ -- | Documentation for the default signature of bar.+ default bar :: Show a => a -> String+ bar = show++ -- | Documentation for baz'.+ baz' :: String -> a++ -- | Documentation for the default signature of baz'.+ default baz' :: Read a => String -> a+ baz' = read
@@ -0,0 +1,16 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedClass where++-- | some class+class SomeClass a where+ -- | documentation for foo+ foo :: a -> a++{-# DEPRECATED SomeClass "SomeClass" #-}+{-# DEPRECATED foo "foo" #-}++class SomeOtherClass a where+ bar :: a -> a++{-# DEPRECATED SomeOtherClass "SomeOtherClass" #-}+{-# DEPRECATED bar "bar" #-}
@@ -0,0 +1,16 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies #-}+module DeprecatedData where++-- | type Foo+data Foo = Foo -- ^ constructor Foo+ | Bar -- ^ constructor Bar++{-# DEPRECATED Foo "Foo" #-}+{-# DEPRECATED Bar "Bar" #-}++data One = One+ | Two++{-# DEPRECATED One "One" #-}+{-# DEPRECATED Two "Two" #-}
@@ -0,0 +1,11 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedFunction where++-- | some documentation for foo+foo :: Int+foo = 23+{-# DEPRECATED foo "use `bar` instead" #-}++-- | some documentation for bar+bar :: Int+bar = 42
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedFunction2 where+++foo :: Int+foo = 23+{-# DEPRECATED foo "use bar instead" #-}
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedFunction3 where++++foo = 23+{-# DEPRECATED foo "use bar instead" #-}
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+-- | Documentation for "DeprecatedModule".+module DeprecatedModule {-# DEPRECATED "Use \"Foo\" instead" #-} where++foo :: Int+foo = 23
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedModule2 {-# DEPRECATED "Use Foo instead" #-} where++foo :: Int+foo = 23
@@ -0,0 +1,11 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedNewtype where++-- | some documentation+newtype SomeNewType = SomeNewTypeConst String {- ^ constructor docu -}+{-# DEPRECATED SomeNewType "SomeNewType" #-}+{-# DEPRECATED SomeNewTypeConst "SomeNewTypeConst" #-}++newtype SomeOtherNewType = SomeOtherNewTypeConst String+{-# DEPRECATED SomeOtherNewType "SomeOtherNewType" #-}+{-# DEPRECATED SomeOtherNewTypeConst "SomeOtherNewTypeConst" #-}
@@ -0,0 +1,17 @@+{-# LANGUAGE Haskell2010 #-}+-- |+-- What is tested here:+--+-- * Deprecation messages are shown for re-exported items.+--+module DeprecatedReExport (+-- * Re-exported from an other module+ foo+-- * Re-exported from an other package+-- | Not yet working, see <http://trac.haskell.org/haddock/ticket/223>+-- , isEmptyChan+,+) where++import DeprecatedFunction+import Control.Concurrent.Chan
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module DeprecatedRecord where++-- | type Foo+data Foo = Foo {+ fooName :: String -- ^ some name+, fooValue :: Int -- ^ some value+}++{-# DEPRECATED fooValue "do not use this" #-}
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeFamilies #-}+module DeprecatedTypeFamily where++-- | some documentation+data family SomeTypeFamily k :: * -> *+{-# DEPRECATED SomeTypeFamily "SomeTypeFamily" #-}++data family SomeOtherTypeFamily k :: * -> *+{-# DEPRECATED SomeOtherTypeFamily "SomeOtherTypeFamily" #-}
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}++module DeprecatedTypeSynonym where++-- | some documentation+type TypeSyn = String+{-# DEPRECATED TypeSyn "TypeSyn" #-}++type OtherTypeSyn = String+{-# DEPRECATED OtherTypeSyn "OtherTypeSyn" #-}
@@ -0,0 +1,26 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DuplicateRecordFields #-}+module DuplicateRecordFields (RawReplay(..)) where++import Prelude hiding (Int)++data Int = Int++data RawReplay = RawReplay+ { headerSize :: Int+ -- ^ The byte size of the first section.+ , headerCRC :: Int+ -- ^ The CRC of the first section.+ , header :: Int+ -- ^ The first section.+ , contentSize :: Int+ -- ^ The byte size of the second section.+ , contentCRC :: Int+ -- ^ The CRC of the second section.+ , content :: Int+ -- ^ The second section.+ , footer :: Int+ -- ^ Arbitrary data after the second section. In replays generated by+ -- Rocket League, this is always empty. However it is not technically+ -- invalid to put something here.+ }
@@ -0,0 +1,40 @@+{-# LANGUAGE Haskell2010 #-}+module Examples where++-- | Fibonacci number of given 'Integer'.+--+-- Examples:+--+-- >>> fib 5+-- 5+-- >>> fib 10+-- 55+--+-- >>> fib 10+-- 55+--+-- One more Example:+--+-- >>> fib 5+-- 5+--+-- One more Example:+--+-- >>> fib 5+-- 5+--+-- Example with an import:+--+-- >>> import Data.Char+-- >>> isSpace 'a'+-- False+--+-- >>> putStrLn "foo\n\nbar"+-- foo+-- <BLANKLINE>+-- bar+--+fib :: Integer -> Integer+fib 0 = 0+fib 1 = 1+fib n = fib (n - 1) + fib (n - 2)
@@ -0,0 +1,8 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE Haskell2010, ExplicitForAll, MonomorphismRestriction #-}+{-# OPTIONS_HADDOCK show-extensions #-}+module Extensions where++-- | Bar+foobar :: t+foobar = undefined
@@ -0,0 +1,39 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE RankNTypes, DataKinds, TypeFamilies #-}+module FunArgs where++f :: forall a. Ord a+ => Int -- ^ First argument+ -> a -- ^ Second argument+ -> Bool -- ^ Third argument+ -> (a -> a) -- ^ Fourth argument+ -> () -- ^ Result+f = undefined+++g :: a -- ^ First argument+ -> b -- ^ Second argument+ -> c -- ^ Third argument+ -> d -- ^ Result+g = undefined+++h :: forall a b c+ . a -- ^ First argument+ -> b -- ^ Second argument+ -> c -- ^ Third argument+ -> forall d. d -- ^ Result+h _ _ _ = undefined+++i :: forall a (b :: ()) d. (d ~ '())+ => forall c+ . a b c d -- ^ abcd+ -> () -- ^ Result+i = undefined+++j :: forall proxy (a :: ()) b+ . proxy a -- ^ First argument+ -> b -- ^ Result+j = undefined
@@ -0,0 +1,12 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE GADTs #-}+module GADTRecords (H1(..)) where++-- | h1+data H1 a b where+ C1 :: H1 a b+ C2 :: Ord a => [a] -> H1 a a+ C3 :: { field :: Int -- ^ hello docs+ } -> H1 Int Int+ C4 :: { field2 :: a -- ^ hello2 docs+ } -> H1 Int a
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE GADTs #-}++module GadtConstructorArgs (Boo(..)) where++data Boo where+ Fot :: { x :: Int -- ^ an 'x'+ , y :: Int -- ^ a 'y'+ } -> Boo++ -- | Record GADT with docs+ Fob :: { w :: Int -- ^ a 'w'+ , z :: Int -- ^ a 'z'+ } -> Boo -- ^ a 'Boo'
@@ -0,0 +1,52 @@+{-# LANGUAGE Haskell2010 #-}+{- |+ Implementation of fixed-size hash tables, with a type+ class for constructing hash values for structured types.+-}+module Hash (+ -- * The @HashTable@ type+ HashTable,++ -- ** Operations on @HashTable@s+ new, insert, lookup,++ -- * The @Hash@ class+ Hash(..),+ ) where++import Data.Array+import Prelude hiding (lookup)++-- | A hash table with keys of type @key@ and values of type @val@.+-- The type @key@ should be an instance of 'Eq'.+data HashTable key val = HashTable Int (Array Int [(key,val)])++-- | Builds a new hash table with a given size+new :: (Eq key, Hash key) => Int -> IO (HashTable key val)+new = undefined++-- | Inserts a new element into the hash table+insert :: (Eq key, Hash key) => key -> val -> IO ()+insert = undefined++-- | Looks up a key in the hash table, returns @'Just' val@ if the key+-- was found, or 'Nothing' otherwise.+lookup :: Hash key => key -> IO (Maybe val)+lookup = undefined++-- | A class of types which can be hashed.+class Hash a where+ -- | hashes the value of type @a@ into an 'Int'+ hash :: a -> Int++instance Hash Int where+ hash = id++instance Hash Float where+ hash = trunc++instance (Hash a, Hash b) => Hash (a,b) where+ hash (a,b) = hash a `xor` hash b++trunc = undefined+xor = undefined
@@ -0,0 +1,7 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS_HADDOCK hide #-}++module Hidden where++hidden :: Int -> Int+hidden a = a
@@ -0,0 +1,36 @@+{-# LANGUAGE Haskell2010 #-}+-- http://trac.haskell.org/haddock/ticket/37+module HiddenInstances (VisibleClass, VisibleData) where++-- | Should be visible+class VisibleClass a++-- | Should *not* be visible+class HiddenClass a++-- | Should *not* be visible+data HiddenData = HiddenData++-- | Should be visible+data VisibleData = VisibleData++-- | Should be visible+instance VisibleClass Int++-- | Should be visible+instance VisibleClass VisibleData++-- | Should be visible+instance Num VisibleData++-- | Should *not* be visible+instance VisibleClass HiddenData++-- | Should *not* be visible+instance HiddenClass Int++-- | Should *not* be visible+instance HiddenClass VisibleData++-- | Should *not* be visible+instance HiddenClass HiddenData
@@ -0,0 +1,18 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS_HADDOCK hide #-}+module HiddenInstancesA where++-- | Should be visible+class Foo a++-- | Should be visible+data Bar++-- | Should be visible+instance Foo Bar++-- | Should *not* be visible+data Baz++-- | Should *not* be visible+instance Foo Baz
@@ -0,0 +1,3 @@+{-# LANGUAGE Haskell2010 #-}+module HiddenInstancesB (Foo, Bar) where+import HiddenInstancesA
@@ -0,0 +1,9 @@+{-# LANGUAGE Haskell2010 #-}+module Hyperlinks where++-- |+-- A plain URL: <http://example.com/>+--+-- A URL with a label: <http://example.com/ some link>+foo :: Int+foo = 23
@@ -0,0 +1,36 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE TypeOperators #-}+module Identifiers where++import Data.List (elem, (++))++data Id = Id+data a :* b = a :* b++{-|++ * Unadorned:++ - Unqualified: '++', 'elem'+ - Qualified: 'Data.List.++', 'Data.Lis.elem'+ - Namespaced: v'++', t'++', v'elem', t'elem', v'Id', t'Id', v':*', t':*'++ * Parenthesized:++ - Unqualified: @'(++)' [1,2,3] [4,5,6]@+ - Qualified: @'(Data.List.++)' [1,2,3] [4,5,6]@+ - Namespaced: v'(++)', t'++', v'(:*)', t'(:*)'++ * Backticked:++ - Unqualified: @1 '`elem`' [-3..3]@+ - Qualified: @1 '`Data.List.elem`' [-3..3]@+ - Namespaced: v'`elem`', t'`elem`', v'`Id`', t'`Id`'++ * Edge cases:++ - Tuples: '()', '(,,,)'++-}+foo :: ()+foo = ()
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+{-# OPTIONS_HADDOCK ignore-exports #-}+module IgnoreExports (Foo, foo) where++-- | documentation for Foo+data Foo = Bar -- ^ Documentation for Bar++-- | documentation for foo+foo :: Int+foo = 23++-- | documentation for bar+bar :: Int+bar = 23
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE ImplicitParams, RankNTypes #-}+module ImplicitParams where++data X = X++c :: (?x :: X) => X+c = ?x++d :: (?x :: X, ?y :: X) => (X, X)+d = (?x, ?y)++f :: ((?x :: X) => a) -> a+f a = let ?x = X in a
@@ -0,0 +1,100 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ImpredicativeTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+++module Instances where+++newtype (<~~) a b = Xyzzy (b -> (a, a))+++class Foo f where++ foo :: f Int -> a -> f a+ foo' :: f (f a) -> Int -> f (f Int)++ foo = undefined+ foo' = undefined++instance Foo Maybe+instance Foo []+instance (Eq a, Foo f) => Foo ((,) (f a))+instance Foo (Either a)+instance Foo ((,,) a a)+instance Foo ((->) a)+instance Foo ((<~~) a)+++class Foo f => Bar f a where++ bar :: f a -> f Bool -> a+ bar' :: f (f a) -> f (f (f b))+ bar0, bar1 :: (f a, f a) -> (f b, f c)++ bar = undefined+ bar' = undefined+ bar0 = undefined+ bar1 = undefined+++instance Bar Maybe Bool+instance Bar Maybe [a]+instance Bar [] (a, a)+instance Foo f => Bar (Either a) (f a)+instance Foo ((,,) a b) => Bar ((,,) a b) (a, b, a)+++class Baz a where++ baz :: a -> (forall a. a -> a) -> (b, forall c. c -> a) -> (b, c)+ baz' :: b -> (forall b. b -> a) -> (forall b. b -> a) -> [(b, a)]+ baz'' :: b -> (forall b. (forall b. b -> a) -> c) -> (forall c. c -> b)++ baz = undefined+ baz' = undefined+ baz'' = undefined+++instance Baz (a -> b)+instance Baz [c]+instance Baz (a, b, c)+instance Baz (a, [b], b, a)+++data Quux a b c = Qx a | Qux a b | Quux a b c++instance Foo (Quux a b)+instance Bar (Quux a c) (Quux a b c)+instance Baz (Quux a b c)+++class Norf a b where++ type Plugh a c b+ data Thud a c++ norf :: Plugh a c b -> a -> (a -> c) -> b++ norf = undefined+++instance Norf Int Bool where++ type Plugh Int [a] Bool = a+ type Plugh Int (a, b) Bool = (a, [b])++ data Thud Int (Quux a [a] c) = Thuud a | Thuuud Int Int+ data Thud Int [a] = Thuuuud Bool+++instance Norf [a] [b] where++ type Plugh [a] (Maybe a) [b] = a+ type Plugh [a] [b] [b] = Quux a b (a, b)++ data Thud [a] (a, a, a) = Thd a
@@ -0,0 +1,15 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE LinearTypes #-}+module LinearTypes where++-- | Does something unrestricted.+unrestricted :: a -> b+unrestricted = undefined++-- | Does something linear.+linear :: a %1 -> b+linear = linear++-- | Does something polymorphic.+poly :: a %m -> b+poly = poly
@@ -0,0 +1,15 @@+{-# LANGUAGE Haskell2010 #-}+-- | Math (display) for 'normalDensity'+--+-- \[+-- \int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}+-- \]+--+-- \(\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\)++module Math where++-- | Math (inline) for 'normalDensity'+-- \(\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\)+-- \[\int_{-\infty}^{\infty} e^{-x^2/2} = \sqrt{2\pi}\]+f = 5
@@ -0,0 +1,54 @@+{-# LANGUAGE Haskell2010 #-}+-- | This tests the new MINIMAL pragma present in GHC 7.8+module Minimal+ ( Foo(..)+ , Weird(..)+ , NoMins(..)+ , FullMin(..)+ , PartialMin(ccc)+ , EmptyMin(..)+ ) where++class Foo a where+ -- | Any two of these are required...+ foo :: a+ bar :: a+ bat :: a++ -- | .. or just this+ fooBarBat :: (a,a,a)++ {-# MINIMAL (foo, bar) | (bar, bat) | (foo, bat) | fooBarBat #-}++class Weird a where+ a :: a+ b :: a+ c :: a+ d :: a+ e :: a+ f :: a+ g :: a++ {-# MINIMAL ((a, b), c | (d | (e, (f | g)))) #-}++class NoMins a where+ x :: a+ y :: a+ z :: a++ -- | Has a default implementation!+ z = x++class FullMin a where+ aaa :: a+ bbb :: a++class PartialMin a where+ ccc :: a+ ddd :: a++class EmptyMin a where+ eee :: a+ fff :: a+ eee = fff+ fff = undefined
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+-- | Documentation for "ModuleWithWarning".+module ModuleWithWarning {-# WARNING "This is an unstable interface. Prefer functions from \"Prelude\" instead!" #-} where++foo :: Int+foo = 23
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+module NamedDoc where++-- $foo bar+
@@ -0,0 +1,14 @@+{-# LANGUAGE Haskell2010 #-}+module NamespacedIdentifiers where++-- | A link to:+--+-- * the type t'Bar'+-- * the constructor v'Bar'+-- * the unimported but qualified type t'A.A'+-- * the unimported but qualified value v'A.A'+--+data Foo = Bar++-- | A link to the value v'Foo' (which shouldn't exist).+data Bar
@@ -0,0 +1,137 @@+{-# LANGUAGE Haskell2010 #-}+module Nesting where++{-|+* We can++ * easily go back++ 1. some indentation++ * levels++1. @back at the top@++-}+d :: t+d = undefined+++{-|+* Beginning of list++ * second list++ * Some indented list but+the presence of this text pushes it out of nesting back to the top.+-}+e :: t+e = undefined+++{-|+* Beginning of list++ @+ nested code+ we preserve the space correctly+ @+-}+f :: t+f = undefined+++{-|+* Beginning of list++ * Nested list+-}+g :: t+g = undefined++{-|+* Beginning of list++ > nested+ > bird+ > tracks+-}+h :: t+h = undefined++{-|+* Beginning of list+This belongs to the list above!++ > nested+ > bird+ > tracks+ >+ > another line+ > with indentation++ >nested bird tracks+ > without leading space++ * Next list+ More of the indented list.++ * Deeper++ * Deeper++ * Even deeper!+ * No newline separation even in indented lists.+-}+i :: t+i = undefined++++{-|+[All this] Works for+definition lists too.++ > nested+ > bird+ > tracks++ * Next list+ with more of the indented list content.++ Even more content on a new line.++ 1. Different type of list++ (2) Deeper++ >>> Here's an example in a list+ example result++ [b] Even deeper!+ [c] No newline separation even in indented lists.+ We can have any paragraph level element that we normally+ can, like headers++ === Level 3 header+ with some content…++ * and even more lists inside+-}+j :: t+j = undefined++{-|+ - list may start at arbitrary depth++ - and consecutive items at that depth+ belong to the same list++ - of course we can still++ * nest items like we are used to++ - and then get back to initial list+-}+k :: t+k = undefined
@@ -0,0 +1,13 @@+{-# LANGUAGE Haskell2010 #-}++-- Haddock comments are parsed as separate declarations so we+-- need to insert a ';' when using them with explicit layout.+-- This should probably be changed.++module NoLayout where {+ -- | the function 'g'+ ;+ g :: Int;+ g = undefined+ }+
@@ -0,0 +1,6 @@+{-# LANGUAGE Haskell2010 #-}+module NonGreedy where++-- | <url1> <url2>+f :: a+f = undefined
@@ -0,0 +1,69 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE PatternSynonyms, TypeOperators, TypeFamilies, GADTs #-}+{-# LANGUAGE FunctionalDependencies #-}++-- | Test operators with or without fixity declarations+module Operators where++-- | Operator with no fixity+(+-) :: a -> a -> a+a +- _ = a++-- | Operator with infixr 7+(*/) :: a -> a -> a+_ */ b = b+infixr 7 */++-- | Named function with infixl 3+foo :: a -> a -> a+foo a _ = a+infixl 3 `foo`++-- | Data type with operator constructors+data Foo+ = Foo `Bar` Foo -- ^ Has infixl 3+ | Foo :- Foo -- ^ Has infixr 5+infixr 5 :-+infixl 3 `Bar`++-- | Pattern synonym, infixr 3+pattern (:+) a b <- [a,b]+infixr 3 :+++-- | Type name, infixl 6 and GADT constructor+data (a <-> b) where+ (:<->) :: a -> b -> a <-> b+infixl 6 <->+infixr 6 :<->++-- | Type family with fixity+type family a ++ b+infix 3 ++++-- | Data family with fixity+data family a ** b+infix 9 **++-- | Class with fixity, including associated types+class a ><> b | a -> b where+ -- Dec 2015: Added @a -> b@ functional dependency to clean up ambiguity+ -- See GHC #11264+ type a <>< b :: *+ data a ><< b+ (>><), (<<>) :: a -> b -> ()++ -- | Multiple fixities+ (**>), (**<), (>**), (<**) :: a -> a -> ()++infixr 1 ><>+infixl 2 <><+infixl 3 ><<+infixr 4 >><+infixl 5 <<>++infixr 8 **>, >**+infixl 8 **<, <**++-- | Type synonym with fixity+type (a >-< b) = a <-> b+infixl 6 >-<
@@ -0,0 +1,9 @@+{-# LANGUAGE Haskell2010 #-}+module OrphanInstances where++import OrphanInstancesType+import OrphanInstancesClass++-- | This is an orphan instance.+instance AClass AType where+ aClass (AType n) = n
@@ -0,0 +1,5 @@+{-# LANGUAGE Haskell2010 #-}+module OrphanInstancesClass (AClass(..)) where++class AClass a where+ aClass :: a -> Int
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module OrphanInstancesType (AType(..)) where++data AType = AType Int
@@ -0,0 +1,4 @@+{-# LANGUAGE Haskell2010 #-}+module PR643 (test) where++import PR643_1
@@ -0,0 +1,8 @@+{-# LANGUAGE Haskell2010 #-}+module PR643_1 where++infixr 5 `test`++-- | Some big documentation+test :: ()+test = ()
@@ -0,0 +1,34 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE ExistentialQuantification, PatternSynonyms, PolyKinds, TypeOperators #-}++-- | Testing some pattern synonyms+module PatternSyns where++-- | FooType doc+data FooType x = FooCtor x++-- | Pattern synonym for 'Foo' x+pattern Foo x = FooCtor x++-- | Pattern synonym for 'Bar' x+pattern Bar x = FooCtor (Foo x)++-- | Pattern synonym for (':<->')+pattern x :<-> y = (Foo x, Bar y)++-- | BlubType is existentially quantified+data BlubType = forall x. Show x => BlubCtor x++-- | Pattern synonym for 'Blub' x+pattern Blub x = BlubCtor x++-- | Doc for ('><')+data (a :: *) >< b = Empty++-- | Pattern for 'Empty'+pattern E = Empty++-- | Earlier ghc versions didn't allow explicit signatures+-- on pattern synonyms.+pattern PatWithExplicitSig :: Eq somex => somex -> FooType somex+pattern PatWithExplicitSig x = FooCtor x
@@ -0,0 +1,26 @@+{-# LANGUAGE Haskell2010 #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE TypeOperators #-}+++module PromotedTypes where+++data RevList a = RNil | RevList a :> a+++data Pattern :: [*] -> * where+ Nil :: Pattern '[]+ Cons :: Maybe h -> Pattern t -> Pattern (h ': t)+++-- Unlike (:), (:>) does not have to be quoted on type level.+data RevPattern :: RevList * -> * where+ RevNil :: RevPattern RNil+ RevCons :: Maybe h -> RevPattern t -> RevPattern (t :> h)+++data Tuple :: (*, *) -> * where+ Tuple :: a -> b -> Tuple '(a, b)
@@ -0,0 +1,10 @@+{-# LANGUAGE Haskell2010 #-}+module Properties where++-- | Fibonacci number of given 'Integer'.+--+-- prop> fib n <= fib (n + 1)+fib :: Integer -> Integer+fib 0 = 0+fib 1 = 1+fib n = fib (n - 1) + fib (n - 2)
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff
file too large to diff