/usr/share/doc/libghc-pointedlist-doc/html/src/Data-List-PointedList.html is in libghc-pointedlist-doc 0.6.1-6.
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 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | <?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>Data/List/PointedList.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE TypeOperators #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>-- | An implementation of a zipper-like non-empty list structure that tracks</span>
<a name="line-4"></a><span class='hs-comment'>-- an index position in the list (the 'focus').</span>
<a name="line-5"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span><span class='hs-varop'>.</span><span class='hs-conid'>PointedList</span> <span class='hs-keyword'>where</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldl</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldr</span><span class='hs-layout'>,</span> <span class='hs-varid'>elem</span><span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span>
<a name="line-10"></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-11"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Binary</span>
<a name="line-12"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>find</span><span class='hs-layout'>)</span>
<a name="line-13"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldl</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldr</span><span class='hs-layout'>,</span> <span class='hs-varid'>find</span><span class='hs-layout'>,</span> <span class='hs-varid'>elem</span><span class='hs-layout'>)</span>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>List</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Traversable</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="PointedList"></a><span class='hs-comment'>-- | The implementation of the pointed list structure which tracks the current</span>
<a name="line-18"></a><a name="PointedList"></a><span class='hs-comment'>-- position in the list structure.</span>
<a name="line-19"></a><a name="PointedList"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span>
<a name="line-20"></a> <span class='hs-layout'>{</span> <span class='hs-sel'>_reversedPrefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-21"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_focus</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
<a name="line-22"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_suffix</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-23"></a> <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="instance%20Binary%20(PointedList%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Binary</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Binary</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-26"></a> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>x3</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>put</span> <span class='hs-varid'>x1</span><span class='hs-layout'>;</span> <span class='hs-varid'>put</span> <span class='hs-varid'>x2</span><span class='hs-layout'>;</span> <span class='hs-varid'>put</span> <span class='hs-varid'>x3</span>
<a name="line-27"></a> <span class='hs-varid'>get</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>liftM3</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>get</span> <span class='hs-varid'>get</span> <span class='hs-varid'>get</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="reversedPrefix"></a><span class='hs-comment'>-- | Lens compatible with Control.Lens.</span>
<a name="line-30"></a><span class='hs-definition'>reversedPrefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Functor</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=></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-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-definition'>reversedPrefix</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ls'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls'</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>ls</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="focus"></a><span class='hs-comment'>-- | Lens compatible with Control.Lens.</span>
<a name="line-34"></a><span class='hs-definition'>focus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Functor</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-definition'>focus</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="suffix"></a><span class='hs-comment'>-- | Lens compatible with Control.Lens.</span>
<a name="line-38"></a><span class='hs-definition'>suffix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Functor</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=></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-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-definition'>suffix</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>rs'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs'</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>rs</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="prefix"></a><span class='hs-comment'>-- | Lens compatible with Control.Lens.</span>
<a name="line-42"></a><span class='hs-comment'>-- Internally reversing the prefix list.</span>
<a name="line-43"></a><span class='hs-definition'>prefix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Functor</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=></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-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-definition'>prefix</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ls'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>ls'</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>ls</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="instance%20Show%20(PointedList%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-47"></a> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>rs</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="instance%20Functor%20PointedList"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-conid'>PointedList</span> <span class='hs-keyword'>where</span>
<a name="line-50"></a> <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>f</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="instance%20Foldable%20PointedList"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Foldable</span> <span class='hs-conid'>PointedList</span> <span class='hs-keyword'>where</span>
<a name="line-53"></a> <span class='hs-varid'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-54"></a>
<a name="line-55"></a><a name="instance%20Traversable%20PointedList"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Traversable</span> <span class='hs-conid'>PointedList</span> <span class='hs-keyword'>where</span>
<a name="line-56"></a> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-varop'><$></span>
<a name="line-57"></a> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varop'><$></span> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>ls</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'><*></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varop'><*></span> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-varid'>rs</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="singleton"></a><span class='hs-comment'>-- | Create a 'PointedList' with a single element.</span>
<a name="line-60"></a><span class='hs-definition'>singleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-61"></a><span class='hs-definition'>singleton</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>x</span> <span class='hs-conid'>[]</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="fromList"></a><span class='hs-comment'>-- | Possibly create a @'Just' 'PointedList'@ if the provided list has at least</span>
<a name="line-64"></a><span class='hs-comment'>-- one element; otherwise, return Nothing.</span>
<a name="line-65"></a><span class='hs-comment'>--</span>
<a name="line-66"></a><span class='hs-comment'>-- The provided list's head will be the focus of the list, and the rest of</span>
<a name="line-67"></a><span class='hs-comment'>-- list will follow on the right side.</span>
<a name="line-68"></a><span class='hs-definition'>fromList</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-69"></a><span class='hs-definition'>fromList</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-70"></a><span class='hs-definition'>fromList</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="fromListEnd"></a><span class='hs-comment'>-- | Possibly create a @'Just' 'PointedList'@ if the provided list has at least</span>
<a name="line-73"></a><span class='hs-comment'>-- one element; otherwise, return Nothing.</span>
<a name="line-74"></a><span class='hs-comment'>--</span>
<a name="line-75"></a><span class='hs-comment'>-- The provided list's last element will be the focus of the list, following</span>
<a name="line-76"></a><span class='hs-comment'>-- the rest of the list in order, to the left.</span>
<a name="line-77"></a><span class='hs-definition'>fromListEnd</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-78"></a><span class='hs-definition'>fromListEnd</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-79"></a><span class='hs-definition'>fromListEnd</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>xs'</span> <span class='hs-varid'>x</span> <span class='hs-conid'>[]</span>
<a name="line-80"></a> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varid'>xs</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="replace"></a><span class='hs-comment'>-- | Replace the focus of the list, retaining the prefix and suffix.</span>
<a name="line-83"></a><span class='hs-definition'>replace</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-84"></a><span class='hs-definition'>replace</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span>
<a name="line-85"></a><span class='hs-comment'>-- replace = set focus</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="next"></a><span class='hs-comment'>-- | Possibly move the focus to the next element in the list.</span>
<a name="line-88"></a><span class='hs-definition'>next</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-89"></a><span class='hs-definition'>next</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-90"></a><span class='hs-definition'>next</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tryNext</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-comment'>-- GHC doesn't allow PL form here</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="tryNext"></a><span class='hs-comment'>-- | Attempt to move the focus to the next element, or 'error' if there are</span>
<a name="line-93"></a><span class='hs-comment'>-- no more elements.</span>
<a name="line-94"></a><span class='hs-definition'>tryNext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-95"></a><span class='hs-definition'>tryNext</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"cannot move to next element"</span>
<a name="line-96"></a><span class='hs-definition'>tryNext</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>rs</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="previous"></a><span class='hs-comment'>-- | Possibly move the focus to the previous element in the list.</span>
<a name="line-99"></a><span class='hs-definition'>previous</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-100"></a><span class='hs-definition'>previous</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-101"></a><span class='hs-definition'>previous</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tryPrevious</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span>
<a name="line-102"></a>
<a name="line-103"></a><a name="tryPrevious"></a><span class='hs-comment'>-- | Attempt to move the focus to the previous element, or 'error' if there are</span>
<a name="line-104"></a><span class='hs-comment'>-- no more elements.</span>
<a name="line-105"></a><span class='hs-definition'>tryPrevious</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-106"></a><span class='hs-definition'>tryPrevious</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-107"></a> <span class='hs-varid'>error</span> <span class='hs-str'>"cannot move to previous element"</span>
<a name="line-108"></a><span class='hs-definition'>tryPrevious</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="insert"></a><span class='hs-comment'>-- | An alias for 'insertRight'.</span>
<a name="line-111"></a><span class='hs-definition'>insert</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-112"></a><span class='hs-definition'>insert</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertRight</span>
<a name="line-113"></a>
<a name="line-114"></a><a name="insertLeft"></a><span class='hs-comment'>-- | Insert an element to the left of the focus, then move the focus to the new</span>
<a name="line-115"></a><span class='hs-comment'>-- element.</span>
<a name="line-116"></a><span class='hs-definition'>insertLeft</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-117"></a><span class='hs-definition'>insertLeft</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="insertRight"></a><span class='hs-comment'>-- | Insert an element to the right of the focus, then move the focus to the</span>
<a name="line-120"></a><span class='hs-comment'>-- new element.</span>
<a name="line-121"></a><span class='hs-definition'>insertRight</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-122"></a><span class='hs-definition'>insertRight</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span> <span class='hs-varid'>rs</span>
<a name="line-123"></a>
<a name="line-124"></a><a name="delete"></a><span class='hs-comment'>-- | An alias of 'deleteRight'.</span>
<a name="line-125"></a><span class='hs-definition'>delete</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-126"></a><span class='hs-definition'>delete</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deleteRight</span>
<a name="line-127"></a>
<a name="line-128"></a><a name="deleteLeft"></a><span class='hs-comment'>-- | Possibly delete the element at the focus, then move the element on the</span>
<a name="line-129"></a><span class='hs-comment'>-- left to the focus. If no element is on the left, focus on the element to</span>
<a name="line-130"></a><span class='hs-comment'>-- the right. If the deletion will cause the list to be empty, return</span>
<a name="line-131"></a><span class='hs-comment'>-- 'Nothing'.</span>
<a name="line-132"></a><span class='hs-definition'>deleteLeft</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-definition'>deleteLeft</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-134"></a><span class='hs-definition'>deleteLeft</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>l</span> <span class='hs-varid'>rs</span>
<a name="line-135"></a><span class='hs-definition'>deleteLeft</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>r</span> <span class='hs-varid'>rs</span>
<a name="line-136"></a>
<a name="line-137"></a><a name="deleteRight"></a><span class='hs-comment'>-- | Possibly delete the element at the focus, then move the element on the</span>
<a name="line-138"></a><span class='hs-comment'>-- right to the focus. If no element is on the right, focus on the element to</span>
<a name="line-139"></a><span class='hs-comment'>-- the left. If the deletion will cause the list to be empty, return</span>
<a name="line-140"></a><span class='hs-comment'>-- 'Nothing'.</span>
<a name="line-141"></a><span class='hs-definition'>deleteRight</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-142"></a><span class='hs-definition'>deleteRight</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-143"></a><span class='hs-definition'>deleteRight</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>r</span> <span class='hs-varid'>rs</span>
<a name="line-144"></a><span class='hs-definition'>deleteRight</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>l</span> <span class='hs-conid'>[]</span>
<a name="line-145"></a>
<a name="line-146"></a><a name="deleteOthers"></a><span class='hs-comment'>-- | Delete all elements in the list except the focus.</span>
<a name="line-147"></a><span class='hs-definition'>deleteOthers</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span>
<a name="line-148"></a><span class='hs-definition'>deleteOthers</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>b</span> <span class='hs-conid'>[]</span>
<a name="line-149"></a>
<a name="line-150"></a><a name="length"></a><span class='hs-comment'>-- | The length of the list.</span>
<a name="line-151"></a><span class='hs-definition'>length</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span>
<a name="line-152"></a><span class='hs-definition'>length</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-layout'>(</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-num'>0</span>
<a name="line-153"></a>
<a name="line-154"></a><a name="atStart"></a><span class='hs-comment'>-- | Whether the focus is the first element.</span>
<a name="line-155"></a><span class='hs-definition'>atStart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-156"></a><span class='hs-definition'>atStart</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-157"></a><span class='hs-definition'>atStart</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-158"></a>
<a name="line-159"></a><a name="atEnd"></a><span class='hs-comment'>-- | Whether the focus is the last element.</span>
<a name="line-160"></a><span class='hs-definition'>atEnd</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-161"></a><span class='hs-definition'>atEnd</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-162"></a><span class='hs-definition'>atEnd</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="positions"></a><span class='hs-comment'>-- | Create a 'PointedList' of variations of the provided 'PointedList', in</span>
<a name="line-165"></a><span class='hs-comment'>-- which each element is focused, with the provided 'PointedList' as the</span>
<a name="line-166"></a><span class='hs-comment'>-- focus of the sets.</span>
<a name="line-167"></a><span class='hs-definition'>positions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-168"></a><span class='hs-definition'>positions</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>x</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>left</span> <span class='hs-varid'>p</span> <span class='hs-varid'>right</span>
<a name="line-169"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>left</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unfoldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-conid'>(,)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>previous</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span>
<a name="line-170"></a> <span class='hs-varid'>right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unfoldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-conid'>(,)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>next</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span>
<a name="line-171"></a>
<a name="line-172"></a><a name="contextMap"></a><span class='hs-comment'>-- | Map over the 'PointedList's created via 'positions', such that @f@ is </span>
<a name="line-173"></a><span class='hs-comment'>-- called with each element of the list focused in the provided</span>
<a name="line-174"></a><span class='hs-comment'>-- 'PointedList'. An example makes this easier to understand:</span>
<a name="line-175"></a><span class='hs-comment'>--</span>
<a name="line-176"></a><span class='hs-comment'>-- > contextMap atStart (fromJust $ fromList [1..5])</span>
<a name="line-177"></a><span class='hs-definition'>contextMap</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>b</span>
<a name="line-178"></a><span class='hs-definition'>contextMap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>positions</span> <span class='hs-varid'>z</span>
<a name="line-179"></a>
<a name="line-180"></a><a name="withFocus"></a><span class='hs-comment'>-- | Create a @'PointedList' a@ of @(a, 'Bool')@, in which the boolean values</span>
<a name="line-181"></a><span class='hs-comment'>-- specify whether the current element has the focus. That is, all of the</span>
<a name="line-182"></a><span class='hs-comment'>-- booleans will be 'False', except the focused element.</span>
<a name="line-183"></a><span class='hs-definition'>withFocus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>
<a name="line-184"></a><span class='hs-definition'>withFocus</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-185"></a> <span class='hs-conid'>PointedList</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-186"></a>
<a name="line-187"></a><a name="moveTo"></a><span class='hs-comment'>-- | Move the focus to the specified index. The first element is at index 0.</span>
<a name="line-188"></a><span class='hs-definition'>moveTo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-189"></a><span class='hs-definition'>moveTo</span> <span class='hs-varid'>n</span> <span class='hs-varid'>pl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moveN</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-varid'>index</span> <span class='hs-varid'>pl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pl</span>
<a name="line-190"></a>
<a name="line-191"></a><a name="moveN"></a><span class='hs-comment'>-- | Move the focus by @n@, relative to the current index. Negative values move</span>
<a name="line-192"></a><span class='hs-comment'>-- the focus backwards, positive values more forwards through the list.</span>
<a name="line-193"></a><span class='hs-definition'>moveN</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-194"></a><span class='hs-definition'>moveN</span> <span class='hs-varid'>n</span> <span class='hs-varid'>pl</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>left</span> <span class='hs-varid'>x</span> <span class='hs-varid'>right</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>n</span> <span class='hs-varid'>left</span> <span class='hs-varid'>x</span> <span class='hs-varid'>right</span>
<a name="line-195"></a> <span class='hs-keyword'>where</span>
<a name="line-196"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>n</span> <span class='hs-varid'>left</span> <span class='hs-varid'>x</span> <span class='hs-varid'>right</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span> <span class='hs-keyword'>of</span>
<a name="line-197"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>right</span> <span class='hs-keyword'>of</span>
<a name="line-198"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span>
<a name="line-199"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</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'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>left</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varid'>rs</span>
<a name="line-200"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>left</span> <span class='hs-keyword'>of</span>
<a name="line-201"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span>
<a name="line-202"></a> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-conop'>:</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>right</span><span class='hs-layout'>)</span>
<a name="line-203"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>left</span> <span class='hs-varid'>x</span> <span class='hs-varid'>right</span>
<a name="line-204"></a>
<a name="line-205"></a><a name="find"></a><span class='hs-comment'>-- | Move the focus to the specified element, if it is present.</span>
<a name="line-206"></a><span class='hs-comment'>--</span>
<a name="line-207"></a><span class='hs-comment'>-- Patch with much faster algorithm provided by Runar Bjarnason for version</span>
<a name="line-208"></a><span class='hs-comment'>-- 0.3.2. Improved again by Runar Bjarnason for version 0.3.3 to support</span>
<a name="line-209"></a><span class='hs-comment'>-- infinite lists on both sides of the focus.</span>
<a name="line-210"></a><span class='hs-definition'>find</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-211"></a><span class='hs-definition'>find</span> <span class='hs-varid'>x</span> <span class='hs-varid'>pl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>find'</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-sel'>_focus</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>positions</span> <span class='hs-varid'>pl</span>
<a name="line-212"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>find'</span> <span class='hs-varid'>pred</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-213"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>pred</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>b</span>
<a name="line-214"></a> <span class='hs-keyword'>else</span> <span class='hs-conid'>List</span><span class='hs-varop'>.</span><span class='hs-varid'>find</span> <span class='hs-varid'>pred</span> <span class='hs-layout'>(</span><span class='hs-varid'>merge</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-215"></a> <span class='hs-varid'>merge</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>ys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ys</span>
<a name="line-216"></a> <span class='hs-varid'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>merge</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>xs</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="index"></a><span class='hs-comment'>-- | The index of the focus, leftmost is 0.</span>
<a name="line-219"></a><span class='hs-definition'>index</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span>
<a name="line-220"></a><span class='hs-definition'>index</span> <span class='hs-layout'>(</span><span class='hs-conid'>PointedList</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Prelude</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varid'>a</span>
</pre></body>
</html>
|