From e4e91f53f550046f03e8a65144e5a18dfa8def0b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 14 Dec 2020 19:52:43 +0000 Subject: [PATCH] CI: Update documentation --- docs/Data-Singletons-Dict.html | 44 + docs/doc-index.html | 1 + docs/doc-index.json | 1 + docs/haddock-bundle.min.js | 2 + docs/index.html | 2 + docs/linuwial.css | 877 ++++++++++++++++++++ docs/meta.json | 1 + docs/quick-jump.css | 220 +++++ docs/quick-jump.min.js | 2 + docs/singletons-dict-getter.haddock | Bin 0 -> 3434 bytes docs/src/Data.Singletons.Dict.html | 898 +++++++++++++++++++++ docs/src/Paths_singletons_dict_getter.html | 138 ++++ docs/src/highlight.js | 27 + docs/src/style.css | 97 +++ docs/synopsis.png | Bin 0 -> 11327 bytes 15 files changed, 2310 insertions(+) create mode 100644 docs/Data-Singletons-Dict.html create mode 100644 docs/doc-index.html create mode 100644 docs/doc-index.json create mode 100644 docs/haddock-bundle.min.js create mode 100644 docs/index.html create mode 100644 docs/linuwial.css create mode 100644 docs/meta.json create mode 100644 docs/quick-jump.css create mode 100644 docs/quick-jump.min.js create mode 100644 docs/singletons-dict-getter.haddock create mode 100644 docs/src/Data.Singletons.Dict.html create mode 100644 docs/src/Paths_singletons_dict_getter.html create mode 100644 docs/src/highlight.js create mode 100644 docs/src/style.css create mode 100644 docs/synopsis.png diff --git a/docs/Data-Singletons-Dict.html b/docs/Data-Singletons-Dict.html new file mode 100644 index 0000000..d685552 --- /dev/null +++ b/docs/Data-Singletons-Dict.html @@ -0,0 +1,44 @@ +Data.Singletons.Dict
singletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors.
Safe HaskellNone
LanguageHaskell2010

Data.Singletons.Dict

Documentation

mkTotalDictGetter Source #

Arguments

:: Name

The Name of a singletons-like type.

-> Name

The Name of a type class.

-> Q [Dec] 

Generates Dict getters for the promoted nullary data constructors corresponding to + a singletons-like type.

All the promoted data constructors must be instances of the given type class.

The names of the getters result from the concatenation of:

  • the camel-cased name of the base type,
  • the name of the type class,
  • the "Dict" keyword,
  • the "A" suffix, for the contextual getter.

Example:

Given this type:

data Example = Foo | Bar | Baz
+

and the corresponding singletons-like type:

data SExample (example :: Example) where
+    SFoo :: SExample 'Foo
+    SBar :: SExample 'Bar
+    SBaz :: SExample 'Baz
+

this line:

$(mkTotalDictGetter ''SExample ''Typeable)
+

generates those getters:

exampleTypeableDict :: SExample example -> Dict (Typeable example)
+exampleTypeableDict sing =
+    case sing of
+        SFoo -> Dict
+        SBar -> Dict
+        SBaz -> Dict
+
+exampleTypeableDictA :: Applicative f => SExample example -> f (Dict (Typeable example))
+exampleTypeableDictA sing =
+    case sing of
+        SFoo -> pure Dict
+        SBar -> pure Dict
+        SBaz -> pure Dict
+

mkPartialDictGetter Source #

Arguments

:: Name

The Name of a singletons-like type.

-> Name

The Name of a type class.

-> Q [Dec] 

Generates Dict getters for the promoted nullary data constructors corresponding to + a singletons-like type.

Not all the promoted data constructors must be instances of the given type class.

The name of the getters results from the concatenation of:

  • the camel-cased name of the base type,
  • the name of the type class,
  • the "Dict" keyword,
  • the "A" suffix, for the contextual getter.

Example:

Given this type:

data Example = Foo | Bar | Baz
+

the corresponding singletons-like type:

data SExample (example :: Example) where
+    SFoo :: SExample 'Foo
+    SBar :: SExample 'Bar
+    SBaz :: SExample 'Baz
+

and this type class and instance:

class IsBar (a :: k) where
+
+instance IsBar 'Bar where
+

this line:

$(mkPartialDictGetter ''SExample ''IsBar)
+

generates those getters:

exampleIsBarDict :: SExample example -> Maybe (Dict (IsBar example))
+exampleIsBarDict sing =
+    case sing of
+        SFoo -> Nothing
+        SBar -> Just Dict
+        SBaz -> Nothing
+
+exampleIsBarDictA :: Applicative f => SExample example -> f (Maybe (Dict (IsBar example)))
+exampleIsBarDictA sing =
+    case sing of
+        SFoo -> pure Nothing
+        SBar -> pure (Just Dict)
+        SBaz -> pure Nothing
+
\ No newline at end of file diff --git a/docs/doc-index.html b/docs/doc-index.html new file mode 100644 index 0000000..94ff2ce --- /dev/null +++ b/docs/doc-index.html @@ -0,0 +1 @@ +singletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors. (Index)
singletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors.

Index

mkPartialDictGetterData.Singletons.Dict
mkTotalDictGetterData.Singletons.Dict
\ No newline at end of file diff --git a/docs/doc-index.json b/docs/doc-index.json new file mode 100644 index 0000000..4d415be --- /dev/null +++ b/docs/doc-index.json @@ -0,0 +1 @@ +[{"display_html":"mkTotalDictGetter :: Name -> Name -> Q [Dec]","name":"mkTotalDictGetter","module":"Data.Singletons.Dict","link":"Data-Singletons-Dict.html#v:mkTotalDictGetter"},{"display_html":"mkPartialDictGetter :: Name -> Name -> Q [Dec]","name":"mkPartialDictGetter","module":"Data.Singletons.Dict","link":"Data-Singletons-Dict.html#v:mkPartialDictGetter"}] \ No newline at end of file diff --git a/docs/haddock-bundle.min.js b/docs/haddock-bundle.min.js new file mode 100644 index 0000000..45adda9 --- /dev/null +++ b/docs/haddock-bundle.min.js @@ -0,0 +1,2 @@ +!function i(s,a,l){function c(t,e){if(!a[t]){if(!s[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(u)return u(t,!0);var o=new Error("Cannot find module '"+t+"'");throw o.code="MODULE_NOT_FOUND",o}var r=a[t]={exports:{}};s[t][0].call(r.exports,function(e){return c(s[t][1][e]||e)},r,r.exports,i,s,a,l)}return a[t].exports}for(var u="function"==typeof require&&require,e=0;e element with id '"+e+"'");return t}function x(){return u.defaultInstanceState==i.Open}function w(e){for(var t=S(e.target.id),n=t.element.open,o=0,r=t.toggles;owindow.innerHeight?this.searchResults.scrollTop+=e.bottom-window.innerHeight+80:e.topn)return u(e,this.pattern,o);var r=this.options,i=r.location,s=r.distance,a=r.threshold,l=r.findAllMatches,c=r.minMatchCharLength;return d(e,this.pattern,this.patternAlphabet,{location:i,distance:s,threshold:a,findAllMatches:l,minMatchCharLength:c})}}]),y}();e.exports=r},function(e,t,n){"use strict";var u=n(0);e.exports=function(e,t){return function e(t,n,o){if(n){var r=n.indexOf("."),i=n,s=null;-1!==r&&(i=n.slice(0,r),s=n.slice(r+1));var a=t[i];if(null!=a)if(s||"string"!=typeof a&&"number"!=typeof a)if(u(a))for(var l=0,c=a.length;l 0 and <= 1");p=p.name}else a[p]={weight:1};this._analyze({key:p,value:this.options.getFn(u,p),record:u,index:l},{resultMap:o,results:r,tokenSearchers:e,fullSearcher:t})}return{weights:a,results:r}}},{key:"_analyze",value:function(e,t){var n=e.key,o=e.arrayIndex,r=void 0===o?-1:o,i=e.value,s=e.record,a=e.index,l=t.tokenSearchers,c=void 0===l?[]:l,u=t.fullSearcher,d=void 0===u?[]:u,h=t.resultMap,p=void 0===h?{}:h,f=t.results,v=void 0===f?[]:f;if(null!=i){var g=!1,m=-1,y=0;if("string"==typeof i){this._log("\nKey: "+(""===n?"-":n));var _=d.search(i);if(this._log('Full text: "'+i+'", score: '+_.score),this.options.tokenize){for(var b=i.split(this.options.tokenSeparator),k=[],S=0;S=c.length;if(this._log("\nCheck Matches: "+T),(g||_.isMatch)&&T){var N=p[a];N?N.output.push({key:n,arrayIndex:r,value:i,score:A,matchedIndices:_.matchedIndices}):(p[a]={item:s,output:[{key:n,arrayIndex:r,value:i,score:A,matchedIndices:_.matchedIndices}]},v.push(p[a]))}}else if(V(i))for(var P=0,j=i.length;Psingletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors.
singletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors.

singletons-dict-getter-1.0.0: TH generation of Dict getters for promoted nullary data constructors.

TH generation of Dict getters for promoted nullary data constructors, +based on the corresponding singletons-like types.

Signatures

Modules

\ No newline at end of file diff --git a/docs/linuwial.css b/docs/linuwial.css new file mode 100644 index 0000000..cbb58a0 --- /dev/null +++ b/docs/linuwial.css @@ -0,0 +1,877 @@ +/* @group Fundamentals */ + +* { margin: 0; padding: 0 } + +/* Is this portable? */ +html { + background-color: white; + width: 100%; + height: 100%; +} + +body { + background: #fefefe; + color: #111; + text-align: left; + min-height: 100vh; + position: relative; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1, "liga" 0; + -moz-font-feature-settings: "kern" 1, "liga" 0; + -o-font-feature-settings: "kern" 1, "liga" 0; + font-feature-settings: "kern" 1, "liga" 0; + letter-spacing: 0.0015rem; +} + +#content a { + overflow-wrap: break-word; +} + +p { + margin: 0.8em 0; +} + +ul, ol { + margin: 0.8em 0 0.8em 2em; +} + +dl { + margin: 0.8em 0; +} + +dt { + font-weight: bold; +} +dd { + margin-left: 2em; +} + +a { text-decoration: none; } +a[href]:link { color: #9E358F; } +a[href]:visited {color: #6F5F9C; } +a[href]:hover { text-decoration:underline; } + +a[href].def:link, a[href].def:visited { color: rgba(69, 59, 97, 0.8); } +a[href].def:hover { color: rgb(78, 98, 114); } + +/* @end */ + +/* @group Show and hide with JS */ + +body.js-enabled .hide-when-js-enabled { + display: none; +} + +/* @end */ + + +/* @group responsive */ + +#package-header .caption { + margin: 0px 1em 0 2em; +} + +@media only screen and (min-width: 1280px) { + #content { + width: 63vw; + max-width: 1450px; + } + + #table-of-contents { + position: fixed; + max-width: 10vw; + top: 10.2em; + left: 2em; + bottom: 1em; + overflow-y: auto; + } + + #synopsis { + display: block; + position: fixed; + float: left; + top: 5em; + bottom: 1em; + right: 0; + max-width: 65vw; + overflow-y: auto; + /* Ensure that synopsis covers everything (including MathJAX markup) */ + z-index: 1; + } + + #synopsis .show { + border: 1px solid #5E5184; + padding: 0.7em; + max-height: 65vh; + } + +} + +@media only screen and (max-width: 1279px) { + #content { + width: 80vw; + } + + #synopsis { + display: block; + padding: 0; + position: relative; + margin: 0; + width: 100%; + } +} + +@media only screen and (max-width: 999px) { + #content { + width: 93vw; + } +} + + +/* menu for wider screens + + Display the package name at the left and the menu links at the right, + inline with each other: + The package name Source . Contents . Index +*/ +@media only screen and (min-width: 1000px) { + #package-header { + text-align: left; + white-space: nowrap; + height: 40px; + padding: 4px 1.5em 0px 1.5em; + overflow: visible; + + display: flex; + justify-content: space-between; + align-items: center; + } + + #package-header .caption { + display: inline-block; + margin: 0; + } + + #package-header ul.links { + margin: 0; + display: inline-table; + } + + #package-header .caption + ul.links { + margin-left: 1em; + } +} + +/* menu for smaller screens + +Display the package name on top of the menu links and center both elements: + The package name + Source . Contents . Index +*/ +@media only screen and (max-width: 999px) { + #package-header { + text-align: center; + padding: 6px 0 4px 0; + overflow: hidden; + } + + #package-header ul.links { + display: block; + text-align: center; + margin: 0; + + /* Hide scrollbar but allow scrolling menu links horizontally */ + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; + margin-bottom: -17px; + height: 50px; + } + + #package-header .caption { + display: block; + margin: 4px 0; + text-align: center; + } + + #package-header ul.links::-webkit-scrollbar { + display: none; + } + + #package-header ul.links li:first-of-type { + padding-left: 1em; + } + + #package-header ul.links li:last-of-type { + /* + The last link of the menu should offer the same distance to the right + as the #package-header enforces at the left. + */ + padding-right: 1em; + } + + #package-header .caption + ul.links { + padding-top: 9px; + } + + #module-header table.info { + float: none; + top: 0; + margin: 0 auto; + overflow: hidden; + max-width: 80vw; + } +} + +/* @end */ + + +/* @group Fonts & Sizes */ + +/* Basic technique & IE workarounds from YUI 3 + For reasons, see: + http://yui.yahooapis.com/3.1.1/build/cssfonts/fonts.css + */ + + body, button { + font: 400 14px/1.4 'PT Sans', + /* Fallback Font Stack */ + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen-Sans, + Cantarell, + 'Helvetica Neue', + sans-serif; + *font-size: medium; /* for IE */ + *font:x-small; /* for IE in quirks mode */ + } + +h1 { font-size: 146.5%; /* 19pt */ } +h2 { font-size: 131%; /* 17pt */ } +h3 { font-size: 116%; /* 15pt */ } +h4 { font-size: 100%; /* 13pt */ } +h5 { font-size: 100%; /* 13pt */ } + +table { + font-size:inherit; + font:100%; +} + +pre, code, kbd, samp, tt, .src { + font-family:monospace; +} + +.links, .link { + font-size: 85%; /* 11pt */ +} + +#module-header .caption { + font-size: 182%; /* 24pt */ +} + +#module-header .caption sup { + font-size: 80%; + font-weight: normal; +} + +#package-header #page-menu a:link, #package-header #page-menu a:visited { color: white; } + + +.info { + font-size: 90%; +} + + +/* @end */ + +/* @group Common */ + +.caption, h1, h2, h3, h4, h5, h6, summary { + font-weight: bold; + color: #5E5184; + margin: 1.5em 0 1em 0; +} + + +* + h1, * + h2, * + h3, * + h4, * + h5, * + h6 { + margin-top: 2em; +} + +h1 + h2, h2 + h3, h3 + h4, h4 + h5, h5 + h6 { + margin-top: inherit; +} + +ul li + li { + margin-top: 0.2rem; +} + +ul + p { + margin-top: 0.93em; +} + +p + ul { + margin-top: 0.5em; +} + +p { + margin-top: 0.7rem; +} + +ul, ol { + margin: 0.8em 0 0.8em 2em; +} + +ul.links { + list-style: none; + text-align: left; + font-size: 0.95em; +} + +#package-header ul.links, #package-header ul.links button { + font-size: 1rem; +} + +ul.links li { + display: inline; + white-space: nowrap; + padding: 0; +} + +ul.links > li + li:before { + content: '\00B7'; +} + +ul.links li a { + padding: 0.2em 0.5em; +} + +.hide { display: none; } +.show { display: inherit; } +.clear { clear: both; } + +.collapser:before, .expander:before, .noexpander:before { + font-size: 1.2em; + color: #9C5791; + display: inline-block; + padding-right: 7px; +} + +.collapser:before { + content: '▿'; +} +.expander:before { + content: '▹'; +} +.noexpander:before { + content: '▿'; + visibility: hidden; +} + +.collapser, .expander { + cursor: pointer; +} + +.instance.collapser, .instance.expander { + margin-left: 0px; + background-position: left center; + min-width: 9px; + min-height: 9px; +} + +summary { + cursor: pointer; + outline: none; +} + +pre { + padding: 0.5rem 1rem; + margin: 1em 0 0 0; + background-color: #f7f7f7; + overflow: auto; + border: 1px solid #ddd; + border-radius: 0.3em; +} + +pre + p { + margin-top: 1em; +} + +pre + pre { + margin-top: 0.5em; +} + +blockquote { + border-left: 3px solid #c7a5d3; + background-color: #eee4f1; + margin: 0.5em; + padding: 0.0005em 0.3em 0.5em 0.5em; +} + +.src { + background: #f2f2f2; + padding: 0.2em 0.5em; +} + +.keyword { font-weight: normal; } +.def { font-weight: bold; } + +@media print { + #footer { display: none; } +} + +/* @end */ + +/* @group Page Structure */ + +#content { + margin: 3em auto 6em auto; + padding: 0; +} + +#package-header { + background: #5E5184; + border-bottom: 5px solid rgba(69, 59, 97, 0.5); + color: #ddd; + position: relative; + font-size: 1.2em; + text-align: left; + margin: 0 auto; +} + +#package-header .caption { + color: white; + font-style: normal; + font-size: 1rem; + font-weight: bold; +} + +#module-header .caption { + font-weight: bold; + border-bottom: 1px solid #ddd; +} + +table.info { + float: right; + padding: 0.5em 1em; + border: 1px solid #ddd; + color: rgb(78,98,114); + background-color: #fff; + max-width: 60%; + border-spacing: 0; + position: relative; + top: -0.78em; + margin: 0 0 0 2em; +} + +.info th { + padding: 0 1em 0 0; + text-align: right; +} + +#style-menu li { + display: block; + border-style: none; + list-style-type: none; +} + +#footer { + background: #ededed; + border-top: 1px solid #aaa; + padding: 0.5em 0; + color: #222; + text-align: center; + width: 100%; + height: 3em; + margin-top: 3em; + position: relative; + clear: both; +} + +/* @end */ + +/* @group Front Matter */ + +#synopsis .caption, +#contents-list .caption { + font-size: 1rem; +} + +#synopsis, #table-of-contents { + font-size: 16px; +} + +#contents-list { + background: #f4f4f4; + padding: 1em; + margin: 0; +} + +#contents-list .caption { + text-align: left; + margin: 0; +} + +#contents-list ul { + list-style: none; + margin: 0; + margin-top: 10px; + font-size: 14px; +} + +#contents-list ul ul { + margin-left: 1.5em; +} + +#description .caption { + display: none; +} + +#synopsis summary { + display: block; + float: right; + width: 29px; + color: rgba(255,255,255,0); + height: 110px; + margin: 0; + font-size: 1px; + padding: 0; + background: url(synopsis.png) no-repeat 0px -8px; +} + +#synopsis details[open] > summary { + background: url(synopsis.png) no-repeat -75px -8px; +} + +#synopsis ul { + height: 100%; + overflow: auto; + padding: 0.5em; + margin: 0; +} + +#synopsis ul ul { + overflow: hidden; +} + +#synopsis ul, +#synopsis ul li.src { + background-color: rgb(250,247,224); + white-space: nowrap; + list-style: none; + margin-left: 0; +} + +#interface td.src { + white-space: nowrap; +} + +/* @end */ + +/* @group Main Content */ + +#interface div.top + div.top { + margin-top: 1.5em; +} + +#interface p + div.top, +#interface h1 + div.top, +#interface h2 + div.top, +#interface h3 + div.top, +#interface h4 + div.top, +#interface h5 + div.top { + margin-top: 1em; +} +#interface .src .selflink, +#interface .src .link { + float: right; + color: #888; + padding: 0 7px; + -moz-user-select: none; + font-weight: bold; + line-height: 30px; +} +#interface .src .selflink { + margin: 0 -0.5em 0 0.5em; +} + +#interface span.fixity { + color: #919191; + border-left: 1px solid #919191; + padding: 0.2em 0.5em 0.2em 0.5em; + margin: 0 -1em 0 1em; +} + +#interface span.rightedge { + border-left: 1px solid #919191; + padding: 0.2em 0 0.2em 0; + margin: 0 0 0 1em; +} + +#interface table { border-spacing: 2px; } +#interface td { + vertical-align: top; + padding-left: 0.5em; +} + +#interface td.doc p { + margin: 0; +} +#interface td.doc p + p { + margin-top: 0.8em; +} + +.doc table { + border-collapse: collapse; + border-spacing: 0px; +} + +.doc th, +.doc td { + padding: 5px; + border: 1px solid #ddd; +} + +.doc th { + background-color: #f0f0f0; +} + +.clearfix:after { + clear: both; + content: " "; + display: block; + height: 0; + visibility: hidden; +} + +.subs, .top > .doc, .subs > .doc { + padding-left: 1em; + border-left: 1px solid gainsboro; + margin-bottom: 1em; +} + +.top .subs { + margin-bottom: 0.6em; +} + +.subs.fields ul { + list-style: none; + display: table; + margin: 0; +} + +.subs.fields ul li { + display: table-row; +} + +.subs ul li dfn { + display: table-cell; + font-style: normal; + font-weight: bold; + margin: 1px 0; + white-space: nowrap; +} + +.subs ul li > .doc { + display: table-cell; + padding-left: 0.5em; + margin-bottom: 0.5em; +} + +.subs ul li > .doc p { + margin: 0; +} + +.subs .subs p.src { + border: none; + background-color: #f8f8f8; +} + +.subs .subs .caption { + margin-top: 1em ; + margin-bottom: 0px; +} + +.subs p.caption { + margin-top: 0; +} + +.subs .subs .caption + .src { + margin: 0px; + margin-top: 8px; +} + +.subs .subs .src + .src { + margin: 7px 0 0 0; +} + +/* Render short-style data instances */ +.inst ul { + height: 100%; + padding: 0.5em; + margin: 0; +} + +.inst, .inst li { + list-style: none; + margin-left: 1em; +} + +/* Workaround for bug in Firefox (issue #384) */ +.inst-left { + float: left; +} + +.top p.src { + border-bottom: 3px solid #e5e5e5; + line-height: 2rem; + margin-bottom: 1em; +} + +.warning { + color: red; +} + +.arguments { + margin-top: -0.4em; +} +.arguments .caption { + display: none; +} + +.fields { padding-left: 1em; } + +.fields .caption { display: none; } + +.fields p { margin: 0 0; } + +/* this seems bulky to me +.methods, .constructors { + background: #f8f8f8; + border: 1px solid #eee; +} +*/ + +/* @end */ + +/* @group Auxillary Pages */ + + +.extension-list { + list-style-type: none; + margin-left: 0; +} + +#mini { + margin: 0 auto; + padding: 0 1em 1em; +} + +#mini > * { + font-size: 93%; /* 12pt */ +} + +#mini #module-list .caption, +#mini #module-header .caption { + font-size: 125%; /* 15pt */ +} + +#mini #interface h1, +#mini #interface h2, +#mini #interface h3, +#mini #interface h4 { + font-size: 109%; /* 13pt */ + margin: 1em 0 0; +} + +#mini #interface .top, +#mini #interface .src { + margin: 0; +} + +#mini #module-list ul { + list-style: none; + margin: 0; +} + +#alphabet ul { + list-style: none; + padding: 0; + margin: 0.5em 0 0; + text-align: center; +} + +#alphabet li { + display: inline; + margin: 0 0.25em; +} + +#alphabet a { + font-weight: bold; +} + +#index .caption, +#module-list .caption { font-size: 131%; /* 17pt */ } + +#index table { + margin-left: 2em; +} + +#index .src { + font-weight: bold; +} +#index .alt { + font-size: 77%; /* 10pt */ + font-style: italic; + padding-left: 2em; +} + +#index td + td { + padding-left: 1em; +} + +#module-list ul { + list-style: none; + margin: 0 0 0 2em; +} + +#module-list li { + clear: right; +} + +#module-list span.collapser, +#module-list span.expander { + background-position: 0 0.3em; +} + +#module-list .package { + float: right; +} + +:target { + background: -webkit-linear-gradient(top, transparent 0%, transparent 65%, #fbf36d 60%, #fbf36d 100%); + background: -moz-linear-gradient(top, transparent 0%, transparent 65%, #fbf36d 60%, #fbf36d 100%); + background: -o-linear-gradient(top, transparent 0%, transparent 65%, #fbf36d 60%, #fbf36d 100%); + background: -ms-linear-gradient(top, transparent 0%, transparent 65%, #fbf36d 60%, #fbf36d 100%); + background: linear-gradient(to bottom, transparent 0%, transparent 65%, #fbf36d 60%, #fbf36d 100%); +} + +:target:hover { + background: -webkit-linear-gradient(top, transparent 0%, transparent 0%, #fbf36d 0%, #fbf36d 100%); + background: -moz-linear-gradient(top, transparent 0%, transparent 0%, #fbf36d 0%, #fbf36d 100%); + background: -o-linear-gradient(top, transparent 0%, transparent 0%, #fbf36d 0%, #fbf36d 100%); + background: -ms-linear-gradient(top, transparent 0%, transparent 0%, #fbf36d 0%, #fbf36d 100%); + background: linear-gradient(to bottom, transparent 0%, transparent 0%, #fbf36d 0%, #fbf36d 100%); +} + +/* @end */ + +/* @group Dropdown menus */ + +#preferences-menu, #style-menu { + width: 25em; + overflow-y: auto; +} + +/* @end */ diff --git a/docs/meta.json b/docs/meta.json new file mode 100644 index 0000000..31e7dc4 --- /dev/null +++ b/docs/meta.json @@ -0,0 +1 @@ +{"haddock_version":"2.24.0","quickjump_version":1} \ No newline at end of file diff --git a/docs/quick-jump.css b/docs/quick-jump.css new file mode 100644 index 0000000..8772809 --- /dev/null +++ b/docs/quick-jump.css @@ -0,0 +1,220 @@ +/* @group Fundamentals */ + +.hidden { + display: none; +} + +/* @end */ + +/* @group Search box layout */ + +#search { + position: fixed; + top: 3.2em; + bottom: 0; + left: calc(50% - 22em); + width: 44em; + z-index: 1000; + pointer-events: none; + overflow-y: auto; +} + +@media only screen and (max-width: 999px) { + #search { + top: 5.7em; + } +} + +#search-form, #search-results { + box-shadow: 2px 2px 6px rgb(199, 204, 208); + pointer-events: all; +} + +#search-form input { + font-size: 1.25em; line-height: 2.3em; height: 2.4em; + display: block; + box-sizing: border-box; + width: 100%; + margin: 0; + padding: 0 0.75em; + border: 0.05em solid rgb(151, 179, 202); +} + +#search input:focus { + outline: none; +} + +#search p.error { + color: rgb(107, 24, 24); + font-weight: bold; +} + +#search-results { + box-sizing: border-box; + border: 0.05em solid #b2d5fb; + background: #e8f3ff; +} + +#search-form input + #search-results { + border-top: none; + top: 3em; + max-height: calc(100% - 3em); +} + +/* @end */ + +/* @group search results */ + +#search-results > ul { + margin: 0; + list-style: none; +} + +#search-results > ul > li, +#search-results > p, +#search-results > table { + padding: 0.5em 1em; + margin: 0; +} + +#search-results > ul > li { + border-bottom: 1px solid #b2d5fb; +} + +#search-results > ul > li > ul { + list-style: none; +} + +.search-module h4 { + margin: 0; +} + +.search-module > ul { + margin: 0.5em 0 0.5em 2em; +} + +.search-module > ul > li > a[href] { + display: block; + color: inherit; + padding: 0.25em 0.5em; +} + +.search-module > ul > li > a[href].active-link { + background: #faf9dc; +} + +.search-module a[href]:hover { + text-decoration: none; +} + +.search-result a a { + pointer-events: none; +} + +.search-result ul.subs { + display: inline-block; + margin: 0; padding: 0; +} + +.search-result ul.subs li { + display: none; +} + +.search-result ul.subs::after { + display: inline-block; + content: "..."; + color: rgb(78,98,114); + margin: 0 0.25em; +} + +.more-results { + color: rgb(99, 141, 173); + position: relative; +} + +.more-results::before { + content: "+"; + display: inline-block; + color: #b2d5fb; + font-weight: bold; + font-size: 1.25em; line-height: inherit; + position: absolute; + left: -1em; +} + +/* @end */ + +/* @group Keyboard shortcuts table */ + +.keyboard-shortcuts { + line-height: 1.6em; +} + +.keyboard-shortcuts th { + color: rgb(78,98,114); +} + +.keyboard-shortcuts td:first-child, +.keyboard-shortcuts th:first-child { + text-align: right; + padding-right: 0.6em; +} + +.key { + display: inline-block; + font-size: 0.9em; + min-width: 0.8em; line-height: 1.2em; + text-align: center; + background: #b2d5fb; + border: 1px solid #74a3d6; + padding: 0 0.2em; + margin: 0 0.1em; +} + +/* @end */ + +/* @group Dropdown menus */ + +/* Based on #search styling above. */ + +.dropdown-menu { + position: fixed; + /* Not robust to window size changes. */ + top: 3.2em; + right: 0; + /* To display on top of synopsis menu on right side. */ + z-index: 1000; + border: 0.05em solid #b2d5fb; + background: #e8f3ff; +} + +@media only screen and (max-width: 999px) { + .dropdown-menu { + top: 5.7em; + } +} + +.dropdown-menu * { + margin: 0.1em; +} + +.dropdown-menu button { + border: 1px #5E5184 solid; + border-radius: 3px; + background: #5E5184; + padding: 3px; + color: #f4f4f4; + min-width: 6em; +} + +.dropdown-menu button:hover { + color: #5E5184; + background: #f4f4f4; +} + +.dropdown-menu button:active { + color: #f4f4f4; + background: #5E5184; +} + +/* @end */ diff --git a/docs/quick-jump.min.js b/docs/quick-jump.min.js new file mode 100644 index 0000000..06c35c7 --- /dev/null +++ b/docs/quick-jump.min.js @@ -0,0 +1,2 @@ +!function i(s,a,l){function c(t,e){if(!a[t]){if(!s[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(u)return u(t,!0);var o=new Error("Cannot find module '"+t+"'");throw o.code="MODULE_NOT_FOUND",o}var r=a[t]={exports:{}};s[t][0].call(r.exports,function(e){return c(s[t][1][e]||e)},r,r.exports,i,s,a,l)}return a[t].exports}for(var u="function"==typeof require&&require,e=0;ewindow.innerHeight?this.searchResults.scrollTop+=e.bottom-window.innerHeight+80:e.topn)return u(e,this.pattern,o);var r=this.options,i=r.location,s=r.distance,a=r.threshold,l=r.findAllMatches,c=r.minMatchCharLength;return h(e,this.pattern,this.patternAlphabet,{location:i,distance:s,threshold:a,findAllMatches:l,minMatchCharLength:c})}}]),m}();e.exports=r},function(e,t,n){"use strict";var u=n(0);e.exports=function(e,t){return function e(t,n,o){if(n){var r=n.indexOf("."),i=n,s=null;-1!==r&&(i=n.slice(0,r),s=n.slice(r+1));var a=t[i];if(null!=a)if(s||"string"!=typeof a&&"number"!=typeof a)if(u(a))for(var l=0,c=a.length;l 0 and <= 1");d=d.name}else a[d]={weight:1};this._analyze({key:d,value:this.options.getFn(u,d),record:u,index:l},{resultMap:o,results:r,tokenSearchers:e,fullSearcher:t})}return{weights:a,results:r}}},{key:"_analyze",value:function(e,t){var n=e.key,o=e.arrayIndex,r=void 0===o?-1:o,i=e.value,s=e.record,a=e.index,l=t.tokenSearchers,c=void 0===l?[]:l,u=t.fullSearcher,h=void 0===u?[]:u,p=t.resultMap,d=void 0===p?{}:p,f=t.results,v=void 0===f?[]:f;if(null!=i){var g=!1,_=-1,m=0;if("string"==typeof i){this._log("\nKey: "+(""===n?"-":n));var y=h.search(i);if(this._log('Full text: "'+i+'", score: '+y.score),this.options.tokenize){for(var k=i.split(this.options.tokenSeparator),b=[],x=0;x=c.length;if(this._log("\nCheck Matches: "+O),(g||y.isMatch)&&O){var P=d[a];P?P.output.push({key:n,arrayIndex:r,value:i,score:T,matchedIndices:y.matchedIndices}):(d[a]={item:s,output:[{key:n,arrayIndex:r,value:i,score:T,matchedIndices:y.matchedIndices}]},v.push(d[a]))}}else if(U(i))for(var j=0,E=i.length;jC= zM<1l`P*ti@DN=8G*O#bz+jC}rY+^ep7m*^>5{KP$&YU^l+1+ox-~ax(wL(bYC;0o8 z5ke@1Ke&K@`bUl9z?YPc&o4aqgZxSU0&l^*?WW2+#H;3f=Z)DHXx z?8H@Ia>3~YGkY7eLeX>2Bv;+Gv}kUDy(PPzceVat-SbYQcwKTA_7c7gT?UR`({x`; zUl-%HC!z>Svg!#m>x=WgER8eb&|Ak-+yNkZHS}%+W?v{b@S$Xt=8YVCfM9J{?-gwk zAzrvnH>`t4@3)a-cQCO(h@j#=HejY>7+%J4GIN=q$?lsVY{0UI+P}NZqmJXa7aQ4t zp&cbJR7ZHp>;cU<%YSzv&fA`>0<_tK7;npsbQ4utU|;ERB}sgTzX$^UBi|FDwwES8 z-bLXz62$!vX!N7O!v7Fmxt5k*lW`-wTIGpvoxf?xP?{WmHQX3NS^g?G;s`c#B?68# za`}D)J7%Urh@R^M>;h%?SJuwYP68#oeRyvV^yB2KtG%sOVaz$k)^Y9aX7(Jl7+=HMl>I_@5?nWjRl#?h?`T-~+HidzINFiT zCo4PG^W$`e`!9R`C3D!OyVyIlXHa&JJACI^Z~A>e91Q_J>I@5f-6@u#V0Po~{~MYy z%4jmIp{Pd1Q*>FJQImeAEcK2Y2a1bN#Z)P~q?8*I6;SX0j;ZD~`Cd6jK3|r)AJb|= z#xe7A^rhz%(&&~xnD|kI-}#!rFZL|uO*2hQ!mF4QQ|kL9$Q~jGz7nBwN3)>b??i^Tq&WA!Uyq~iTi-gulFAaDblPGP$MHB&~R`*87Ck&;4GM=Y#jOI!^&$U&-Pbh zb8(@buCcVz93dq8mwwVF7z$pkcVQ&@N2hDTk;Nn5ksxpy6h$#9d_zdyEKE(`n3ohR&jyBl8Qnn*^r*1)4=Px6s^1^Cg-k zGrWftJ&n(TxdGj? zFoXr(kywTc*H=-oWR)Kk%XLxNF4>QsZkL_1EjOLY(@M#%Y}V_Qt$Ia1ZaC5@Z9d*A zSM0{N+M5%7(1+!L#x*HmAEjDL6T3rmSF_KeG(?M=lc6@h*vM&I$TY`)qdBHZ%n*_!GnJ~ Z&X5<m2xjNN-At19!u2H9{}<8xw08gi literal 0 HcmV?d00001 diff --git a/docs/src/Data.Singletons.Dict.html b/docs/src/Data.Singletons.Dict.html new file mode 100644 index 0000000..c09512c --- /dev/null +++ b/docs/src/Data.Singletons.Dict.html @@ -0,0 +1,898 @@ +
{-# LANGUAGE LambdaCase      #-}
+{-# LANGUAGE RankNTypes      #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE ViewPatterns    #-}
+
+module Data.Singletons.Dict
+       (
+         mkTotalDictGetter
+       , mkPartialDictGetter
+       ) where
+
+import Data.Bifunctor (bimap, first, second)
+import Data.Bool (bool)
+import Data.Char (toLower)
+import Data.Constraint (Dict (..))
+import Data.Foldable (traverse_)
+import Data.Typeable (Typeable)
+import Language.Haskell.TH
+
+
+-- | Generates 'Dict' getters for the promoted nullary data constructors corresponding to
+-- a @singletons@-like type.
+--
+-- __All the promoted data constructors must be instances of the given type class.__
+--
+-- The names of the getters result from the concatenation of:
+--
+-- * the camel-cased name of the base type,
+-- * the name of the type class,
+-- * the "'Dict'" keyword,
+-- * the \"A\" suffix, for the contextual getter.
+--
+-- /Example:/
+--
+-- Given this type:
+--
+-- @
+-- data Example = Foo | Bar | Baz
+-- @
+--
+-- and the corresponding @singletons@-like type:
+--
+-- @
+-- data SExample (example :: Example) where
+--     SFoo :: SExample 'Foo
+--     SBar :: SExample 'Bar
+--     SBaz :: SExample 'Baz
+-- @
+--
+-- this line:
+--
+-- @
+-- \$(mkTotalDictGetter ''SExample '''Typeable')
+-- @
+--
+-- generates those getters:
+--
+-- @
+-- exampleTypeableDict :: SExample example -> 'Dict' ('Typeable' example)
+-- exampleTypeableDict sing =
+--     case sing of
+--         SFoo -> 'Dict'
+--         SBar -> 'Dict'
+--         SBaz -> 'Dict'
+--
+-- exampleTypeableDictA :: 'Applicative' f => SExample example -> f ('Dict' ('Typeable' example))
+-- exampleTypeableDictA sing =
+--     case sing of
+--         SFoo -> 'pure' 'Dict'
+--         SBar -> 'pure' 'Dict'
+--         SBaz -> 'pure' 'Dict'
+-- @
+mkTotalDictGetter
+    :: Name
+    -- ^ The 'Name' of a @singletons@-like type.
+    -> Name
+    -- ^ The 'Name' of a type class.
+    -> Q [Dec]
+mkTotalDictGetter :: Name -> Name -> Q [Dec]
+mkTotalDictGetter Name
+singTypeName Name
+className = Name -> Q Info
+reify Name
+singTypeName Q Info -> (Info -> Q [Dec]) -> Q [Dec]
+forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
+>>= \case
+    TyConI (DataD [] Name
+_ [ KindedTV Name
+_ (ConT Name
+baseTypeName) ] Maybe Pred
+Nothing [Con]
+cons []) -> do
+        Name -> Q ()
+checkSingleParamClassName Name
+className
+        ([Name]
+conSingNames, [Pred]
+conTypes) <- [(Name, Pred)] -> ([Name], [Pred])
+forall a b. [(a, b)] -> ([a], [b])
+unzip ([(Name, Pred)] -> ([Name], [Pred]))
+-> Q [(Name, Pred)] -> Q ([Name], [Pred])
+forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
+<$> (Con -> Q (Name, Pred)) -> [Con] -> Q [(Name, Pred)]
+forall (t :: * -> *) (f :: * -> *) a b.
+(Traversable t, Applicative f) =>
+(a -> f b) -> t a -> f (t b)
+traverse Con -> Q (Name, Pred)
+singConData [Con]
+cons
+        (Pred -> Q ()) -> [Pred] -> Q ()
+forall (t :: * -> *) (f :: * -> *) a b.
+(Foldable t, Applicative f) =>
+(a -> f b) -> t a -> f ()
+traverse_ Pred -> Q ()
+checkConTypeInstance [Pred]
+conTypes
+
+        let singType :: TypeQ
+singType      = Name -> TypeQ
+conT Name
+singTypeName
+        let classType :: TypeQ
+classType     = Name -> TypeQ
+conT Name
+className
+        let baseFunName :: Name
+baseFunName   = Name -> Name -> String -> Name
+mkGetterName Name
+baseTypeName Name
+className String
+"Dict"
+        let liftedFunName :: Name
+liftedFunName = Name -> Name -> String -> Name
+mkGetterName Name
+baseTypeName Name
+className String
+"DictA"
+
+        [Q Dec] -> Q [Dec]
+forall (t :: * -> *) (m :: * -> *) a.
+(Traversable t, Monad m) =>
+t (m a) -> m (t a)
+sequence
+            [ Name -> TypeQ -> Q Dec
+sigD
+                Name
+baseFunName
+                [t| forall a. $singType a -> Dict ($classType a) |]
+            , Name -> [(Name, BodyQ)] -> Q Dec
+mkGetterBody
+                Name
+baseFunName
+                ([Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+conSingNames ([BodyQ] -> [(Name, BodyQ)]) -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. (a -> b) -> a -> b
+$ BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| Dict |]))
+            , Name -> TypeQ -> Q Dec
+sigD
+                Name
+liftedFunName
+                 [t| forall a f. Applicative f => $singType a -> f (Dict ($classType a)) |]
+            , Name -> [(Name, BodyQ)] -> Q Dec
+mkGetterBody
+                Name
+liftedFunName
+                ([Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+conSingNames ([BodyQ] -> [(Name, BodyQ)]) -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. (a -> b) -> a -> b
+$ BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| pure Dict |]))
+            ]
+
+    Info
+invalid -> String -> Q [Dec]
+forall (m :: * -> *) a. MonadFail m => String -> m a
+fail (String -> Q [Dec]) -> String -> Q [Dec]
+forall a b. (a -> b) -> a -> b
+$ Name -> Info -> String
+invalidTypeError Name
+singTypeName Info
+invalid
+  where
+    checkConTypeInstance :: Type -> Q ()
+    checkConTypeInstance :: Pred -> Q ()
+checkConTypeInstance Pred
+conType
+        = Q Bool -> Q () -> Q ()
+forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
+unlessM (Name -> Pred -> Q Bool
+isInstance' Name
+className Pred
+conType)
+        (Q () -> Q ()) -> Q () -> Q ()
+forall a b. (a -> b) -> a -> b
+$ String -> Q ()
+forall (m :: * -> *) a. MonadFail m => String -> m a
+fail
+        (String -> Q ()) -> String -> Q ()
+forall a b. (a -> b) -> a -> b
+$ String
+typeName String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+" is not an instance of `" String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> Name -> String
+nameBase Name
+className String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+"'."
+      where
+        typeName :: String
+typeName = case Pred
+conType of
+            ConT Name
+name      -> Name -> String
+quotedName Name
+name
+            PromotedT Name
+name -> Name -> String
+quotedName Name
+name
+            Pred
+_              -> Pred -> String
+forall a. Show a => a -> String
+show Pred
+conType
+
+-- | Generates 'Dict' getters for the promoted nullary data constructors corresponding to
+-- a @singletons@-like type.
+--
+-- __Not all the promoted data constructors must be instances of the given type class.__
+--
+-- The name of the getters results from the concatenation of:
+--
+-- * the camel-cased name of the base type,
+-- * the name of the type class,
+-- * the "'Dict'" keyword,
+-- * the \"A\" suffix, for the contextual getter.
+--
+-- /Example:/
+--
+-- Given this type:
+--
+-- @
+-- data Example = Foo | Bar | Baz
+-- @
+--
+-- the corresponding @singletons@-like type:
+--
+-- @
+-- data SExample (example :: Example) where
+--     SFoo :: SExample 'Foo
+--     SBar :: SExample 'Bar
+--     SBaz :: SExample 'Baz
+-- @
+--
+-- and this type class and instance:
+--
+-- @
+-- class IsBar (a :: k) where
+--
+-- instance IsBar 'Bar where
+-- @
+--
+-- this line:
+--
+-- @
+-- \$(mkPartialDictGetter ''SExample ''IsBar)
+-- @
+--
+-- generates those getters:
+--
+-- @
+-- exampleIsBarDict :: SExample example -> 'Maybe' ('Dict' (IsBar example))
+-- exampleIsBarDict sing =
+--     case sing of
+--         SFoo -> 'Nothing'
+--         SBar -> 'Just' 'Dict'
+--         SBaz -> 'Nothing'
+--
+-- exampleIsBarDictA :: 'Applicative' f => SExample example -> f ('Maybe' ('Dict' (IsBar example)))
+-- exampleIsBarDictA sing =
+--     case sing of
+--         SFoo -> 'pure' 'Nothing'
+--         SBar -> 'pure' ('Just' 'Dict')
+--         SBaz -> 'pure' 'Nothing'
+-- @
+mkPartialDictGetter
+    :: Name
+    -- ^ The 'Name' of a @singletons@-like type.
+    -> Name
+    -- ^ The 'Name' of a type class.
+    -> Q [Dec]
+mkPartialDictGetter :: Name -> Name -> Q [Dec]
+mkPartialDictGetter Name
+singTypeName Name
+className = Name -> Q Info
+reify Name
+singTypeName Q Info -> (Info -> Q [Dec]) -> Q [Dec]
+forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
+>>= \case
+    TyConI (DataD [] Name
+_ [ KindedTV Name
+_ (ConT Name
+baseTypeName) ] Maybe Pred
+Nothing [Con]
+cons []) -> do
+        Name -> Q ()
+checkSingleParamClassName Name
+className
+        ([(Name, Pred)], [(Name, Pred)])
+cons' <- (Con -> Q (Name, Pred)) -> [Con] -> Q [(Name, Pred)]
+forall (t :: * -> *) (f :: * -> *) a b.
+(Traversable t, Applicative f) =>
+(a -> f b) -> t a -> f (t b)
+traverse Con -> Q (Name, Pred)
+singConData [Con]
+cons Q [(Name, Pred)]
+-> ([(Name, Pred)] -> Q ([(Name, Pred)], [(Name, Pred)]))
+-> Q ([(Name, Pred)], [(Name, Pred)])
+forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
+>>= ((Name, Pred) -> Q Bool)
+-> [(Name, Pred)] -> Q ([(Name, Pred)], [(Name, Pred)])
+forall (m :: * -> *) a.
+Monad m =>
+(a -> m Bool) -> [a] -> m ([a], [a])
+partitionM (Name -> Pred -> Q Bool
+isInstance' Name
+className (Pred -> Q Bool)
+-> ((Name, Pred) -> Pred) -> (Name, Pred) -> Q Bool
+forall b c a. (b -> c) -> (a -> b) -> a -> c
+. (Name, Pred) -> Pred
+forall a b. (a, b) -> b
+snd)
+
+        let singType :: TypeQ
+singType      = Name -> TypeQ
+conT Name
+singTypeName
+        let classType :: TypeQ
+classType     = Name -> TypeQ
+conT Name
+className
+        let baseFunName :: Name
+baseFunName   = Name -> Name -> String -> Name
+mkGetterName Name
+baseTypeName Name
+className String
+"Dict"
+        let liftedFunName :: Name
+liftedFunName = Name -> Name -> String -> Name
+mkGetterName Name
+baseTypeName Name
+className String
+"DictA"
+        let ([Name]
+dictSingNames, [Name]
+voidSingNames) = ([(Name, Pred)] -> [Name])
+-> ([(Name, Pred)] -> [Name])
+-> ([(Name, Pred)], [(Name, Pred)])
+-> ([Name], [Name])
+forall (p :: * -> * -> *) a b c d.
+Bifunctor p =>
+(a -> b) -> (c -> d) -> p a c -> p b d
+bimap (((Name, Pred) -> Name) -> [(Name, Pred)] -> [Name]
+forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
+fmap (Name, Pred) -> Name
+forall a b. (a, b) -> a
+fst) (((Name, Pred) -> Name) -> [(Name, Pred)] -> [Name]
+forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
+fmap (Name, Pred) -> Name
+forall a b. (a, b) -> a
+fst) ([(Name, Pred)], [(Name, Pred)])
+cons'
+
+        [Q Dec] -> Q [Dec]
+forall (t :: * -> *) (m :: * -> *) a.
+(Traversable t, Monad m) =>
+t (m a) -> m (t a)
+sequence
+            [ Name -> TypeQ -> Q Dec
+sigD
+                Name
+baseFunName
+                [t| forall a. $singType a -> Maybe (Dict ($classType a)) |]
+            , Name -> [(Name, BodyQ)] -> Q Dec
+mkGetterBody
+                Name
+baseFunName
+                ( [Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+voidSingNames (BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| Nothing |])) [(Name, BodyQ)] -> [(Name, BodyQ)] -> [(Name, BodyQ)]
+forall a. Semigroup a => a -> a -> a
+<>
+                  [Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+dictSingNames (BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| Just Dict |]))
+                )
+            , Name -> TypeQ -> Q Dec
+sigD
+                Name
+liftedFunName
+                [t| forall a f. Applicative f => $singType a -> f (Maybe (Dict ($classType a))) |]
+            , Name -> [(Name, BodyQ)] -> Q Dec
+mkGetterBody
+                Name
+liftedFunName
+                ( [Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+voidSingNames (BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| pure Nothing |])) [(Name, BodyQ)] -> [(Name, BodyQ)] -> [(Name, BodyQ)]
+forall a. Semigroup a => a -> a -> a
+<>
+                  [Name] -> [BodyQ] -> [(Name, BodyQ)]
+forall a b. [a] -> [b] -> [(a, b)]
+zip [Name]
+dictSingNames (BodyQ -> [BodyQ]
+forall a. a -> [a]
+repeat (ExpQ -> BodyQ
+normalB [e| pure (Just Dict) |]))
+                )
+            ]
+
+    Info
+invalid -> String -> Q [Dec]
+forall (m :: * -> *) a. MonadFail m => String -> m a
+fail (String -> Q [Dec]) -> String -> Q [Dec]
+forall a b. (a -> b) -> a -> b
+$ Name -> Info -> String
+invalidTypeError Name
+singTypeName Info
+invalid
+
+
+mkGetterName :: Name -> Name -> String -> Name
+mkGetterName :: Name -> Name -> String -> Name
+mkGetterName (Name -> String
+nameBase -> String
+baseTypeName) (Name -> String
+nameBase -> String
+className) String
+suffix
+     = String -> Name
+mkName
+     (String -> Name) -> String -> Name
+forall a b. (a -> b) -> a -> b
+$ Char -> Char
+toLower (String -> Char
+forall a. [a] -> a
+head String
+baseTypeName)
+     Char -> String -> String
+forall a. a -> [a] -> [a]
+: String -> String
+forall a. [a] -> [a]
+tail String
+baseTypeName
+    String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+className
+    String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+suffix
+
+mkGetterBody :: Name -> [(Name, BodyQ)] -> DecQ
+mkGetterBody :: Name -> [(Name, BodyQ)] -> Q Dec
+mkGetterBody Name
+name [(Name, BodyQ)]
+matches
+    = Name -> [ClauseQ] -> Q Dec
+funD Name
+name
+    [ [PatQ] -> BodyQ -> [Q Dec] -> ClauseQ
+clause
+        [ Name -> PatQ
+varP Name
+paramName ]
+        (ExpQ -> BodyQ
+normalB (ExpQ -> [MatchQ] -> ExpQ
+caseE (Name -> ExpQ
+varE Name
+paramName) ((Name, BodyQ) -> MatchQ
+mkCaseMatch ((Name, BodyQ) -> MatchQ) -> [(Name, BodyQ)] -> [MatchQ]
+forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
+<$> [(Name, BodyQ)]
+matches)))
+        []
+    ]
+  where
+    paramName :: Name
+    paramName :: Name
+paramName = String -> Name
+mkName String
+"sing"
+
+    mkCaseMatch :: (Name, BodyQ) -> MatchQ
+    mkCaseMatch :: (Name, BodyQ) -> MatchQ
+mkCaseMatch (Name
+singName, BodyQ
+body) = PatQ -> BodyQ -> [Q Dec] -> MatchQ
+match (Name -> [PatQ] -> PatQ
+conP Name
+singName []) BodyQ
+body []
+
+
+singConData :: Con -> Q (Name, Type)
+singConData :: Con -> Q (Name, Pred)
+singConData Con
+con = case Con
+con of
+    GadtC [ Name
+singName ] [] (AppT Pred
+_ Pred
+baseType) -> (Name, Pred) -> Q (Name, Pred)
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure (Name
+singName, Pred
+baseType)
+    Con
+_ -> String -> Q (Name, Pred)
+forall (m :: * -> *) a. MonadFail m => String -> m a
+fail (String -> Q (Name, Pred)) -> String -> Q (Name, Pred)
+forall a b. (a -> b) -> a -> b
+$ String -> String -> String
+expectationError String
+"nullary GADT data constructor" (Con -> String
+conLabel Con
+con)
+
+checkSingleParamClassName :: Name -> Q ()
+checkSingleParamClassName :: Name -> Q ()
+checkSingleParamClassName Name
+name = Name -> Q Info
+reify Name
+name Q Info -> (Info -> Q ()) -> Q ()
+forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
+>>= \case
+    ClassI (ClassD [Pred]
+_ Name
+_ [ TyVarBndr
+_ ] [FunDep]
+_ [Dec]
+_) [Dec]
+_ -> () -> Q ()
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure ()
+    Info
+invalid -> String -> Q ()
+forall (m :: * -> *) a. MonadFail m => String -> m a
+fail (String -> Q ()) -> String -> Q ()
+forall a b. (a -> b) -> a -> b
+$ Name -> Info -> String
+invalidClassError Name
+name Info
+invalid
+
+isInstance' :: Name ->  Type -> Q Bool
+isInstance' :: Name -> Pred -> Q Bool
+isInstance' Name
+className
+    | Name
+className Name -> Name -> Bool
+forall a. Eq a => a -> a -> Bool
+== ''Typeable
+    = Q Bool -> Pred -> Q Bool
+forall a b. a -> b -> a
+const (Q Bool -> Pred -> Q Bool) -> Q Bool -> Pred -> Q Bool
+forall a b. (a -> b) -> a -> b
+$ Bool -> Q Bool
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure Bool
+True
+    | Bool
+otherwise
+    = Name -> [Pred] -> Q Bool
+isInstance Name
+className ([Pred] -> Q Bool) -> (Pred -> [Pred]) -> Pred -> Q Bool
+forall b c a. (b -> c) -> (a -> b) -> a -> c
+. Pred -> [Pred]
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure
+
+infoValueLabel :: Info -> String
+infoValueLabel :: Info -> String
+infoValueLabel = \case
+    ClassI Dec
+_ [Dec]
+_       -> String
+"type class"
+    ClassOpI Name
+_ Pred
+_ Name
+_   -> String
+"type class method"
+    DataConI Name
+_ Pred
+_ Name
+_   -> String
+"data constructor"
+    FamilyI Dec
+_ [Dec]
+_      -> String
+"type or data family"
+    PatSynI Name
+_ Pred
+_      -> String
+"pattern synonym"
+    PrimTyConI Name
+_ Arity
+_ Bool
+_ -> String
+"primitive type constructor"
+    TyConI Dec
+_         -> String
+"type constructor"
+    TyVarI Name
+_ Pred
+_       -> String
+"type variable"
+    VarI Name
+_ Pred
+_ Maybe Dec
+_       -> String
+"value variable"
+
+conLabel :: Con -> String
+conLabel :: Con -> String
+conLabel Con
+con = String
+shapeLabel String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+" (" String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+conName String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+")"
+  where
+    conName, shapeLabel :: String
+    (Name -> String
+quotedName -> String
+conName, String
+shapeLabel) = Con -> (Name, String)
+conData Con
+con
+
+    conData :: Con -> (Name, String)
+    conData :: Con -> (Name, String)
+conData = \case
+        ForallC [TyVarBndr]
+_ [Pred]
+_ Con
+con'       -> Con -> (Name, String)
+conData Con
+con'
+        GadtC (Name
+name : [Name]
+_) [] Pred
+_  -> (Name
+name, String
+"nullary GADT data constructor")
+        GadtC (Name
+name : [Name]
+_) [BangType]
+_ Pred
+_   -> (Name
+name, String
+"non-nullary GADT data constructor")
+        InfixC BangType
+_ Name
+name BangType
+_        -> (Name
+name, String
+"infix data constructor")
+        NormalC Name
+name [BangType]
+_         -> (Name
+name, String
+"normal data constructor")
+        RecC Name
+name [VarBangType]
+_            -> (Name
+name, String
+"recursive normal data constructor")
+        RecGadtC (Name
+name :[Name]
+_) [VarBangType]
+_ Pred
+_ -> (Name
+name, String
+"recursive GADT data constructor")
+
+quotedName :: Name -> String
+quotedName :: Name -> String
+quotedName Name
+name = String
+"`" String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> Name -> String
+nameBase Name
+name String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+"'"
+
+
+invalidTypeError :: Name -> Info -> String
+invalidTypeError :: Name -> Info -> String
+invalidTypeError Name
+name Info
+invalid
+    = String -> String -> String
+expectationError
+        String
+"singletons-like type constructor"
+        (String
+invalidLabel String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+" (" String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> Name -> String
+quotedName Name
+name String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+")")
+  where
+    invalidLabel :: String
+    invalidLabel :: String
+invalidLabel = case Info
+invalid of
+        TyConI Dec
+_ -> String
+"non singletons-like type constructor"
+        Info
+_        -> Info -> String
+infoValueLabel Info
+invalid
+
+invalidClassError :: Name -> Info -> String
+invalidClassError :: Name -> Info -> String
+invalidClassError Name
+name Info
+invalid
+    = String -> String -> String
+expectationError
+        String
+"single-parameter type class"
+        (String
+invalidLabel String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+" (" String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> Name -> String
+quotedName Name
+name String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+")")
+  where
+    invalidLabel :: String
+    invalidLabel :: String
+invalidLabel = case Info
+invalid of
+        ClassI Dec
+_ [Dec]
+_ -> String
+"multi-parameter type class"
+        Info
+_          -> Info -> String
+infoValueLabel Info
+invalid
+
+expectationError :: String -> String -> String
+expectationError :: String -> String -> String
+expectationError String
+expected String
+got = [String] -> String
+unlines
+    [ String
+""
+    , String
+"Expected:"
+    , String
+""
+    , String
+"    " String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+expected String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+","
+    , String
+""
+    , String
+"Got:"
+    , String
+""
+    , String
+"    " String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+got String -> String -> String
+forall a. Semigroup a => a -> a -> a
+<> String
+"."
+    , String
+""
+    ]
+
+
+unlessM :: Monad m => m Bool -> m () -> m ()
+unlessM :: m Bool -> m () -> m ()
+unlessM m Bool
+test m ()
+action = m Bool
+test m Bool -> (Bool -> m ()) -> m ()
+forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
+>>= m () -> m () -> Bool -> m ()
+forall a. a -> a -> Bool -> a
+bool m ()
+action (() -> m ()
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure ())
+
+partitionM :: Monad m => (a -> m Bool) -> [a] -> m ([a], [a])
+partitionM :: (a -> m Bool) -> [a] -> m ([a], [a])
+partitionM a -> m Bool
+f = \case
+    []       -> ([a], [a]) -> m ([a], [a])
+forall (f :: * -> *) a. Applicative f => a -> f a
+pure ([], [])
+    (a
+x : [a]
+xs) -> do
+        Bool
+result <- a -> m Bool
+f a
+x
+        (([a] -> [a]) -> ([a], [a]) -> ([a], [a]))
+-> (([a] -> [a]) -> ([a], [a]) -> ([a], [a]))
+-> Bool
+-> ([a] -> [a])
+-> ([a], [a])
+-> ([a], [a])
+forall a. a -> a -> Bool -> a
+bool ([a] -> [a]) -> ([a], [a]) -> ([a], [a])
+forall (p :: * -> * -> *) b c a.
+Bifunctor p =>
+(b -> c) -> p a b -> p a c
+second ([a] -> [a]) -> ([a], [a]) -> ([a], [a])
+forall (p :: * -> * -> *) a b c.
+Bifunctor p =>
+(a -> b) -> p a c -> p b c
+first Bool
+result (a
+x a -> [a] -> [a]
+forall a. a -> [a] -> [a]
+:) (([a], [a]) -> ([a], [a])) -> m ([a], [a]) -> m ([a], [a])
+forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
+<$> (a -> m Bool) -> [a] -> m ([a], [a])
+forall (m :: * -> *) a.
+Monad m =>
+(a -> m Bool) -> [a] -> m ([a], [a])
+partitionM a -> m Bool
+f [a]
+xs
+
\ No newline at end of file diff --git a/docs/src/Paths_singletons_dict_getter.html b/docs/src/Paths_singletons_dict_getter.html new file mode 100644 index 0000000..bf83592 --- /dev/null +++ b/docs/src/Paths_singletons_dict_getter.html @@ -0,0 +1,138 @@ +
{-# LANGUAGE CPP #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# OPTIONS_GHC -fno-warn-missing-import-lists #-}
+module Paths_singletons_dict_getter (
+    version,
+    getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
+    getDataFileName, getSysconfDir
+  ) where
+
+import qualified Control.Exception as Exception
+import Data.Version (Version(..))
+import System.Environment (getEnv)
+import Prelude
+
+#if defined(VERSION_base)
+
+#if MIN_VERSION_base(4,0,0)
+catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
+#else
+catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a
+#endif
+
+#else
+catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
+#endif
+catchIO :: IO a -> (IOException -> IO a) -> IO a
+catchIO = IO a -> (IOException -> IO a) -> IO a
+forall e a. Exception e => IO a -> (e -> IO a) -> IO a
+Exception.catch
+
+version :: Version
+version :: Version
+version = [Int] -> [String] -> Version
+Version [Int
+1,Int
+0,Int
+0] []
+bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
+
+bindir :: String
+bindir     = String
+"/home/runner/.cabal/bin"
+libdir :: String
+libdir     = String
+"/home/runner/.cabal/lib/x86_64-linux-ghc-8.10.1/singletons-dict-getter-1.0.0-inplace"
+dynlibdir :: String
+dynlibdir  = String
+"/home/runner/.cabal/lib/x86_64-linux-ghc-8.10.1"
+datadir :: String
+datadir    = String
+"/home/runner/.cabal/share/x86_64-linux-ghc-8.10.1/singletons-dict-getter-1.0.0"
+libexecdir :: String
+libexecdir = String
+"/home/runner/.cabal/libexec/x86_64-linux-ghc-8.10.1/singletons-dict-getter-1.0.0"
+sysconfdir :: String
+sysconfdir = String
+"/home/runner/.cabal/etc"
+
+getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath
+getBinDir :: IO String
+getBinDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_bindir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+bindir)
+getLibDir :: IO String
+getLibDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_libdir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+libdir)
+getDynLibDir :: IO String
+getDynLibDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_dynlibdir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+dynlibdir)
+getDataDir :: IO String
+getDataDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_datadir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+datadir)
+getLibexecDir :: IO String
+getLibexecDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_libexecdir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+libexecdir)
+getSysconfDir :: IO String
+getSysconfDir = IO String -> (IOException -> IO String) -> IO String
+forall a. IO a -> (IOException -> IO a) -> IO a
+catchIO (String -> IO String
+getEnv String
+"singletons_dict_getter_sysconfdir") (\IOException
+_ -> String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return String
+sysconfdir)
+
+getDataFileName :: FilePath -> IO FilePath
+getDataFileName :: String -> IO String
+getDataFileName String
+name = do
+  String
+dir <- IO String
+getDataDir
+  String -> IO String
+forall (m :: * -> *) a. Monad m => a -> m a
+return (String
+dir String -> String -> String
+forall a. [a] -> [a] -> [a]
+++ String
+"/" String -> String -> String
+forall a. [a] -> [a] -> [a]
+++ String
+name)
+
\ No newline at end of file diff --git a/docs/src/highlight.js b/docs/src/highlight.js new file mode 100644 index 0000000..1e903bd --- /dev/null +++ b/docs/src/highlight.js @@ -0,0 +1,27 @@ + +var highlight = function (on) { + return function () { + var links = document.getElementsByTagName('a'); + for (var i = 0; i < links.length; i++) { + var that = links[i]; + + if (this.href != that.href) { + continue; + } + + if (on) { + that.classList.add("hover-highlight"); + } else { + that.classList.remove("hover-highlight"); + } + } + } +}; + +window.onload = function () { + var links = document.getElementsByTagName('a'); + for (var i = 0; i < links.length; i++) { + links[i].onmouseover = highlight(true); + links[i].onmouseout = highlight(false); + } +}; diff --git a/docs/src/style.css b/docs/src/style.css new file mode 100644 index 0000000..0146eed --- /dev/null +++ b/docs/src/style.css @@ -0,0 +1,97 @@ +body { + background-color: #fdf6e3; +} + +.hs-identifier { + color: #073642; +} + +.hs-identifier.hs-var { +} + +.hs-identifier.hs-type { + color: #5f5faf; +} + +.hs-keyword { + color: #af005f; +} + +.hs-string, .hs-char { + color: #cb4b16; +} + +.hs-number { + color: #268bd2; +} + +.hs-operator { + color: #d33682; +} + +.hs-glyph, .hs-special { + color: #dc322f; +} + +.hs-comment { + color: #8a8a8a; +} + +.hs-pragma { + color: #2aa198; +} + +.hs-cpp { + color: #859900; +} + +a:link, a:visited { + text-decoration: none; + border-bottom: 1px solid #eee8d5; +} + +a:hover, a.hover-highlight { + background-color: #eee8d5; +} + +span.annot{ + position:relative; + color:#000; + text-decoration:none + } + +span.annot:hover{z-index:25; background-color:#ff0} + +span.annot span.annottext{ + display: none; + border-radius: 5px 5px; + + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); + + position: absolute; + left: 1em; top: 2em; + z-index: 99; + margin-left: 5; + background: #FFFFAA; + border: 2px solid #FFAD33; + padding: 0.8em 1em; +} + +span.annot:hover span.annottext{ + display:block; +} + +/* This bridges the gap so you can mouse into the tooltip without it disappearing */ +span.annot span.annottext:before{ + content: ""; + position: absolute; + left: -1em; top: -1em; + background: #FFFFFF00; + z-index:-1; + padding: 2em 2em; +} diff --git a/docs/synopsis.png b/docs/synopsis.png new file mode 100644 index 0000000000000000000000000000000000000000..85fb86ec84907bcc86531dc82871948ff4d471fa GIT binary patch literal 11327 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 B5rhB$ literal 0 HcmV?d00001