/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'>-- <<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>></span>
<a name="line-9"></a><span class='hs-comment'>-- and</span>
<a name="line-10"></a><span class='hs-comment'>-- <<a href="http://en.wikipedia.org/wiki/Sparkline">http://en.wikipedia.org/wiki/Sparkline</a>> 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'>-- <<a href="http://hackage.haskell.org/package/hsparklines">http://hackage.haskell.org/package/hsparklines</a>>.</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 => 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'>-- > dp :: [Double]</span>
<a name="line-22"></a><span class='hs-comment'>-- > 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'>-- ></span>
<a name="line-24"></a><span class='hs-comment'>-- > sl = SparkLine barSpark dp</span>
<a name="line-25"></a><span class='hs-comment'>-- > fopts = FileOptions (sparkSize sl) PNG</span>
<a name="line-26"></a><span class='hs-comment'>-- > renderableToFile fopts (sparkLineToRenderable sl) "bar_spark.png" </span>
<a name="line-27"></a><span class='hs-comment'>-- ></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'><-</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'>-></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'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><-</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'>-></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'><-</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'><-</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'><-</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>
|