/usr/share/doc/libghc-lens-doc/html/src/Data-Complex-Lens.html is in libghc-lens-doc 4.13-1.
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 | <?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>src/Data/Complex/Lens.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LANGUAGE FlexibleContexts #-}</span>
<a name="line-3"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 710</span>
<a name="line-4"></a><span class='hs-comment'>{-# LANGUAGE ViewPatterns #-}</span>
<a name="line-5"></a><span class='hs-comment'>{-# LANGUAGE PatternSynonyms #-}</span>
<a name="line-6"></a><span class='hs-cpp'>#endif</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-cpp'>#ifndef MIN_VERSION_base</span>
<a name="line-9"></a><span class='hs-cpp'>#define MIN_VERSION_base(x,y,z) 1</span>
<a name="line-10"></a><span class='hs-cpp'>#endif</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-13"></a><span class='hs-comment'>-- |</span>
<a name="line-14"></a><span class='hs-comment'>-- Module : Data.Complex.Lens</span>
<a name="line-15"></a><span class='hs-comment'>-- Copyright : (C) 2012-15 Edward Kmett</span>
<a name="line-16"></a><span class='hs-comment'>-- License : BSD-style (see the file LICENSE)</span>
<a name="line-17"></a><span class='hs-comment'>-- Maintainer : Edward Kmett <ekmett@gmail.com></span>
<a name="line-18"></a><span class='hs-comment'>-- Stability : experimental</span>
<a name="line-19"></a><span class='hs-comment'>-- Portability : non-portable</span>
<a name="line-20"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><span class='hs-comment'>-- Lenses and traversals for complex numbers</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>----------------------------------------------------------------------------</span>
<a name="line-24"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Complex</span><span class='hs-varop'>.</span><span class='hs-conid'>Lens</span>
<a name="line-25"></a> <span class='hs-layout'>(</span> <span class='hs-sel'>_realPart</span>
<a name="line-26"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_imagPart</span>
<a name="line-27"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_polar</span>
<a name="line-28"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_magnitude</span>
<a name="line-29"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_phase</span>
<a name="line-30"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_conjugate</span>
<a name="line-31"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 710</span>
<a name="line-32"></a> <span class='hs-comment'>-- * Pattern Synonyms</span>
<a name="line-33"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>pattern</span> <span class='hs-conid'>Polar</span>
<a name="line-34"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>pattern</span> <span class='hs-conid'>Real</span>
<a name="line-35"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>pattern</span> <span class='hs-conid'>Imaginary</span>
<a name="line-36"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>pattern</span> <span class='hs-conid'>Conjugate</span>
<a name="line-37"></a><span class='hs-cpp'>#endif</span>
<a name="line-38"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-39"></a>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Lens</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Complex</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-cpp'>#if !MIN_VERSION_base(4,8,0)</span>
<a name="line-44"></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-45"></a><span class='hs-cpp'>#endif</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-comment'>-- $setup</span>
<a name="line-48"></a><span class='hs-comment'>-- >>> import Debug.SimpleReflect</span>
<a name="line-49"></a><span class='hs-comment'>-- >>> let { a ~~ b = abs (a - b) < 1e-6; infix 4 ~~ }</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-comment'>-- | Access the 'realPart' of a 'Complex' number.</span>
<a name="line-52"></a><span class='hs-comment'>--</span>
<a name="line-53"></a><span class='hs-comment'>-- >>> (a :+ b)^._realPart</span>
<a name="line-54"></a><span class='hs-comment'>-- a</span>
<a name="line-55"></a><span class='hs-comment'>--</span>
<a name="line-56"></a><span class='hs-comment'>-- >>> a :+ b & _realPart *~ 2</span>
<a name="line-57"></a><span class='hs-comment'>-- a * 2 :+ b</span>
<a name="line-58"></a><span class='hs-comment'>--</span>
<a name="line-59"></a><span class='hs-comment'>-- @'_realPart' :: 'Functor' f => (a -> f a) -> 'Complex' a -> f ('Complex' a)@</span>
<a name="line-60"></a><span class='hs-sel'>_realPart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Lens'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>
<a name="line-61"></a><span class='hs-sel'>_realPart</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-conop'>:+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conop'>:+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>
<a name="line-62"></a><span class='hs-comment'>{-# INLINE _realPart #-}</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-comment'>-- | Access the 'imagPart' of a 'Complex' number.</span>
<a name="line-65"></a><span class='hs-comment'>--</span>
<a name="line-66"></a><span class='hs-comment'>-- >>> (a :+ b)^._imagPart</span>
<a name="line-67"></a><span class='hs-comment'>-- b</span>
<a name="line-68"></a><span class='hs-comment'>--</span>
<a name="line-69"></a><span class='hs-comment'>-- >>> a :+ b & _imagPart *~ 2</span>
<a name="line-70"></a><span class='hs-comment'>-- a :+ b * 2</span>
<a name="line-71"></a><span class='hs-comment'>--</span>
<a name="line-72"></a><span class='hs-comment'>-- @'_imagPart' :: 'Functor' f => (a -> f a) -> 'Complex' a -> f ('Complex' a)@</span>
<a name="line-73"></a><span class='hs-sel'>_imagPart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Lens'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>
<a name="line-74"></a><span class='hs-sel'>_imagPart</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-conop'>:+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-conop'>:+</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>b</span>
<a name="line-75"></a><span class='hs-comment'>{-# INLINE _imagPart #-}</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-comment'>-- | This isn't /quite/ a legal 'Lens'. Notably the</span>
<a name="line-78"></a><span class='hs-comment'>--</span>
<a name="line-79"></a><span class='hs-comment'>-- @'view' l ('set' l b a) = b@</span>
<a name="line-80"></a><span class='hs-comment'>--</span>
<a name="line-81"></a><span class='hs-comment'>-- law is violated when you set a 'polar' value with 0 'magnitude' and non-zero</span>
<a name="line-82"></a><span class='hs-comment'>-- 'phase' as the 'phase' information is lost, or with a negative 'magnitude'</span>
<a name="line-83"></a><span class='hs-comment'>-- which flips the 'phase' and retains a positive 'magnitude'. So don't do</span>
<a name="line-84"></a><span class='hs-comment'>-- that!</span>
<a name="line-85"></a><span class='hs-comment'>--</span>
<a name="line-86"></a><span class='hs-comment'>-- Otherwise, this is a perfectly cromulent 'Lens'.</span>
<a name="line-87"></a><span class='hs-sel'>_polar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RealFloat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Iso'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-88"></a><span class='hs-sel'>_polar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>iso</span> <span class='hs-varid'>polar</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-varid'>mkPolar</span><span class='hs-layout'>)</span>
<a name="line-89"></a><span class='hs-comment'>{-# INLINE _polar #-}</span>
<a name="line-90"></a>
<a name="line-91"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 710</span>
<a name="line-92"></a><a name="pattern"></a><span class='hs-definition'>pattern</span> <span class='hs-conid'>Polar</span> <span class='hs-varid'>m</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-varid'>view</span> <span class='hs-sel'>_polar</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-varid'>theta</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-93"></a> <span class='hs-conid'>Polar</span> <span class='hs-varid'>m</span> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>review</span> <span class='hs-sel'>_polar</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-varid'>theta</span><span class='hs-layout'>)</span>
<a name="line-94"></a>
<a name="line-95"></a><span class='hs-definition'>pattern</span> <span class='hs-conid'>Real</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <span class='hs-conop'>:+</span> <span class='hs-num'>0</span>
<a name="line-96"></a><span class='hs-definition'>pattern</span> <span class='hs-conid'>Imaginary</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <span class='hs-conop'>:+</span> <span class='hs-varid'>i</span>
<a name="line-97"></a><span class='hs-cpp'>#endif</span>
<a name="line-98"></a>
<a name="line-99"></a><span class='hs-comment'>-- | Access the 'magnitude' of a 'Complex' number.</span>
<a name="line-100"></a><span class='hs-comment'>--</span>
<a name="line-101"></a><span class='hs-comment'>-- >>> (10.0 :+ 20.0) & _magnitude *~ 2</span>
<a name="line-102"></a><span class='hs-comment'>-- 20.0 :+ 40.0</span>
<a name="line-103"></a><span class='hs-comment'>--</span>
<a name="line-104"></a><span class='hs-comment'>-- This isn't /quite/ a legal 'Lens'. Notably the</span>
<a name="line-105"></a><span class='hs-comment'>--</span>
<a name="line-106"></a><span class='hs-comment'>-- @'view' l ('set' l b a) = b@</span>
<a name="line-107"></a><span class='hs-comment'>--</span>
<a name="line-108"></a><span class='hs-comment'>-- law is violated when you set a negative 'magnitude'. This flips the 'phase'</span>
<a name="line-109"></a><span class='hs-comment'>-- and retains a positive 'magnitude'. So don't do that!</span>
<a name="line-110"></a><span class='hs-comment'>--</span>
<a name="line-111"></a><span class='hs-comment'>-- Otherwise, this is a perfectly cromulent 'Lens'.</span>
<a name="line-112"></a><span class='hs-comment'>--</span>
<a name="line-113"></a><span class='hs-comment'>-- Setting the 'magnitude' of a zero 'Complex' number assumes the 'phase' is 0.</span>
<a name="line-114"></a><span class='hs-sel'>_magnitude</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RealFloat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Lens'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>
<a name="line-115"></a><span class='hs-sel'>_magnitude</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setMag</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span>
<a name="line-116"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>setMag</span> <span class='hs-varid'>r'</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-varop'>/=</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-varid'>r'</span> <span class='hs-varop'>/</span> <span class='hs-varid'>r</span> <span class='hs-conop'>:+</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-117"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r'</span> <span class='hs-conop'>:+</span> <span class='hs-num'>0</span>
<a name="line-118"></a> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>magnitude</span> <span class='hs-varid'>c</span>
<a name="line-119"></a><span class='hs-comment'>{-# INLINE _magnitude #-}</span>
<a name="line-120"></a>
<a name="line-121"></a><span class='hs-comment'>-- | Access the 'phase' of a 'Complex' number.</span>
<a name="line-122"></a><span class='hs-comment'>--</span>
<a name="line-123"></a><span class='hs-comment'>-- >>> (mkPolar 10 (2-pi) & _phase +~ pi & view _phase) ~~ 2</span>
<a name="line-124"></a><span class='hs-comment'>-- True</span>
<a name="line-125"></a><span class='hs-comment'>--</span>
<a name="line-126"></a><span class='hs-comment'>-- This isn't /quite/ a legal 'Lens'. Notably the</span>
<a name="line-127"></a><span class='hs-comment'>--</span>
<a name="line-128"></a><span class='hs-comment'>-- @'view' l ('set' l b a) = b@</span>
<a name="line-129"></a><span class='hs-comment'>--</span>
<a name="line-130"></a><span class='hs-comment'>-- law is violated when you set a 'phase' outside the range @(-'pi', 'pi']@.</span>
<a name="line-131"></a><span class='hs-comment'>-- The phase is always in that range when queried. So don't do that!</span>
<a name="line-132"></a><span class='hs-comment'>--</span>
<a name="line-133"></a><span class='hs-comment'>-- Otherwise, this is a perfectly cromulent 'Lens'.</span>
<a name="line-134"></a><span class='hs-sel'>_phase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RealFloat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Lens'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span>
<a name="line-135"></a><span class='hs-sel'>_phase</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setPhase</span> <span class='hs-varop'><$></span> <span class='hs-varid'>f</span> <span class='hs-varid'>theta</span>
<a name="line-136"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>setPhase</span> <span class='hs-varid'>theta'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>*</span> <span class='hs-varid'>cis</span> <span class='hs-layout'>(</span><span class='hs-varid'>theta'</span> <span class='hs-comment'>-</span> <span class='hs-varid'>theta</span><span class='hs-layout'>)</span>
<a name="line-137"></a> <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>phase</span> <span class='hs-varid'>c</span>
<a name="line-138"></a><span class='hs-comment'>{-# INLINE _phase #-}</span>
<a name="line-139"></a>
<a name="line-140"></a><span class='hs-comment'>-- | Access the 'conjugate' of a 'Complex' number.</span>
<a name="line-141"></a><span class='hs-comment'>--</span>
<a name="line-142"></a><span class='hs-comment'>-- >>> (2.0 :+ 3.0) & _conjugate . _imagPart -~ 1</span>
<a name="line-143"></a><span class='hs-comment'>-- 2.0 :+ 4.0</span>
<a name="line-144"></a><span class='hs-comment'>--</span>
<a name="line-145"></a><span class='hs-comment'>-- >>> (mkPolar 10.0 2.0 ^. _conjugate . _phase) ~~ (-2.0)</span>
<a name="line-146"></a><span class='hs-comment'>-- True</span>
<a name="line-147"></a><span class='hs-sel'>_conjugate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RealFloat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Iso'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Complex</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-148"></a><span class='hs-sel'>_conjugate</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>involuted</span> <span class='hs-varid'>conjugate</span>
<a name="line-149"></a><span class='hs-comment'>{-# INLINE _conjugate #-}</span>
<a name="line-150"></a>
<a name="line-151"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 710</span>
<a name="line-152"></a><span class='hs-definition'>pattern</span> <span class='hs-conid'>Conjugate</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-varid'>conjugate</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-153"></a> <span class='hs-conid'>Conjugate</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>conjugate</span> <span class='hs-varid'>a</span>
<a name="line-154"></a><span class='hs-cpp'>#endif</span>
</pre></body>
</html>
|