This file is indexed.

/usr/share/doc/libghc-chart-doc/html/src/Graphics-Rendering-Chart-SparkLine.html is in libghc-chart-doc 1.5.4-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Graphics/Rendering/Chart/SparkLine.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>---------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      : Graphics.Rendering.Chart.Sparkline</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   : (c) Hitesh Jasani, 2008, Malcolm Wallace 2011, Tim Docker 2014</span>
<a name="line-5"></a><span class='hs-comment'>-- License     : BSD3</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Sparklines are mini graphs inspired by Edward Tufte; see</span>
<a name="line-8"></a><span class='hs-comment'>-- &lt;<a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR">http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR</a>&gt;</span>
<a name="line-9"></a><span class='hs-comment'>-- and</span>
<a name="line-10"></a><span class='hs-comment'>-- &lt;<a href="http://en.wikipedia.org/wiki/Sparkline">http://en.wikipedia.org/wiki/Sparkline</a>&gt; for more information.</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- The original implementation (by Hitesh Jasani) used the gd</span>
<a name="line-13"></a><span class='hs-comment'>-- package as a backend renderer, and is still available at</span>
<a name="line-14"></a><span class='hs-comment'>-- &lt;<a href="http://hackage.haskell.org/package/hsparklines">http://hackage.haskell.org/package/hsparklines</a>&gt;.</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- The present version integrates with</span>
<a name="line-17"></a><span class='hs-comment'>-- the Chart package, in the sense that Sparklines are just another</span>
<a name="line-18"></a><span class='hs-comment'>-- kind of (@ToRenderable a =&gt; a@), so they can be composed into grids</span>
<a name="line-19"></a><span class='hs-comment'>-- and used with the rest of Chart.</span>
<a name="line-20"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><span class='hs-comment'>-- &gt; dp :: [Double]</span>
<a name="line-22"></a><span class='hs-comment'>-- &gt; dp = [24,21,32.3,24,15,34,43,55,57,72,74,75,73,72,55,44]</span>
<a name="line-23"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-24"></a><span class='hs-comment'>-- &gt; sl = SparkLine barSpark dp</span>
<a name="line-25"></a><span class='hs-comment'>-- &gt; fopts = FileOptions (sparkSize sl) PNG</span>
<a name="line-26"></a><span class='hs-comment'>-- &gt; renderableToFile fopts (sparkLineToRenderable sl) "bar_spark.png" </span>
<a name="line-27"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-28"></a><span class='hs-comment'>---------------------------------------------------------------</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>Rendering</span><span class='hs-varop'>.</span><span class='hs-conid'>Chart</span><span class='hs-varop'>.</span><span class='hs-conid'>SparkLine</span>
<a name="line-31"></a>  <span class='hs-layout'>(</span> <span class='hs-comment'>-- * SparkLine type</span>
<a name="line-32"></a>    <span class='hs-conid'>SparkLine</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-33"></a>    <span class='hs-comment'>-- * Drawing options</span>
<a name="line-34"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>SparkOptions</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-35"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>smoothSpark</span>
<a name="line-36"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>barSpark</span>
<a name="line-37"></a>    <span class='hs-comment'>-- * Size calculation</span>
<a name="line-38"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>sparkSize</span>
<a name="line-39"></a>    <span class='hs-comment'>-- * Rendering function</span>
<a name="line-40"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>renderSparkLine</span>
<a name="line-41"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>sparkLineToRenderable</span>
<a name="line-42"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>sparkWidth</span>
<a name="line-43"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ord</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>Rendering</span><span class='hs-varop'>.</span><span class='hs-conid'>Chart</span><span class='hs-varop'>.</span><span class='hs-conid'>Geometry</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>Rendering</span><span class='hs-varop'>.</span><span class='hs-conid'>Chart</span><span class='hs-varop'>.</span><span class='hs-conid'>Drawing</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>Rendering</span><span class='hs-varop'>.</span><span class='hs-conid'>Chart</span><span class='hs-varop'>.</span><span class='hs-conid'>Renderable</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Colour</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Colour</span><span class='hs-varop'>.</span><span class='hs-conid'>Names</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="SparkLine"></a><span class='hs-comment'>-- | A sparkline is a single sequence of data values, treated as y-values.</span>
<a name="line-55"></a><a name="SparkLine"></a><span class='hs-comment'>--   The x-values are anonymous and implicit in the sequence.</span>
<a name="line-56"></a><a name="SparkLine"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SparkLine</span> <span class='hs-layout'>{</span> <span class='hs-varid'>sl_options</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkOptions</span>
<a name="line-57"></a>                           <span class='hs-layout'>,</span> <span class='hs-varid'>sl_data</span>    <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Double</span><span class='hs-keyglyph'>]</span>
<a name="line-58"></a>                           <span class='hs-layout'>}</span>
<a name="line-59"></a>
<a name="line-60"></a><a name="SparkOptions"></a><span class='hs-comment'>-- | Options to render the sparklines in different ways.</span>
<a name="line-61"></a><a name="SparkOptions"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SparkOptions</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SparkOptions</span>
<a name="line-62"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>so_smooth</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>            <span class='hs-comment'>-- ^ smooth or bars</span>
<a name="line-63"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_step</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>             <span class='hs-comment'>-- ^ step size</span>
<a name="line-64"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_height</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>             <span class='hs-comment'>-- ^ graph height (pixels)</span>
<a name="line-65"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_limits</span>     <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Double</span><span class='hs-layout'>,</span><span class='hs-conid'>Double</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ data point limits</span>
<a name="line-66"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_bgColor</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Colour</span> <span class='hs-conid'>Double</span>   <span class='hs-comment'>-- ^ background color</span>
<a name="line-67"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_minColor</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Colour</span> <span class='hs-conid'>Double</span>   <span class='hs-comment'>-- ^ color of minimum datapoint</span>
<a name="line-68"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_maxColor</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Colour</span> <span class='hs-conid'>Double</span>   <span class='hs-comment'>-- ^ color of maximum datapoint</span>
<a name="line-69"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_lastColor</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Colour</span> <span class='hs-conid'>Double</span>   <span class='hs-comment'>-- ^ color of last datapoint</span>
<a name="line-70"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_minMarker</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>            <span class='hs-comment'>-- ^ display minimum marker</span>
<a name="line-71"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_maxMarker</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>            <span class='hs-comment'>-- ^ display maximum marker</span>
<a name="line-72"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_lastMarker</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>            <span class='hs-comment'>-- ^ display last marker</span>
<a name="line-73"></a>  <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="smoothSpark"></a><span class='hs-comment'>-- | Default options for a smooth sparkline.</span>
<a name="line-76"></a><span class='hs-definition'>smoothSpark</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkOptions</span>
<a name="line-77"></a><span class='hs-definition'>smoothSpark</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SparkOptions</span>
<a name="line-78"></a>  <span class='hs-layout'>{</span> <span class='hs-varid'>so_smooth</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-79"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_step</span>       <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-80"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_height</span>     <span class='hs-keyglyph'>=</span> <span class='hs-num'>20</span>
<a name="line-81"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_limits</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-num'>100</span><span class='hs-layout'>)</span>
<a name="line-82"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_bgColor</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>white</span>
<a name="line-83"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_minColor</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>red</span>
<a name="line-84"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_maxColor</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>green</span>
<a name="line-85"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_lastColor</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>blue</span>
<a name="line-86"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_minMarker</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-87"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_maxMarker</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-88"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>so_lastMarker</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-89"></a>  <span class='hs-layout'>}</span>
<a name="line-90"></a>
<a name="line-91"></a><a name="barSpark"></a><span class='hs-comment'>-- | Default options for a barchart sparkline.</span>
<a name="line-92"></a><span class='hs-definition'>barSpark</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkOptions</span>
<a name="line-93"></a><span class='hs-definition'>barSpark</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>smoothSpark</span> <span class='hs-layout'>{</span> <span class='hs-varid'>so_smooth</span><span class='hs-keyglyph'>=</span><span class='hs-conid'>False</span> <span class='hs-layout'>}</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="sparkLineToRenderable"></a><span class='hs-comment'>-- | Create a renderable from a SparkLine.</span>
<a name="line-96"></a><span class='hs-definition'>sparkLineToRenderable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Renderable</span> <span class='hs-conid'>()</span>
<a name="line-97"></a><span class='hs-definition'>sparkLineToRenderable</span> <span class='hs-varid'>sp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Renderable</span>
<a name="line-98"></a>            <span class='hs-layout'>{</span> <span class='hs-varid'>minsize</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sparkSize</span> <span class='hs-varid'>sp</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>w</span> <span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-99"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>render</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-sel'>_rect</span><span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>renderSparkLine</span> <span class='hs-varid'>sp</span>
<a name="line-100"></a>            <span class='hs-layout'>}</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="instance%20ToRenderable%20SparkLine"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ToRenderable</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyword'>where</span>
<a name="line-103"></a>  <span class='hs-varid'>toRenderable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sparkLineToRenderable</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="sparkWidth"></a><span class='hs-comment'>-- | Compute the width of a SparkLine, for rendering purposes.</span>
<a name="line-106"></a><span class='hs-definition'>sparkWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-107"></a><span class='hs-definition'>sparkWidth</span> <span class='hs-conid'>SparkLine</span><span class='hs-layout'>{</span><span class='hs-varid'>sl_options</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>opt</span><span class='hs-layout'>,</span> <span class='hs-varid'>sl_data</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>ds</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span>
<a name="line-108"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_step</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>ds</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>extrawidth</span>
<a name="line-109"></a>      <span class='hs-varid'>extrawidth</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>so_smooth</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-110"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bw</span> <span class='hs-varop'>*</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ds</span>
<a name="line-111"></a>      <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>so_smooth</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-112"></a>         <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-113"></a>  <span class='hs-keyword'>in</span> <span class='hs-varid'>w</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="sparkSize"></a><span class='hs-comment'>-- | Return the width and height of the SparkLine.</span>
<a name="line-116"></a><span class='hs-definition'>sparkSize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span><span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-117"></a><span class='hs-definition'>sparkSize</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>sparkWidth</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>so_height</span> <span class='hs-layout'>(</span><span class='hs-varid'>sl_options</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="renderSparkLine"></a><span class='hs-comment'>-- | Render a SparkLine to a drawing surface.</span>
<a name="line-120"></a><span class='hs-definition'>renderSparkLine</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SparkLine</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ChartBackend</span> <span class='hs-layout'>(</span><span class='hs-conid'>PickFn</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-121"></a><span class='hs-definition'>renderSparkLine</span> <span class='hs-conid'>SparkLine</span><span class='hs-layout'>{</span><span class='hs-varid'>sl_options</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>opt</span><span class='hs-layout'>,</span> <span class='hs-varid'>sl_data</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>ds</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span>
<a name="line-122"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_step</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>ds</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>extrawidth</span>
<a name="line-123"></a>      <span class='hs-varid'>extrawidth</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>so_smooth</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-124"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bw</span> <span class='hs-varop'>*</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ds</span>
<a name="line-125"></a>      <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>so_smooth</span> <span class='hs-varid'>opt</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-126"></a>         <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-127"></a>      <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>so_height</span> <span class='hs-varid'>opt</span> 
<a name="line-128"></a>      <span class='hs-varid'>dmin</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_limits</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span>
<a name="line-129"></a>      <span class='hs-varid'>dmax</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>snd</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_limits</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span>
<a name="line-130"></a>      <span class='hs-varid'>coords</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zipWith</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-131"></a>                       <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>bw</span><span class='hs-varop'>+</span><span class='hs-varid'>so_step</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-layout'>(</span><span class='hs-varid'>so_step</span> <span class='hs-varid'>opt</span><span class='hs-varop'>+</span><span class='hs-varid'>bw</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>ds</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-132"></a>                       <span class='hs-keyglyph'>[</span> <span class='hs-varid'>fi</span> <span class='hs-varid'>h</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-varid'>dmin</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span>
<a name="line-133"></a>                                  <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>dmax</span><span class='hs-comment'>-</span><span class='hs-varid'>dmin</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span><span class='hs-comment'>-</span><span class='hs-num'>4</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-134"></a>                         <span class='hs-keyglyph'>|</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span> <span class='hs-keyglyph'>]</span>
<a name="line-135"></a>      <span class='hs-comment'>-- remember y increases as we go down the page</span>
<a name="line-136"></a>      <span class='hs-varid'>minpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maximumBy</span> <span class='hs-layout'>(</span><span class='hs-varid'>comparing</span> <span class='hs-varid'>p_y</span><span class='hs-layout'>)</span> <span class='hs-varid'>coords</span>
<a name="line-137"></a>      <span class='hs-varid'>maxpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>minimumBy</span> <span class='hs-layout'>(</span><span class='hs-varid'>comparing</span> <span class='hs-varid'>p_y</span><span class='hs-layout'>)</span> <span class='hs-varid'>coords</span>
<a name="line-138"></a>      <span class='hs-varid'>endpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>last</span> <span class='hs-varid'>coords</span>
<a name="line-139"></a>      <span class='hs-varid'>boxpt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Point</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rect</span>
<a name="line-140"></a>      <span class='hs-varid'>boxpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Rect</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-141"></a>      <span class='hs-varid'>fi</span>    <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-142"></a>      <span class='hs-varid'>fi</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span>
<a name="line-143"></a>  <span class='hs-keyword'>in</span> <span class='hs-keyword'>do</span>
<a name="line-144"></a>
<a name="line-145"></a>  <span class='hs-varid'>withFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_bgColor</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-146"></a>    <span class='hs-varid'>fillPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>rectPath</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rect</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-147"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>so_smooth</span> <span class='hs-varid'>opt</span>
<a name="line-148"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-149"></a>      <span class='hs-varid'>withLineStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidLine</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-varid'>grey</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-150"></a>        <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>alignStrokePoints</span> <span class='hs-varid'>coords</span>
<a name="line-151"></a>        <span class='hs-varid'>strokePointPath</span> <span class='hs-varid'>p</span>
<a name="line-152"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-153"></a>      <span class='hs-varid'>withFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-varid'>grey</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-154"></a>        <span class='hs-varid'>forM_</span> <span class='hs-varid'>coords</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-155"></a>          <span class='hs-varid'>fillPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>rectPath</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rect</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Point</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-156"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_minMarker</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-157"></a>      <span class='hs-varid'>withFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_minColor</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-158"></a>        <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>alignFillPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>rectPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>boxpt</span> <span class='hs-varid'>minpt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-159"></a>        <span class='hs-varid'>fillPath</span> <span class='hs-varid'>p</span>
<a name="line-160"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_maxMarker</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-161"></a>      <span class='hs-varid'>withFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_maxColor</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-162"></a>        <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>alignFillPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>rectPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>boxpt</span> <span class='hs-varid'>maxpt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-163"></a>        <span class='hs-varid'>fillPath</span> <span class='hs-varid'>p</span>
<a name="line-164"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_lastMarker</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-165"></a>      <span class='hs-varid'>withFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>solidFillStyle</span> <span class='hs-layout'>(</span><span class='hs-varid'>opaque</span> <span class='hs-layout'>(</span><span class='hs-varid'>so_lastColor</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-166"></a>        <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>alignFillPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>rectPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>boxpt</span> <span class='hs-varid'>endpt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-167"></a>        <span class='hs-varid'>fillPath</span> <span class='hs-varid'>p</span>
<a name="line-168"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>nullPickFn</span>
<a name="line-169"></a>
</pre></body>
</html>