Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > d4d89afd994d97d86f808e6225684a4f > files > 62

ghc-uniplate-devel-1.6-5.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Data.Generics.Uniplate.Operations</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
window.onload = function () {pageLoad();setSynopsis("mini_Data-Generics-Uniplate-Operations.html");};
//]]>
</script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="src/Data-Generics-Uniplate-Operations.html">Source</a></li><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">uniplate-1.6: Help writing simple, concise and fast generic operations.</p></div><div id="content"><div id="module-header"><p class="caption">Data.Generics.Uniplate.Operations</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">The Classes
</a></li><li><a href="#g:2">Single Type Operations
</a><ul><li><a href="#g:3">Queries
</a></li><li><a href="#g:4">Transformations
</a></li><li><a href="#g:5">Others
</a></li></ul></li><li><a href="#g:6">Multiple Type Operations
</a><ul><li><a href="#g:7">Queries
</a></li><li><a href="#g:8">Transformations
</a></li><li><a href="#g:9">Others
</a></li></ul></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Definitions of <code><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a></code> and <code><a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a></code> classes, along with all the standard operations.
</p><p>Import this module directly only if you are defining new Uniplate operations, otherwise
import one of <a href="Data-Generics-Uniplate-Direct.html">Data.Generics.Uniplate.Direct</a>, <a href="Data-Generics-Uniplate-Typeable.html">Data.Generics.Uniplate.Typeable</a> or
<a href="Data-Generics-Uniplate-Data.html">Data.Generics.Uniplate.Data</a>.
</p><p>Most functions have an example of a possible use for the function.
To illustate, I have used the <code>Expr</code> type as below:
</p><pre> data Expr = Val Int
           | Neg Expr
           | Add Expr Expr
</pre></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">class</span>  <a href="#t:Uniplate">Uniplate</a> on  <span class="keyword">where</span><ul class="subs"><li><a href="#v:uniplate">uniplate</a> :: on -&gt; (<a href="Data-Generics-Str.html#t:Str">Str</a> on, <a href="Data-Generics-Str.html#t:Str">Str</a> on -&gt; on)</li><li><a href="#v:descend">descend</a> :: (on -&gt; on) -&gt; on -&gt; on</li><li><a href="#v:descendM">descendM</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (on -&gt; m on) -&gt; on -&gt; m on</li></ul></li><li class="src short"><span class="keyword">class</span> <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> to =&gt; <a href="#t:Biplate">Biplate</a> from to  <span class="keyword">where</span><ul class="subs"><li><a href="#v:biplate">biplate</a> :: from -&gt; (<a href="Data-Generics-Str.html#t:Str">Str</a> to, <a href="Data-Generics-Str.html#t:Str">Str</a> to -&gt; from)</li><li><a href="#v:descendBi">descendBi</a> :: (to -&gt; to) -&gt; from -&gt; from</li><li><a href="#v:descendBiM">descendBiM</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (to -&gt; m to) -&gt; from -&gt; m from</li></ul></li><li class="src short"><a href="#v:universe">universe</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [on]</li><li class="src short"><a href="#v:children">children</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [on]</li><li class="src short"><a href="#v:transform">transform</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; on) -&gt; on -&gt; on</li><li class="src short"><a href="#v:transformM">transformM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on) =&gt; (on -&gt; m on) -&gt; on -&gt; m on</li><li class="src short"><a href="#v:rewrite">rewrite</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> on) -&gt; on -&gt; on</li><li class="src short"><a href="#v:rewriteM">rewriteM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on) =&gt; (on -&gt; m (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> on)) -&gt; on -&gt; m on</li><li class="src short"><a href="#v:contexts">contexts</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [(on, on -&gt; on)]</li><li class="src short"><a href="#v:holes">holes</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [(on, on -&gt; on)]</li><li class="src short"><a href="#v:para">para</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; [r] -&gt; r) -&gt; on -&gt; r</li><li class="src short"><a href="#v:universeBi">universeBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [to]</li><li class="src short"><a href="#v:childrenBi">childrenBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [to]</li><li class="src short"><a href="#v:transformBi">transformBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; (to -&gt; to) -&gt; from -&gt; from</li><li class="src short"><a href="#v:transformBiM">transformBiM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to) =&gt; (to -&gt; m to) -&gt; from -&gt; m from</li><li class="src short"><a href="#v:rewriteBi">rewriteBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; (to -&gt; <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> to) -&gt; from -&gt; from</li><li class="src short"><a href="#v:rewriteBiM">rewriteBiM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to) =&gt; (to -&gt; m (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> to)) -&gt; from -&gt; m from</li><li class="src short"><a href="#v:contextsBi">contextsBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [(to, to -&gt; from)]</li><li class="src short"><a href="#v:holesBi">holesBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [(to, to -&gt; from)]</li></ul></div><div id="interface"><h1 id="g:1">The Classes
</h1><div class="top"><p class="src"><span class="keyword">class</span>  <a name="t:Uniplate" class="def">Uniplate</a> on  <span class="keyword">where</span><a href="src/Data-Generics-Uniplate-Operations.html#Uniplate" class="link">Source</a></p><div class="doc"><p>The standard Uniplate class, all operations require this. All definitions must
   define <code><a href="Data-Generics-Uniplate-Operations.html#v:uniplate">uniplate</a></code>, while <code><a href="Data-Generics-Uniplate-Operations.html#v:descend">descend</a></code> and <code><a href="Data-Generics-Uniplate-Operations.html#v:descendM">descendM</a></code> are optional.
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:uniplate" class="def">uniplate</a> :: on -&gt; (<a href="Data-Generics-Str.html#t:Str">Str</a> on, <a href="Data-Generics-Str.html#t:Str">Str</a> on -&gt; on)<a href="src/Data-Generics-Uniplate-Operations.html#uniplate" class="link">Source</a></p><div class="doc"><p>The underlying method in the class.
   Taking a value, the function should return all the immediate children
   of the same type, and a function to replace them.
</p><p>Given <code>uniplate x = (cs, gen)</code>
</p><p><code>cs</code> should be a <code>Str on</code>, constructed of <code>Zero</code>, <code>One</code> and <code>Two</code>,
   containing all <code>x</code>'s direct children of the same type as <code>x</code>. <code>gen</code>
   should take a <code>Str on</code> with exactly the same structure as <code>cs</code>,
   and generate a new element with the children replaced.
</p><p>Example instance:
</p><pre> instance Uniplate Expr where
     uniplate (Val i  ) = (Zero               , \Zero                  -&gt; Val i  )
     uniplate (Neg a  ) = (One a              , \(One a)               -&gt; Neg a  )
     uniplate (Add a b) = (Two (One a) (One b), \(Two (One a) (One b)) -&gt; Add a b)
</pre></div><p class="src"><a name="v:descend" class="def">descend</a> :: (on -&gt; on) -&gt; on -&gt; on<a href="src/Data-Generics-Uniplate-Operations.html#descend" class="link">Source</a></p><div class="doc"><p>Perform a transformation on all the immediate children, then combine them back.
   This operation allows additional information to be passed downwards, and can be
   used to provide a top-down transformation. This function can be defined explicitly,
   or can be provided by automatically in terms of <code><a href="Data-Generics-Uniplate-Operations.html#v:uniplate">uniplate</a></code>.
</p><p>For example, on the sample type, we could write:
</p><pre> descend f (Val i  ) = Val i
 descend f (Neg a  ) = Neg (f a)
 descend f (Add a b) = Add (f a) (f b)
</pre></div><p class="src"><a name="v:descendM" class="def">descendM</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (on -&gt; m on) -&gt; on -&gt; m on<a href="src/Data-Generics-Uniplate-Operations.html#descendM" class="link">Source</a></p><div class="doc"><p>Monadic variant of <code><a href="Data-Generics-Uniplate-Operations.html#v:descend">descend</a></code>    
</p></div></div><div class="subs instances"><p id="control.i:Uniplate" class="caption collapser" onclick="toggleSection('i:Uniplate')">Instances</p><div id="section.i:Uniplate" class="show"><table><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Double">Double</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Float">Float</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Int.html#t:Int">Int</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> ()</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Data.html#t:Data">Data</a> a =&gt; <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> a</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Typeable.html#t:PlateAll">PlateAll</a> a a =&gt; <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> a</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> [<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a>]</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Ratio.html#t:Ratio">Ratio</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a>)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">class</span> <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> to =&gt; <a name="t:Biplate" class="def">Biplate</a> from to  <span class="keyword">where</span><a href="src/Data-Generics-Uniplate-Operations.html#Biplate" class="link">Source</a></p><div class="doc"><p>Children are defined as the top-most items of type to
   <em>starting at the root</em>. All instances must define <code><a href="Data-Generics-Uniplate-Operations.html#v:biplate">biplate</a></code>, while
   <code><a href="Data-Generics-Uniplate-Operations.html#v:descendBi">descendBi</a></code> and <code><a href="Data-Generics-Uniplate-Operations.html#v:descendBiM">descendBiM</a></code> are optional.
</p></div><div class="subs methods"><p class="caption">Methods</p><p class="src"><a name="v:biplate" class="def">biplate</a> :: from -&gt; (<a href="Data-Generics-Str.html#t:Str">Str</a> to, <a href="Data-Generics-Str.html#t:Str">Str</a> to -&gt; from)<a href="src/Data-Generics-Uniplate-Operations.html#biplate" class="link">Source</a></p><div class="doc"><p>Return all the top most children of type <code>to</code> within <code>from</code>.
</p><p>If <code>from == to</code> then this function should return the root as the single
   child.
</p></div><p class="src"><a name="v:descendBi" class="def">descendBi</a> :: (to -&gt; to) -&gt; from -&gt; from<a href="src/Data-Generics-Uniplate-Operations.html#descendBi" class="link">Source</a></p><div class="doc"><p>Like <code><a href="Data-Generics-Uniplate-Operations.html#v:descend">descend</a></code> but with more general types. If <code>from == to</code> then this
   function <em>does not</em> descend. Therefore, when writing definitions it is
   highly unlikely that this function should be used in the recursive case.
   A common pattern is to first match the types using <code><a href="Data-Generics-Uniplate-Operations.html#v:descendBi">descendBi</a></code>, then continue
   the recursion with <code><a href="Data-Generics-Uniplate-Operations.html#v:descend">descend</a></code>.
</p></div><p class="src"><a name="v:descendBiM" class="def">descendBiM</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m =&gt; (to -&gt; m to) -&gt; from -&gt; m from<a href="src/Data-Generics-Uniplate-Operations.html#descendBiM" class="link">Source</a></p></div><div class="subs instances"><p id="control.i:Biplate" class="caption collapser" onclick="toggleSection('i:Biplate')">Instances</p><div id="section.i:Biplate" class="show"><table><tr><td class="src">(<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Data.html#t:Data">Data</a> a, <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Data.html#t:Data">Data</a> b, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> b) =&gt; <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> a b</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src">(<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Typeable.html#t:Typeable">Typeable</a> a, <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Typeable.html#t:Typeable">Typeable</a> b, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> b, <a href="Data-Generics-Uniplate-Typeable.html#t:PlateAll">PlateAll</a> a b) =&gt; <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> a b</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> [<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a>] <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Ratio.html#t:Ratio">Ratio</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a>) <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> [<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a>] [<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Char.html#t:Char">Char</a>]</td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Ratio.html#t:Ratio">Ratio</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a>) (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Ratio.html#t:Ratio">Ratio</a> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integer">Integer</a>)</td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><h1 id="g:2">Single Type Operations
</h1><h2 id="g:3">Queries
</h2><div class="top"><p class="src"><a name="v:universe" class="def">universe</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [on]<a href="src/Data-Generics-Uniplate-Operations.html#universe" class="link">Source</a></p><div class="doc"><p>Get all the children of a node, including itself and all children.
</p><pre> universe (Add (Val 1) (Neg (Val 2))) =
     [Add (Val 1) (Neg (Val 2)), Val 1, Neg (Val 2), Val 2]
</pre><p>This method is often combined with a list comprehension, for example:
</p><pre> vals x = [i | Val i &lt;- universe x]
</pre></div></div><div class="top"><p class="src"><a name="v:children" class="def">children</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [on]<a href="src/Data-Generics-Uniplate-Operations.html#children" class="link">Source</a></p><div class="doc"><p>Get the direct children of a node. Usually using <code><a href="Data-Generics-Uniplate-Operations.html#v:universe">universe</a></code> is more appropriate.
</p></div></div><h2 id="g:4">Transformations
</h2><div class="top"><p class="src"><a name="v:transform" class="def">transform</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; on) -&gt; on -&gt; on<a href="src/Data-Generics-Uniplate-Operations.html#transform" class="link">Source</a></p><div class="doc"><p>Transform every element in the tree, in a bottom-up manner.
</p><p>For example, replacing negative literals with literals:
</p><pre> negLits = transform f
    where f (Neg (Lit i)) = Lit (negate i)
          f x = x
</pre></div></div><div class="top"><p class="src"><a name="v:transformM" class="def">transformM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on) =&gt; (on -&gt; m on) -&gt; on -&gt; m on<a href="src/Data-Generics-Uniplate-Operations.html#transformM" class="link">Source</a></p><div class="doc"><p>Monadic variant of <code><a href="Data-Generics-Uniplate-Operations.html#v:transform">transform</a></code>
</p></div></div><div class="top"><p class="src"><a name="v:rewrite" class="def">rewrite</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> on) -&gt; on -&gt; on<a href="src/Data-Generics-Uniplate-Operations.html#rewrite" class="link">Source</a></p><div class="doc"><p>Rewrite by applying a rule everywhere you can. Ensures that the rule cannot
 be applied anywhere in the result:
</p><pre> propRewrite r x = all (isNothing . r) (universe (rewrite r x))
</pre><p>Usually <code><a href="Data-Generics-Uniplate-Operations.html#v:transform">transform</a></code> is more appropriate, but <code><a href="Data-Generics-Uniplate-Operations.html#v:rewrite">rewrite</a></code> can give better
 compositionality. Given two single transformations <code>f</code> and <code>g</code>, you can
 construct <code>f <code>mplus</code> g</code> which performs both rewrites until a fixed point.
</p></div></div><div class="top"><p class="src"><a name="v:rewriteM" class="def">rewriteM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on) =&gt; (on -&gt; m (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> on)) -&gt; on -&gt; m on<a href="src/Data-Generics-Uniplate-Operations.html#rewriteM" class="link">Source</a></p><div class="doc"><p>Monadic variant of <code><a href="Data-Generics-Uniplate-Operations.html#v:rewrite">rewrite</a></code>
</p></div></div><h2 id="g:5">Others
</h2><div class="top"><p class="src"><a name="v:contexts" class="def">contexts</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [(on, on -&gt; on)]<a href="src/Data-Generics-Uniplate-Operations.html#contexts" class="link">Source</a></p><div class="doc"><p>Return all the contexts and holes.
</p><pre> universe x == map fst (contexts x)
 all (== x) [b a | (a,b) &lt;- contexts x]
</pre></div></div><div class="top"><p class="src"><a name="v:holes" class="def">holes</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; on -&gt; [(on, on -&gt; on)]<a href="src/Data-Generics-Uniplate-Operations.html#holes" class="link">Source</a></p><div class="doc"><p>The one depth version of <code><a href="Data-Generics-Uniplate-Operations.html#v:contexts">contexts</a></code>
</p><pre> children x == map fst (holes x)
 all (== x) [b a | (a,b) &lt;- holes x]
</pre></div></div><div class="top"><p class="src"><a name="v:para" class="def">para</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Uniplate">Uniplate</a> on =&gt; (on -&gt; [r] -&gt; r) -&gt; on -&gt; r<a href="src/Data-Generics-Uniplate-Operations.html#para" class="link">Source</a></p><div class="doc"><p>Perform a fold-like computation on each value,
   technically a paramorphism
</p></div></div><h1 id="g:6">Multiple Type Operations
</h1><h2 id="g:7">Queries
</h2><div class="top"><p class="src"><a name="v:universeBi" class="def">universeBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [to]<a href="src/Data-Generics-Uniplate-Operations.html#universeBi" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:childrenBi" class="def">childrenBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [to]<a href="src/Data-Generics-Uniplate-Operations.html#childrenBi" class="link">Source</a></p><div class="doc"><p>Return the children of a type. If <code>to == from</code> then it returns the
 original element (in contrast to <code><a href="Data-Generics-Uniplate-Operations.html#v:children">children</a></code>)
</p></div></div><h2 id="g:8">Transformations
</h2><div class="top"><p class="src"><a name="v:transformBi" class="def">transformBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; (to -&gt; to) -&gt; from -&gt; from<a href="src/Data-Generics-Uniplate-Operations.html#transformBi" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:transformBiM" class="def">transformBiM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to) =&gt; (to -&gt; m to) -&gt; from -&gt; m from<a href="src/Data-Generics-Uniplate-Operations.html#transformBiM" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:rewriteBi" class="def">rewriteBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; (to -&gt; <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> to) -&gt; from -&gt; from<a href="src/Data-Generics-Uniplate-Operations.html#rewriteBi" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:rewriteBiM" class="def">rewriteBiM</a> :: (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to) =&gt; (to -&gt; m (<a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> to)) -&gt; from -&gt; m from<a href="src/Data-Generics-Uniplate-Operations.html#rewriteBiM" class="link">Source</a></p></div><h2 id="g:9">Others
</h2><div class="top"><p class="src"><a name="v:contextsBi" class="def">contextsBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [(to, to -&gt; from)]<a href="src/Data-Generics-Uniplate-Operations.html#contextsBi" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:holesBi" class="def">holesBi</a> :: <a href="Data-Generics-Uniplate-Operations.html#t:Biplate">Biplate</a> from to =&gt; from -&gt; [(to, to -&gt; from)]<a href="src/Data-Generics-Uniplate-Operations.html#holesBi" class="link">Source</a></p></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.9.2</p></div></body></html>