|
1 |
| -<!DOCTYPE html> |
| 1 | +<!doctype html> |
2 | 2 | <html>
|
3 | 3 | <head>
|
4 |
| - <meta charset='utf-8'> |
| 4 | + <meta charset="utf-8"> |
5 | 5 | <meta http-equiv="X-UA-Compatible" content="chrome=1">
|
6 |
| - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> |
7 |
| - <link href='https://fonts.googleapis.com/css?family=Architects+Daughter' rel='stylesheet' type='text/css'> |
8 |
| - <link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen"> |
9 |
| - <link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen"> |
10 |
| - <link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print"> |
| 6 | + <title>Lambda by palatable</title> |
11 | 7 |
|
| 8 | + <link rel="stylesheet" href="stylesheets/styles.css"> |
| 9 | + <link rel="stylesheet" href="stylesheets/github-light.css"> |
| 10 | + <script src="javascripts/scale.fix.js"></script> |
| 11 | + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
12 | 12 | <!--[if lt IE 9]>
|
13 | 13 | <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
14 | 14 | <![endif]-->
|
15 |
| - |
16 |
| - <title>Lambda by palatable</title> |
17 | 15 | </head>
|
18 |
| - |
19 | 16 | <body>
|
20 |
| - <header> |
21 |
| - <div class="inner"> |
22 |
| - <h1>Lambda</h1> |
23 |
| - <h2>Functional patterns for Java</h2> |
24 |
| - <a href="https://github.com/palatable/lambda" class="button"><small>View project on</small> GitHub</a> |
25 |
| - </div> |
26 |
| - </header> |
27 |
| - |
28 |
| - <div id="content-wrapper"> |
29 |
| - <div class="inner clearfix"> |
30 |
| - <section id="main-content"> |
31 |
| - <h1> |
| 17 | + <div class="wrapper"> |
| 18 | + <header> |
| 19 | + <h1 class="header">Lambda</h1> |
| 20 | + <p class="header">Functional patterns for Java</p> |
| 21 | + |
| 22 | + <ul> |
| 23 | + <li class="download"><a class="buttons" href="https://github.com/palatable/lambda/zipball/master">Download ZIP</a></li> |
| 24 | + <li class="download"><a class="buttons" href="https://github.com/palatable/lambda/tarball/master">Download TAR</a></li> |
| 25 | + <li><a class="buttons github" href="https://github.com/palatable/lambda">View On GitHub</a></li> |
| 26 | + </ul> |
| 27 | + |
| 28 | + <p class="header">This project is maintained by <a class="header name" href="https://github.com/palatable">palatable</a></p> |
| 29 | + |
| 30 | + |
| 31 | + </header> |
| 32 | + <section> |
| 33 | + <h1> |
32 | 34 | <a id="λ" class="anchor" href="#%CE%BB" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>λ</h1>
|
33 | 35 |
|
34 | 36 | <p><a href="https://travis-ci.org/palatable/lambda"><img src="https://travis-ci.org/palatable/lambda.svg" alt="Build Status"></a>
|
|
55 | 57 | </ul>
|
56 | 58 | </li>
|
57 | 59 | <li><a href="#hmaps">HMaps</a></li>
|
| 60 | +<li> |
| 61 | +<a href="#coproducts">CoProducts</a> |
| 62 | + |
| 63 | +<ul> |
58 | 64 | <li><a href="#either">Either</a></li>
|
59 | 65 | </ul>
|
60 | 66 | </li>
|
| 67 | +</ul> |
| 68 | +</li> |
61 | 69 | <li><a href="#lenses">Lenses</a></li>
|
62 | 70 | <li>
|
63 | 71 | <a href="#notes">Notes</a> </li>
|
@@ -95,12 +103,12 @@ <h2>
|
95 | 103 | <div class="highlight highlight-text-xml"><pre><<span class="pl-ent">dependency</span>>
|
96 | 104 | <<span class="pl-ent">groupId</span>>com.jnape.palatable</<span class="pl-ent">groupId</span>>
|
97 | 105 | <<span class="pl-ent">artifactId</span>>lambda</<span class="pl-ent">artifactId</span>>
|
98 |
| - <<span class="pl-ent">version</span>>1.5.1</<span class="pl-ent">version</span>> |
| 106 | + <<span class="pl-ent">version</span>>1.5.3</<span class="pl-ent">version</span>> |
99 | 107 | </<span class="pl-ent">dependency</span>></pre></div>
|
100 | 108 |
|
101 | 109 | <p><code>build.gradle</code> (<a href="https://docs.gradle.org/current/userguide/dependency_management.html">Gradle</a>):</p>
|
102 | 110 |
|
103 |
| -<div class="highlight highlight-source-groovy-gradle"><pre>compile <span class="pl-c1">group</span>: <span class="pl-s"><span class="pl-pds">'</span>com.jnape.palatable<span class="pl-pds">'</span></span>, <span class="pl-c1">name</span>: <span class="pl-s"><span class="pl-pds">'</span>lambda<span class="pl-pds">'</span></span>, <span class="pl-c1">version</span>: <span class="pl-s"><span class="pl-pds">'</span>1.5.1<span class="pl-pds">'</span></span></pre></div> |
| 111 | +<div class="highlight highlight-source-groovy-gradle"><pre>compile <span class="pl-c1">group</span>: <span class="pl-s"><span class="pl-pds">'</span>com.jnape.palatable<span class="pl-pds">'</span></span>, <span class="pl-c1">name</span>: <span class="pl-s"><span class="pl-pds">'</span>lambda<span class="pl-pds">'</span></span>, <span class="pl-c1">version</span>: <span class="pl-s"><span class="pl-pds">'</span>1.5.3<span class="pl-pds">'</span></span></pre></div> |
104 | 112 |
|
105 | 113 | <h2>
|
106 | 114 | <a id="examples" class="anchor" href="#examples" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a><a name="examples">Examples</a>
|
|
151 | 159 |
|
152 | 160 | <span class="pl-k">Fn1<<span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>></span> noOp <span class="pl-k">=</span> add<span class="pl-k">.</span>then(subtract);
|
153 | 161 | <span class="pl-c">// same as</span>
|
154 |
| -<span class="pl-k">Fn1<<span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>></span> alsoNoOp <span class="pl-k">=</span> subtract<span class="pl-k">.</span>compose(subtract);</pre></div> |
| 162 | +<span class="pl-k">Fn1<<span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>></span> alsoNoOp <span class="pl-k">=</span> subtract<span class="pl-k">.</span>compose(add);</pre></div> |
155 | 163 |
|
156 | 164 | <p>And partially apply some:</p>
|
157 | 165 |
|
@@ -217,6 +225,21 @@ <h4>
|
217 | 225 | <span class="pl-k">Tuple4<<span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>></span> tuple4 <span class="pl-k">=</span> <span class="pl-smi">HList</span><span class="pl-k">.</span>tuple(<span class="pl-c1">1</span>, <span class="pl-c1">2</span>, <span class="pl-c1">3</span>, <span class="pl-c1">4</span>);
|
218 | 226 | <span class="pl-k">Tuple5<<span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Integer</span>></span> tuple5 <span class="pl-k">=</span> <span class="pl-smi">HList</span><span class="pl-k">.</span>tuple(<span class="pl-c1">1</span>, <span class="pl-c1">2</span>, <span class="pl-c1">3</span>, <span class="pl-c1">4</span>, <span class="pl-c1">5</span>);</pre></div>
|
219 | 227 |
|
| 228 | +<p><code>Index</code> can be used for type-safe retrieval and updating of elements at specific indexes:</p> |
| 229 | + |
| 230 | +<div class="highlight highlight-source-java"><pre><span class="pl-k">HCons<<span class="pl-smi">Integer</span>, <span class="pl-k">HCons<<span class="pl-smi">String</span>, <span class="pl-k">HCons<<span class="pl-smi">Character</span>, <span class="pl-smi">HNil</span>></span>></span>></span> hList <span class="pl-k">=</span> cons(<span class="pl-c1">1</span>, cons(<span class="pl-s"><span class="pl-pds">"</span>2<span class="pl-pds">"</span></span>, cons(<span class="pl-s"><span class="pl-pds">'</span>3<span class="pl-pds">'</span></span>, nil()))); |
| 231 | +<span class="pl-k">HCons<<span class="pl-smi">Integer</span>, <span class="pl-k">Tuple2<<span class="pl-smi">String</span>, <span class="pl-smi">Character</span>></span>></span> tuple <span class="pl-k">=</span> tuple(<span class="pl-c1">1</span>, <span class="pl-s"><span class="pl-pds">"</span>2<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">'</span>3<span class="pl-pds">'</span></span>); |
| 232 | +<span class="pl-k">Tuple5<<span class="pl-smi">Integer</span>, <span class="pl-smi">String</span>, <span class="pl-smi">Character</span>, <span class="pl-smi">Double</span>, <span class="pl-smi">Boolean</span>></span> longerHList <span class="pl-k">=</span> tuple(<span class="pl-c1">1</span>, <span class="pl-s"><span class="pl-pds">"</span>2<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">'</span>3<span class="pl-pds">'</span></span>, <span class="pl-c1">4.0d</span>, <span class="pl-c1">false</span>); |
| 233 | + |
| 234 | +<span class="pl-k">Index<<span class="pl-smi">Character</span>, <span class="pl-k">HCons<<span class="pl-smi">Integer</span>, ? extends <span class="pl-k">HCons<<span class="pl-smi">String</span>, ? extends <span class="pl-k">HCons<<span class="pl-smi">Character</span>, ?></span>></span>></span>></span> characterIndex <span class="pl-k">=</span> |
| 235 | + <span class="pl-smi">Index</span><span class="pl-k">.</span><span class="pl-k"><</span><span class="pl-smi">Character</span><span class="pl-k">></span>index()<span class="pl-c1">.</span><span class="pl-k"><</span><span class="pl-smi">String</span><span class="pl-k">></span>after()<span class="pl-k">.</span>after(); |
| 236 | + |
| 237 | +characterIndex<span class="pl-k">.</span>get(hList); <span class="pl-c">// '3'</span> |
| 238 | +characterIndex<span class="pl-k">.</span>get(tuple); <span class="pl-c">// '3'</span> |
| 239 | +characterIndex<span class="pl-k">.</span>get(longerHList); <span class="pl-c">// '3'</span> |
| 240 | + |
| 241 | +characterIndex<span class="pl-k">.</span>set(<span class="pl-s"><span class="pl-pds">'</span>4<span class="pl-pds">'</span></span>, hList); <span class="pl-c">// HList{ 1 :: "2" :: '4' }</span></pre></div> |
| 242 | + |
220 | 243 | <p>Finally, all <code>Tuple*</code> classes are instances of both <code>Functor</code> and <code>Bifunctor</code>:</p>
|
221 | 244 |
|
222 | 245 | <div class="highlight highlight-source-java"><pre><span class="pl-k">Tuple2<<span class="pl-smi">Integer</span>, <span class="pl-smi">String</span>></span> mappedTuple2 <span class="pl-k">=</span> tuple(<span class="pl-c1">1</span>, <span class="pl-c1">2</span>)<span class="pl-k">.</span>biMap(x <span class="pl-k">-</span><span class="pl-k">></span> x <span class="pl-k">+</span> <span class="pl-c1">1</span>, <span class="pl-smi">Object</span><span class="pl-k">::</span>toString);
|
@@ -245,19 +268,44 @@ <h3>
|
245 | 268 | <span class="pl-k">Optional<<span class="pl-smi">Integer</span>></span> intValue <span class="pl-k">=</span> hmap<span class="pl-k">.</span>get(intKey); <span class="pl-c">// Optional[1]</span>
|
246 | 269 | <span class="pl-k">Optional<<span class="pl-smi">Integer</span>></span> anotherIntValue <span class="pl-k">=</span> hmap<span class="pl-k">.</span>get(anotherIntKey); <span class="pl-c">// Optional.empty</span></pre></div>
|
247 | 270 |
|
| 271 | +<h3> |
| 272 | +<a id="coproducts" class="anchor" href="#coproducts" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a><a name="coproducts">CoProducts</a> |
| 273 | +</h3> |
| 274 | + |
| 275 | +<p><code>CoProduct</code>s generalize unions of disparate types in a single consolidated type. </p> |
| 276 | + |
| 277 | +<div class="highlight highlight-source-java"><pre><span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> string <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>a(<span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>); |
| 278 | +<span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> integer <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>b(<span class="pl-c1">1</span>); |
| 279 | +<span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> character <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>c(<span class="pl-s"><span class="pl-pds">'</span>a<span class="pl-pds">'</span></span>);</pre></div> |
| 280 | + |
| 281 | +<p>Rather than supporting explicit value unwrapping, which would necessarily jeopardize type safety, <code>CoProduct</code>s support a <code>match</code> method that takes one function per possible value type and maps it to a final common result type:</p> |
| 282 | + |
| 283 | +<div class="highlight highlight-source-java"><pre><span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> string <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>a(<span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>); |
| 284 | +<span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> integer <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>b(<span class="pl-c1">1</span>); |
| 285 | +<span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> character <span class="pl-k">=</span> <span class="pl-smi">CoProduct3</span><span class="pl-k">.</span>c(<span class="pl-s"><span class="pl-pds">'</span>a<span class="pl-pds">'</span></span>); |
| 286 | + |
| 287 | +<span class="pl-smi">Integer</span> result <span class="pl-k">=</span> string<span class="pl-k">.</span><span class="pl-k"><</span><span class="pl-smi">Integer</span><span class="pl-k">></span>match(<span class="pl-smi">String</span><span class="pl-k">::</span>length, identity(), <span class="pl-smi">Character</span><span class="pl-k">::</span>charCount); <span class="pl-c">// 6</span></pre></div> |
| 288 | + |
| 289 | +<p>Additionally, because a <code>CoProduct2<A, B></code> guarantees a subset of a <code>CoProduct3<A, B, C></code>, the <code>diverge</code> method exists between <code>CoProduct</code> types of single magnitude differences to make it easy to use a more convergent <code>CoProduct</code> where a more divergent <code>CoProduct</code> is expected:</p> |
| 290 | + |
| 291 | +<div class="highlight highlight-source-java"><pre><span class="pl-k">CoProduct2<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>></span> coProduct2 <span class="pl-k">=</span> <span class="pl-smi">CoProduct2</span><span class="pl-k">.</span>a(<span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>); |
| 292 | +<span class="pl-k">CoProduct3<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>, <span class="pl-smi">Character</span>></span> coProduct3 <span class="pl-k">=</span> coProduct2<span class="pl-k">.</span>diverge(); <span class="pl-c">// still just the coProduct2 value, adapted to the coProduct3 shape</span></pre></div> |
| 293 | + |
| 294 | +<p>There are <code>CoProduct</code> specializations for type unions of up to 5 different types: <code>CoProduct2</code> through <code>CoProduct5</code>, respectively.</p> |
| 295 | + |
248 | 296 | <h3>
|
249 | 297 | <a id="either" class="anchor" href="#either" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a><a name="either">Either</a>
|
250 | 298 | </h3>
|
251 | 299 |
|
252 |
| -<p>Binary tagged unions are represented as <code>Either<L, R></code>s, which resolve to one of two possible values: a <code>Left</code> value wrapping an <code>L</code>, or a <code>Right</code> value wrapping an <code>R</code> (typically an exceptional value or a successful value, respectively).</p> |
| 300 | +<p><code>Either<L, R></code> represents a specialized <code>CoProduct2<L, R></code>, which resolve to one of two possible values: a left value wrapping an <code>L</code>, or a right value wrapping an <code>R</code> (typically an exceptional value or a successful value, respectively).</p> |
253 | 301 |
|
254 |
| -<p>Rather than supporting explicit value unwrapping, <code>Either</code> supports many useful comprehensions to help facilitate type-safe interactions. For example, <code>Either#match</code> is used to resolve an <code>Either<L,R></code> to a different type. </p> |
| 302 | +<p>As with <code>CoProduct2</code>, rather than supporting explicit value unwrapping, <code>Either</code> supports many useful comprehensions to help facilitate type-safe interactions: </p> |
255 | 303 |
|
256 | 304 | <div class="highlight highlight-source-java"><pre><span class="pl-k">Either<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>></span> right <span class="pl-k">=</span> <span class="pl-smi">Either</span><span class="pl-k">.</span>right(<span class="pl-c1">1</span>);
|
257 | 305 | <span class="pl-k">Either<<span class="pl-smi">String</span>, <span class="pl-smi">Integer</span>></span> left <span class="pl-k">=</span> <span class="pl-smi">Either</span><span class="pl-k">.</span>left(<span class="pl-s"><span class="pl-pds">"</span>Head fell off<span class="pl-pds">"</span></span>);
|
258 | 306 |
|
259 |
| -<span class="pl-smi">Boolean</span> successful <span class="pl-k">=</span> right<span class="pl-k">.</span>match(l <span class="pl-k">-</span><span class="pl-k">></span> <span class="pl-c1">false</span>, r <span class="pl-k">-</span><span class="pl-k">></span> <span class="pl-c1">true</span>); |
260 |
| -<span class="pl-c">//-> true</span> |
| 307 | +<span class="pl-smi">Integer</span> result <span class="pl-k">=</span> right<span class="pl-k">.</span>orElse(<span class="pl-k">-</span><span class="pl-c1">1</span>); |
| 308 | +<span class="pl-c">//-> 1</span> |
261 | 309 |
|
262 | 310 | <span class="pl-k">List<<span class="pl-smi">Integer</span>></span> values <span class="pl-k">=</span> left<span class="pl-k">.</span>match(l <span class="pl-k">-</span><span class="pl-k">></span> <span class="pl-smi">Collections</span><span class="pl-k">.</span>emptyList(), <span class="pl-smi">Collections</span><span class="pl-k">::</span>singletonList);
|
263 | 311 | <span class="pl-c">//-> [] </span></pre></div>
|
@@ -345,25 +393,12 @@ <h2>
|
345 | 393 | </h2>
|
346 | 394 |
|
347 | 395 | <p><em>lambda</em> is part of <a href="http://www.github.com/palatable">palatable</a>, which is distributed under <a href="http://choosealicense.com/licenses/mit/">The MIT License</a>.</p>
|
348 |
| - </section> |
349 |
| - |
350 |
| - <aside id="sidebar"> |
351 |
| - <a href="https://github.com/palatable/lambda/zipball/master" class="button"> |
352 |
| - <small>Download</small> |
353 |
| - .zip file |
354 |
| - </a> |
355 |
| - <a href="https://github.com/palatable/lambda/tarball/master" class="button"> |
356 |
| - <small>Download</small> |
357 |
| - .tar.gz file |
358 |
| - </a> |
359 |
| - |
360 |
| - <p class="repo-owner"><a href="https://github.com/palatable/lambda"></a> is maintained by <a href="https://github.com/palatable">palatable</a>.</p> |
361 |
| - |
362 |
| - <p>This page was generated by <a href="https://pages.github.com">GitHub Pages</a> using the Architect theme by <a href="https://twitter.com/jasonlong">Jason Long</a>.</p> |
363 |
| - </aside> |
364 |
| - </div> |
| 396 | + </section> |
| 397 | + <footer> |
| 398 | + <p><small>Hosted on <a href="https://pages.github.com">GitHub Pages</a> using the Dinky theme</small></p> |
| 399 | + </footer> |
365 | 400 | </div>
|
366 |
| - |
367 |
| - |
| 401 | + <!--[if !IE]><script>fixScale(document);</script><![endif]--> |
| 402 | + |
368 | 403 | </body>
|
369 | 404 | </html>
|
0 commit comments