<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Prajit Ramachandran</title>
		<description>Prajit Ramachandran's programming and math blog</description>
		<link>http://prajitr.github.io</link>
		<atom:link href="http://prajitr.github.io/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>D3.js Source Code Walkthrough Part 1</title>
				<description>&lt;p&gt;If you’ve ever seen an interactive visualization on a website (ex. New York Times), chances are that it is being powered by d3.js. d3, created by Mike Bostock and maintained by Bostock and Jason Davies, is the &lt;a href=&quot;https://github.com/search?q=stars%3a%3E1&amp;s=stars&amp;type=Repositories&quot;&gt;fourth most starred repository on GitHub&lt;/a&gt;. It is an amazing data visualization library that makes it easy to create interactive graphs on the web. It has a relatively simple interface that is backed by a powerful and extensible engine. But if you’ve ever used d3, you’ve probably wondered how the magic &lt;em&gt;really&lt;/em&gt; is created.&lt;/p&gt;

&lt;p&gt;This post is for those who want to understand d3’s internals. I assume you have some familiarity with d3 (a couple of &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Tutorials&quot;&gt;tutorials&lt;/a&gt; should be good enough), because I won’t spend time explaining the basics.&lt;/p&gt;

&lt;h2 id=&quot;approach&quot;&gt;Approach&lt;/h2&gt;

&lt;p&gt;The d3 source code is &lt;a href=&quot;https://github.com/mbostock/d3&quot;&gt;hosted on GitHub&lt;/a&gt;. All the relevant code is in the &lt;code&gt;src/&lt;/code&gt; folder. Each subfolder in &lt;code&gt;src/&lt;/code&gt; has an &lt;code&gt;index.js&lt;/code&gt; which imports the relevant of the files.&lt;/p&gt;

&lt;p&gt;My approach of reading the code was to follow the order of imports in each &lt;code&gt;index.js&lt;/code&gt;. If a file didn’t make sense, I looked at the corresponding tests and the &lt;a href=&quot;https://github.com/mbostock/d3/wiki&quot;&gt;d3 wiki&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;subfolders&quot;&gt;Subfolders&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;src/&lt;/code&gt; has 20 subfolders in it. A short description of each follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arrays/&lt;/code&gt;: Various array methods such as &lt;code&gt;min&lt;/code&gt;, &lt;code&gt;bisect&lt;/code&gt;, &lt;code&gt;zip&lt;/code&gt;, and &lt;code&gt;nest&lt;/code&gt;. Since the array is the main form of data representation in d3, these methods serve as the basis for manipulating data. Also defines &lt;code&gt;Map&lt;/code&gt; and &lt;code&gt;Set&lt;/code&gt; classes.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;behavior/&lt;/code&gt;: Behavior of drag (including touch drags) and zoom events. For zoom, it handles redisplaying of data.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;color/&lt;/code&gt;: Different color representations, such as rgb, hcl, and hsl. Also defines convenience functions for each color representation, like &lt;code&gt;brighter&lt;/code&gt; and &lt;code&gt;darker&lt;/code&gt; methods.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;compat/&lt;/code&gt;: Compatibility between browsers, namely getting the current time and the ability to set styles on DOM elements.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;core/&lt;/code&gt;: General purpose methods and variables that are used throughout the d3 source, such as a class subtyping utility and a method rebinding utility.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;dsv/&lt;/code&gt;: Opening and parsing of various file types, such as csv and tsv. Important because most data comes in these formats.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;event/&lt;/code&gt;: Catching and dispatching of events such as touch, drag, click. Also defines an interal timer utility that efficiently handles parallel timers.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;format/&lt;/code&gt;: Convenient formatting functions for various data types.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;geo/&lt;/code&gt;: Handles geography functions and algorithms. If you’re working with maps, this folder serves as the backbone.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;geom/&lt;/code&gt;: Functions and algorithms for 2D geometry. Also has a &lt;code&gt;voronoi&lt;/code&gt; folder for creating &lt;a href=&quot;en.wikipedia.org/wiki/Voronoi_diagram&quot;&gt;Voronoi diagrams&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;interpolate/&lt;/code&gt;: Interpolation functions for various data types, such as colors, strings, and numbers. Important for transitions.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;layout/&lt;/code&gt;: “Ready-made” classes for popular charts, such as bar charts, pie charts, force diagrams, and treemaps. Useful to read if you’re planning on creating your own unique chart.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;locale/&lt;/code&gt;: Defaults for various locales, such as US, GB, BR, RU, and formatting for times.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;math/&lt;/code&gt;: General math functions like random distributions and trigonometry.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;scale/&lt;/code&gt;: Various scale types that map inputs to outputs, such as linear, log, ordinal scales.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;selection/&lt;/code&gt;: The real meat of d3 - selections of elements and binding of data. Allows you to select an element or group of elements, apply transformations, and bind data. Binding data is split into update, enter, and exit selections. If you could only read one folder, you should read this.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;svg/&lt;/code&gt;: The low level code that generates the svg markup (since d3 produces raw svg).&lt;/li&gt;

&lt;li&gt;&lt;code&gt;time/&lt;/code&gt;: Time issues, such as minutes, months, scales, formatting.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;transition/&lt;/code&gt;: Handles transitions of elements. Keeps track of all the transitions for a particular element, and uses interpolation, tweening, and easing to generate the actual transition.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;xhr/&lt;/code&gt;: Creating and sending of XMLHttpRequests, which are needed get data from a server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s the general overview of d3’s components! For the remainder of this post, we’ll look in-depth at three folders: &lt;code&gt;core/&lt;/code&gt;, &lt;code&gt;array/&lt;/code&gt;, and &lt;code&gt;math/&lt;/code&gt;. I have created a general description for each file that I have commented. I’ll only cover a couple main files from each folder. I would recommend reading the rest of the files on your own.&lt;/p&gt;

&lt;h2 id=&quot;core&quot;&gt;Core&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;core/&lt;/code&gt; defines general purpose utilities and variables that are used within the d3 source.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_functor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;v&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;typeof&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;v&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;function&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;v&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;v&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;functor&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_functor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;functor.js&lt;/code&gt; takes one parameter: if it is a function, return it; otherwise, return a wrapper function that always returns the value. This abstracts away the need to know if a value is a function or not: instead, just call the function returned from &lt;code&gt;d3_functor&lt;/code&gt;. This is used mainly in the &lt;code&gt;svg/&lt;/code&gt; and &lt;code&gt;geom/&lt;/code&gt; folders.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_class&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ctor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;try&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nb&#39;&gt;Object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;defineProperty&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ctor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;enumerable&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;false&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;catch&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;e&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Fallback.&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;ctor&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;properties&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;class.js&lt;/code&gt; defines a helper method that adds properties of an object to a class. It tries to use the Javascript built-in &lt;code&gt;Object.defineProperty&lt;/code&gt;, but falls back to prototype assignment if it fails. This function is used mainly when defining new classes (for example, &lt;code&gt;d3.map&lt;/code&gt; in &lt;code&gt;array/map.js&lt;/code&gt; and &lt;code&gt;d3.set&lt;/code&gt; in &lt;code&gt;array/set.js&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_subclass&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{}.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;__proto__&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;?&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Until ECMAScript supports array subclassing, prototype injection works well.&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;__proto__&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// And if your browser doesn&amp;#39;t support __proto__, we&amp;#39;ll use direct extension.&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;property&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;property&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;property&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;subclass.js&lt;/code&gt; subtypes a class using another prototype. Used in &lt;code&gt;selection/&lt;/code&gt; (where each selection also inherits the Javascript array methods), &lt;code&gt;transition/&lt;/code&gt;, and &lt;code&gt;geom/&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;rebind&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_rebind&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// source[method] returns a function.&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// `method` is first being assigned to arguments[i]. Then it gets passed into `d3_rebind` (as source[method]).&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_rebind&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;method&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;apply&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Make `source` the method&amp;#39;s &amp;quot;this&amp;quot; value.&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;source&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;target&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// setter : getter&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;rebind.js&lt;/code&gt; copies methods (which are passed in as string arguments) from &lt;code&gt;source&lt;/code&gt; to &lt;code&gt;target&lt;/code&gt;. For example, if you wanted to copy the the &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt; methods from &lt;code&gt;a&lt;/code&gt; to &lt;code&gt;b&lt;/code&gt;, you would call &lt;code&gt;d3.rebind(b, a, &amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;)&lt;/code&gt;. The code loops through all the string arguments and rebinds these methods to &lt;code&gt;target&lt;/code&gt;. In &lt;code&gt;d3_rebind&lt;/code&gt;, a wrapper function is returned. This function first calls the method (using &lt;code&gt;source&lt;/code&gt; as the context). Then it determines the return value using d3’s convention for getters and setters: if a value is set, return the object for chaining (in this case, &lt;code&gt;target&lt;/code&gt;); otherwise, return the value.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;array&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Also part of `core/`.&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_document&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;d3_documentElement&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;documentElement&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;d3_window&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;window&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Redefine d3_array if the browser doesn’t support slice-based conversion.&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// d3_array is originally defined as function (list) { return [].slice.call(list); }&lt;/span&gt;
&lt;span class=&#39;k&#39;&gt;try&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;d3_array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_documentElement&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;childNodes&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;].&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;nodeType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;catch&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;e&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;d3_array&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;--&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;list&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;document.js&lt;/code&gt; defines d3 variables for the DOM document, window, and documentElement (which is normally the &lt;code&gt;&amp;lt;html&amp;gt;&amp;lt;/html&amp;gt;&lt;/code&gt; tag). It also handles browser compatibility issues for array slicing.&lt;/p&gt;

&lt;p&gt;There are other functions in &lt;code&gt;core/&lt;/code&gt; that I skip over which are also useful. For example, &lt;code&gt;ns.js&lt;/code&gt; determines if a namespace prefix is used. Others are convenience functions, like &lt;code&gt;noop.js&lt;/code&gt;, which defines a function that does nothing.&lt;/p&gt;

&lt;h2 id=&quot;array&quot;&gt;Array&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;array/&lt;/code&gt; defines functions on arrays, which serve as the main data representation. It also defines &lt;code&gt;Map&lt;/code&gt; and &lt;code&gt;Set&lt;/code&gt; classes. For the most part, these functions are self explanatory and self contained.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;ascending&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Comparator function that helps sort arrays in ascending order.&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisector&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;compare&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;left&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// a = array, x = desired value&lt;/span&gt;
      &lt;span class=&#39;c1&#39;&gt;// Optional arguments.&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Divides lo + hi by 2 and truncates the quotient.&lt;/span&gt;
        &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;compare&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
        &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;right&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
        &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;compare&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;hi&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Different than `left`.&lt;/span&gt;
        &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mid&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;lo&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisect&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisector&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_ascending&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Default bisect.&lt;/span&gt;
&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;bisectLeft&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;left&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;bisect&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;bisectRight&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisect&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;right&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;bisector&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_bisector&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_ascending&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Function on one variable (like function (d) { return d.date; })&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Function on two variables (like function (a, b) { return a.age - b.age; });&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;bisect.js&lt;/code&gt; defines functions that determine where in a sorted array an element should be inserted. It has &lt;code&gt;left&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt; forms, which differ when the insert position is ambiguous (ex. inserting &lt;code&gt;2&lt;/code&gt; in the array &lt;code&gt;[0, 2, 2, 2, 4]&lt;/code&gt;). It is implemented with a binary search. The difference between the &lt;code&gt;left&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt; is whether the &lt;code&gt;lo&lt;/code&gt; or &lt;code&gt;hi&lt;/code&gt; is updated when &lt;code&gt;a[mid] == x&lt;/code&gt;. This has the effect of choosing either the right most or left most valid position to insert the value. There is also &lt;code&gt;d3.bisector&lt;/code&gt;, which allows the user to pass in a custom comparator function (instead of using the default &lt;code&gt;ascending&lt;/code&gt; function).&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;../math/abs&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;range&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Optional parameters.&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;((&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;Infinity&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;throw&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Error&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;infinite range&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;range&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[],&lt;/span&gt;
       &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_range_integerScale&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;abs&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)),&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Used to prevent rounding errors.&lt;/span&gt;
       &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
       &lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Scale up by magnitude to deal with integer steps (instead of floating point steps).&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;((&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;range&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Scale back down.&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;((&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;start&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;step&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;stop&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;range&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;range&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Finds the magnitude (base 10) that multiplies into a number to make it an integer.&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_range_integerScale&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;%&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// While number * magnitude is still a decimal, increase magnitude by factor of 10.&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;range.js&lt;/code&gt; is similar to Python’s range function. Given start, stop, and step values, it computes the corresponding range of numbers. The interesting part of this implementation is the use of integer scaling. This prevents rounding errors when using floating points (&lt;code&gt;[1.0, 2.1, 3.2] != [10/10, 21/10, 32/10]&lt;/code&gt;). So we must first compute the scale factor, scale the parameters up, run a regular range interval, and scale each number back down when added to the range array. This is a useful trick to keep in mind if you ever have to deal with floating point precision in the future.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;../core/class&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Set all properties of object in a map and return it.&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;instanceof&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{}&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3_class&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_Map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// `d3_class` is from `core/class.js`&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;has&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_has&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;get&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;remove&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_remove&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[];&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[];&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;size&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_size&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;empty&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_empty&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefixCode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;call&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;substring&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;\0&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Prevent collision with built-in properties.&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;d3_map_prefixCode&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_has&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_remove&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;delete&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[];&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_size&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;size&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefixCode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;size&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;size&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_empty&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefixCode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;false&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;true&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;map.js&lt;/code&gt; defines a Map class. According to the d3 wiki, maps are extremely similar to regular Javascript objects, but they &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Arrays#d3_map&quot;&gt;avoid issues&lt;/a&gt; when using built-in property names as keys (ex. &lt;code&gt;obj[&amp;quot;__proto__&amp;quot;] = 42&lt;/code&gt;). This is an implementation of the proposed Map in EMCAScript 6. The most important thing to note is the &lt;code&gt;d3_map_prefix&lt;/code&gt; is added to every key to prevent collisions with built-in properties (ex. &lt;code&gt;map.set(&amp;quot;__proto__&amp;quot;, 42)&lt;/code&gt; would create an internal key of &lt;code&gt;&amp;quot;\0&amp;quot; + &amp;quot;__proto__&amp;quot;&lt;/code&gt;). The actual map class is defined using &lt;code&gt;d3_class&lt;/code&gt; (from &lt;code&gt;core/class.js&lt;/code&gt; highlighted earlier). It also offers convenience functions like &lt;code&gt;keys&lt;/code&gt; and &lt;code&gt;values&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;../core/class&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;map&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Add to set the array&amp;#39;s values.&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;add&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{}&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3_class&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_Set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;has&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_has&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;add&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;true&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// d3_map_prefix is from `array/map` (used to prevent key collisions).&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;remove&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;delete&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt; 
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;size&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_size&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;empty&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_empty&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;c1&#39;&gt;// Only values added through set.add().&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;charCodeAt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;===&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_map_prefixCode&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;call&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;value&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;substring&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;set.js&lt;/code&gt; defines a set class (also proposed in ES6) that holds unique values of an array. It uses the same namespace prefix as &lt;code&gt;d3.map&lt;/code&gt; to prevent collisions. Keys are internally represented like light switches that can’t be turned off after being turned on (with the exception of calling &lt;code&gt;remove()&lt;/code&gt;). &lt;code&gt;Set&lt;/code&gt; leverages &lt;code&gt;array/map.js&lt;/code&gt; for most of its functions.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{},&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[],&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;sortKeys&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[],&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;sortValues&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;rollup&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// Helper function that creates the tree.&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;c1&#39;&gt;// Deals with base case: the leaves of the tree.&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;rollup&lt;/span&gt; 
        &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;rollup&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;call&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortValues&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// If a rollup function is defined, call it.&lt;/span&gt;
        &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sort&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortValues&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// If no rollup, sort the leaves if requested (sortValues is a comparator function).&lt;/span&gt;
        &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// If user doesn&amp;#39;t want it sorted, return the bare array.&lt;/span&gt;

    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Equivalent to: key = keys[depth]; depth++;&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;setter&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;valuesByKey&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_Map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

    &lt;span class=&#39;c1&#39;&gt;// Add object to the correct key array (create array if is none).&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;c1&#39;&gt;// Get the requested key value of the object, and check if it is already in the map.&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;valuesByKey&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;get&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;i&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;])))&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;c1&#39;&gt;// If not in the map, add the object in an array (which allows for pushing more objects).&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;valuesByKey&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]);&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

    &lt;span class=&#39;c1&#39;&gt;// Define appropriate tree object and setting function for next level.&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;setter&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;set&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{};&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;setter&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyValue&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

    &lt;span class=&#39;c1&#39;&gt;// Recurse over next level.&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;valuesByKey&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setter&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;object&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// Converts regular tree into tree of objects with &amp;quot;key&amp;quot; and &amp;quot;value&amp;quot; properties.&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Also allows you to sort the keys of each level.&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;c1&#39;&gt;// Base case of leaves.&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;

    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[],&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;sortKey&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;sortKeys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;

    &lt;span class=&#39;c1&#39;&gt;// Create an array of k-v pairs, using recursion for the values.&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;forEach&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;keyMap&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;({&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;values&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keyMap&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;depth&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)});&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;});&lt;/span&gt;

    &lt;span class=&#39;c1&#39;&gt;// Sort current level if needed (sortKey is a comparator function).&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;sortKey&lt;/span&gt;
        &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sort&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;sortKey&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;})&lt;/span&gt;
        &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;mapType&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;entries&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;map&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;array&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// A new level for the tree.&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;key&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;push&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// Specifies the order for the most-recently specified key.&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Note: only applies to entries. Map keys are unordered!&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// order is a comparator.&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortKeys&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;order&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;sortKeys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;keys&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;order&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// Specifies the order for leaf values.&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Applies to both maps and entries array.&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sortValues&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;order&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;sortValues&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;order&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;c1&#39;&gt;// Define a rollup function to be used on each group of leaves.&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;rollup&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;rollup&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;nest&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;nest.js&lt;/code&gt; is probably the most tricky function in the &lt;code&gt;array/&lt;/code&gt; folder. &lt;code&gt;d3.nest&lt;/code&gt; allows you to transform an array of object into a nested tree with multiple levels split on property values. It allows you to order the keys of a sublevel and apply functions to the leaves of the tree. It recursively creates deeper sublevels of the tree, until it ends up with the leaves. I would recommend checking out the &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Arrays#-nest&quot;&gt;nest entry on the d3 wiki&lt;/a&gt; and &lt;a href=&quot;http://bl.ocks.org/phoebebright/raw/3176159/&quot;&gt;d3.nest examples&lt;/a&gt; to better understand how d3.nest works.&lt;/p&gt;

&lt;p&gt;There are a lot of other functions defined in &lt;code&gt;array/&lt;/code&gt;, but I’ll let you look over them yourself. These are great functions to read if you find yourself needing to manipulate arrays.&lt;/p&gt;

&lt;h2 id=&quot;math&quot;&gt;Math&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;math/&lt;/code&gt; folder defines various mathematical functions, some of which are exposed and some that are internal. Like &lt;code&gt;array/&lt;/code&gt;, they are self contained, though they require some mathematical knowledge.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;c1&#39;&gt;// Converts an SVG transform string into matrix representation.&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;../core/document&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;import&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;../core/ns&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Namespace check.&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;transform&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;string&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_document&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;createElementNS&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;ns&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;prefix&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;svg&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;g&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// Create svg &amp;quot;g&amp;quot; tag.&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;transform&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;string&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;string&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;!=&lt;/span&gt; &lt;span class=&#39;kc&#39;&gt;null&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;g&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;setAttribute&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s2&#39;&gt;&amp;quot;transform&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;string&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
     &lt;span class=&#39;c1&#39;&gt;// Multiplies all transformation matrices together to get one matrix.&lt;/span&gt;
     &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;t&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;g&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;transform&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;baseVal&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;consolidate&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// SVGTransformList &lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;new&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transform&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;t&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;t&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;matrix&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformIdentity&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;})(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;string&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Compute x-scale and normalize the first row.&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// Compute shear and make second row orthogonal to first.&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// Compute y-scale and normalize the second row.&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// Finally, compute the rotation.&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// Parameter m is of the form:&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// [a c e]&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// [b d f]&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transform&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;c&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;kx&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformNormalize&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// x-scale&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;kz&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformDot&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;),&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// shear&lt;/span&gt;
      &lt;span class=&#39;nx&#39;&gt;ky&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformNormalize&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_transformCombine&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;kz&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// y-scale&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Determinant check (ad - bc). If determinant &amp;lt; 0, multiply through with -1 to make determinant &amp;gt; 0.&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;])&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;kx&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;kz&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*=&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;rotate&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;kx&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;atan2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;])&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;atan2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;],&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]))&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_degrees&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;translate&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;e&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;scale&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;kx&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ky&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;skew&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ky&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;?&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;atan2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;kz&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;ky&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_degrees&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;nx&#39;&gt;d3_transform&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;prototype&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;toString&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;translate(&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;translate&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;)rotate(&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;rotate&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;)skewX(&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;skew&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;)scale(&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;this&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;scale&lt;/span&gt;
      &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;s2&#39;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Dot product.&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformDot&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Normalize (so values add up to 1).&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformNormalize&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sqrt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3_transformDot&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;));&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Used to make `a` orthogonal to `b` using Gram-Schmidt (k is negative dot-product).&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformCombine&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;k&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;];&lt;/span&gt;
  &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;// Identity matrix&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// [a c e]  -&amp;gt; [1 0 0]&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;// [b d f]  -&amp;gt; [0 1 0]&lt;/span&gt;
&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3_transformIdentity&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;c&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;e&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;f&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;transform.js&lt;/code&gt; converts an SVG transform string into actual matrix representation. Used for matrix interpolation in &lt;code&gt;interpolate/&lt;/code&gt;, which enables &lt;a href=&quot;bl.ocks.org/mbostock/1345853&quot;&gt;impressive geometric transitions&lt;/a&gt;. The details of this file requires some basic linear algebra knowledge (how matrix transformations work).&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;javascript&#39;&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;normal&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;err&#39;&gt;µ&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;σ&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;c1&#39;&gt;// Optional arguments.&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;length&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;σ&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;µ&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;y&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;do&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
        &lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;y&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
      &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt; &lt;span class=&#39;k&#39;&gt;while&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;!&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;µ&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;err&#39;&gt;σ&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;sqrt&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;-&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;log&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;r&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Random variable whose logarithm is normally distributed.&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;logNormal&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;normal&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;apply&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;arguments&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;exp&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;());&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;// log(exp(x)) = x&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Mean of m independent and identically distributed random variables between [0,1].&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;bates&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;d3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;irwinHall&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;);&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;},&lt;/span&gt;
  &lt;span class=&#39;c1&#39;&gt;// Sum of m independent and identically distributed random variables between [0,1].&lt;/span&gt;
  &lt;span class=&#39;nx&#39;&gt;irwinHall&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
    &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;kd&#39;&gt;function&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;()&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;for&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kd&#39;&gt;var&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;s&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;m&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;j&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;++&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;s&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+=&lt;/span&gt; &lt;span class=&#39;nb&#39;&gt;Math&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;nx&#39;&gt;random&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;();&lt;/span&gt;
      &lt;span class=&#39;k&#39;&gt;return&lt;/span&gt; &lt;span class=&#39;nx&#39;&gt;s&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;;&lt;/span&gt;
    &lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;random.js&lt;/code&gt; defines various random number generators. The definition of &lt;code&gt;normal&lt;/code&gt; requires mathematical knowledge of normal (Gaussian) distributions.&lt;/p&gt;

&lt;p&gt;Again, there are other functions in &lt;code&gt;math/&lt;/code&gt; that I recommend you look at, though I personally don’t think they are as interesting as &lt;code&gt;array/&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In this post, we examined the roles of each folder in d3’s source. We also looked in depth into three folders: &lt;code&gt;core/&lt;/code&gt;, &lt;code&gt;array/&lt;/code&gt;, and &lt;code&gt;math/&lt;/code&gt;. Hopefully, the internals of d3 are starting to make sense. In the next post, we’ll finally look at the real meat of d3: selections and transitions. Stay tuned!&lt;/p&gt;</description>
				<pubDate>Sun, 20 Apr 2014 00:00:00 -0700</pubDate>
				<link>http://prajitr.github.io/d3-source-walkthrough-pt1</link>
				<guid isPermaLink="true">http://prajitr.github.io/d3-source-walkthrough-pt1</guid>
			</item>
		
			<item>
				<title>A Quick Tour of Haskell Syntax</title>
				<description>&lt;p&gt;If you’re a programmer who wants to parse Haskell for a blog post or wants a cursory overview of the language, this post is for you. It’s going to be somewhat longer than the &lt;a href=&quot;http://learnxinyminutes.com/docs/haskell/&quot; title=&quot;LearnXinYMinutes Haskell&quot;&gt;learnxinyminutes&lt;/a&gt; style, as it will go a little more in depth. Without further ado, let’s get started.&lt;/p&gt;

&lt;p&gt;Starting with the typical basic types:&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;c1&#39;&gt;-- inline comment&lt;/span&gt;
&lt;span class=&#39;cm&#39;&gt;{- block comment -}&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- numbers&lt;/span&gt;
&lt;span class=&#39;mf&#39;&gt;3.0&lt;/span&gt;
&lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- booleans&lt;/span&gt;
&lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt; 
&lt;span class=&#39;n&#39;&gt;&amp;#39;p&amp;#39;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- characters&lt;/span&gt;
&lt;span class=&#39;n&#39;&gt;&amp;#39;j&amp;#39;&lt;/span&gt;
&lt;span class=&#39;s&#39;&gt;&amp;quot;The slow brown fox.&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- strings&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- lists&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Strings are actually just a list of characters. &lt;code&gt;&amp;quot;Hello&amp;quot;&lt;/code&gt; is the same as &lt;code&gt;[&amp;#39;H&amp;#39;,&amp;#39;e&amp;#39;,&amp;#39;l&amp;#39;,&amp;#39;l&amp;#39;,&amp;#39;o&amp;#39;]&lt;/code&gt;. Moving on to basic functions.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;mi&#39;&gt;7&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;12&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 19&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 33&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 4&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 1.375&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;-- Integer division&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;11&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;`&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;div&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;`&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 1&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;not&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;9&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;/=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;9&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True&lt;/span&gt;
&lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;||&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;18&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;13&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Couple of things to notice. &lt;code&gt;not&lt;/code&gt; is a function: it takes a boolean value, and negates it. Functions in Haskell do not require parentheses. The general syntax is &lt;code&gt;func arg1 arg2 arg3 ...&lt;/code&gt;. However, parentheses may be required in some expressions: &lt;code&gt;not (3 &amp;lt; 5)&lt;/code&gt;, evaluates to &lt;code&gt;False&lt;/code&gt;, but &lt;code&gt;not 3 &amp;lt; 5&lt;/code&gt; is invalid, as Haskell will interpret the expression as &lt;code&gt;(not 3) &amp;lt; 5&lt;/code&gt;, erroring out when it tries to boolean negate a number.&lt;/p&gt;

&lt;p&gt;Also, &lt;code&gt;11 `div` 8&lt;/code&gt; is the same thing as &lt;code&gt;div 11 8&lt;/code&gt;. Backticks around any function call will allow you to use it in infix style, as opposed to prefix. It’s just syntactic sugar for some functions that read better in infix style.&lt;/p&gt;

&lt;p&gt;Here are some functions on lists:&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [1, 2, 3]&lt;/span&gt;
&lt;span class=&#39;sc&#39;&gt;&amp;#39;C&amp;#39;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;at&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- &amp;quot;Cat&amp;quot; (Remember strings are lists of characters)&lt;/span&gt;
&lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [True]&lt;/span&gt;
&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;elem&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;73&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;12&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;span class=&#39;sc&#39;&gt;&amp;#39;H&amp;#39;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;`&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;elem&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;`&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;Highgarden&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True &lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [1, 2, 3, 4]&lt;/span&gt;
&lt;span class=&#39;s&#39;&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;World&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- &amp;quot;Hello World&amp;quot; &lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;head&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 1&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;tail&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [2, 3]&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;last&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 3&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;init&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [1, 2]&lt;/span&gt;
&lt;span class=&#39;s&#39;&gt;&amp;quot;Casterly Rock&amp;quot;&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;!!&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- &amp;#39;t&amp;#39;&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;null&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- True&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;null&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- False&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;length&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;Dorne&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 5&lt;/span&gt;

&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;s&#39;&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;fst&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;6&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;Six&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 6&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;snd&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;6&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;Six&amp;quot;&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- &amp;quot;Six&amp;quot; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice how &lt;code&gt;1 : 2 : 3 : []&lt;/code&gt; is the same as &lt;code&gt;[1, 2, 3]&lt;/code&gt;. Lists are just elements &lt;code&gt;:&lt;/code&gt; together, with an empty list (&lt;code&gt;[]&lt;/code&gt;) at the end, similar to Lisp. &lt;code&gt;(elem1, elem2, elem3, ...)&lt;/code&gt; are called tuples. A tuple can contain different types, whereas a list may only contain the same type for all its elements.&lt;/p&gt;

&lt;p&gt;Let’s define our own function.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;id&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;id&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function takes a value, and returns the value untouched.&lt;/p&gt;

&lt;p&gt;The top line is the type declaration. The name of the function (&lt;code&gt;id&lt;/code&gt;), followed by &lt;code&gt;::&lt;/code&gt;, and finally the type signature. It says, “Take a value of type &lt;code&gt;a&lt;/code&gt;, which can be anything, and return another value of the same type &lt;code&gt;a&lt;/code&gt;”.&lt;/p&gt;

&lt;p&gt;The bottom line is the computation. It takes a parameter and returns the parameter untouched. This might be a little confusing so let’s look at another example.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;const&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;const&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function takes two values, and returns the first one, ignoring the second.&lt;/p&gt;

&lt;p&gt;The type declaration says, “Take a value of any type &lt;code&gt;a&lt;/code&gt;, take another value of any type &lt;code&gt;b&lt;/code&gt; (can be the same or different type as &lt;code&gt;a&lt;/code&gt;), and return a value of type &lt;code&gt;a&lt;/code&gt;”. The type after the final &lt;code&gt;-&amp;gt;&lt;/code&gt; is the return type, and all the types before it are parameter types, also delimited by &lt;code&gt;-&amp;gt;&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;The function takes in two variables, &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;, and just returns &lt;code&gt;x&lt;/code&gt; untouched, similar to &lt;code&gt;id&lt;/code&gt; above. These functions have been extremely simple, so let’s look at a couple of slightly more challenging functions.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;concatenate3&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;concatenate3&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;allEqual&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Eq&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;allEqual&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In &lt;code&gt;concatenate3&lt;/code&gt;, the type signature says it takes 3 &lt;code&gt;String&lt;/code&gt;s and returns a &lt;code&gt;String&lt;/code&gt;. Notice how &lt;code&gt;String&lt;/code&gt; is a specific type, whereas &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; were general. You can mix and match specific and general types in type signatures. The function just concatenates the 3 &lt;code&gt;String&lt;/code&gt;s using &lt;code&gt;++&lt;/code&gt;. Again, we do not need parentheses, as Haskell will interpret the statement as &lt;code&gt;(x ++ y) ++ z&lt;/code&gt;, which is valid.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;allEqual&lt;/code&gt;, we see: &lt;code&gt;(Eq a) =&amp;gt;&lt;/code&gt;. For now, just think of this as restricting the domain of types &lt;code&gt;a&lt;/code&gt; to be types that can be compared for equality. Multiple restrictions are also allowed, i.e. &lt;code&gt;(Eq a, Ord a, Num b, ...) =&amp;gt;&lt;/code&gt;. The function just compares the parameters to check if they are all equal.&lt;/p&gt;

&lt;p&gt;Haskell makes creating anonymous functions simple.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nf&#39;&gt;\&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nf&#39;&gt;\&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; 
&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nf&#39;&gt;\&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;5&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Anonymous functions are wrapped by parentheses. They lead with a &lt;code&gt;\&lt;/code&gt;, then the arguments delimited by spaces, then a &lt;code&gt;-&amp;gt;&lt;/code&gt;, and finally the computation.&lt;/p&gt;

&lt;p&gt;In Haskell, functions are first-class, meaning functions can be passed in as arguments to other functions, returned from functions, assigned from variables, and held in data structures, such as lists.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;applyAndConcat&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;applyAndConcat&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;++&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;applyAndConcat&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;tail&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;init&lt;/span&gt; &lt;span class=&#39;s&#39;&gt;&amp;quot;Rickon&amp;quot;&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- &amp;quot;ickonRicko&amp;quot;&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- (tail &amp;quot;Rickon&amp;quot;) ++ (init &amp;quot;Rickon&amp;quot;)&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- &amp;quot;ickon&amp;quot; ++ &amp;quot;Ricko&amp;quot;&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- &amp;quot;ickonRicko&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;applyAndConcat&lt;/code&gt; takes in two functions, each of which take a &lt;code&gt;String&lt;/code&gt; and return a &lt;code&gt;String&lt;/code&gt;, takes in a &lt;code&gt;String&lt;/code&gt;, and returns a &lt;code&gt;String&lt;/code&gt;. Functions in type signatures are wrapped by parentheses: &lt;code&gt;(String -&amp;gt; String)&lt;/code&gt;. &lt;code&gt;applyAndConcat&lt;/code&gt; applies both functions to the same input &lt;code&gt;String&lt;/code&gt;, and returns the concatentation of the results.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;b&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;c&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;c&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;.&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nf&#39;&gt;\&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))&lt;/span&gt; 
&lt;span class=&#39;c1&#39;&gt;-- alternatively&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;.&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;nf&#39;&gt;\&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;g&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The function &lt;code&gt;.&lt;/code&gt; is called function composition, similar to the definition you see in math (“fog” notation). It returns a function that takes in an input, passes it to the function &lt;code&gt;g&lt;/code&gt;, and then pipes the result of &lt;code&gt;g&lt;/code&gt; into &lt;code&gt;f&lt;/code&gt;. Looking at the type signature, it makes sense. Given a value of type &lt;code&gt;a&lt;/code&gt;, you pass it into function &lt;code&gt;g&lt;/code&gt;, which returns a value of type &lt;code&gt;b&lt;/code&gt;, and the value of type &lt;code&gt;b&lt;/code&gt; gets passed into the function &lt;code&gt;f&lt;/code&gt;, which returns a value of type &lt;code&gt;c&lt;/code&gt;. Looking at it like it’s a black box, the type of the function composition is &lt;code&gt;(a -&amp;gt; c)&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;o&#39;&gt;$&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;$&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You often see &lt;code&gt;$&lt;/code&gt; in Haskell code. Looking at the definition, it seems as if &lt;code&gt;$&lt;/code&gt; does nothing. For the most part, &lt;code&gt;$&lt;/code&gt; is used not for computation, but for reducing the amount of parentheses needed. &lt;code&gt;not $ 3 &amp;lt; 5&lt;/code&gt; is the exact same as &lt;code&gt;not (3 &amp;lt; 5)&lt;/code&gt;. It’s just a matter of style. Also note that &lt;code&gt;$&lt;/code&gt; is not a special operator - it’s just a simple function, just like everything else.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;add&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;addToThree&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;add&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;addToThree&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 9&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- add 3 6&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;multiplyThreeNums&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;*&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;times32&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;multiplyThreeNums&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;8&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;4&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;times32&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 320&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- multiplyThreeNums 8 4 10&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;twoNumsTimes10&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;multiplyThreeNums&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;twoNumsTimes10&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;6&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- 120&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- multiplyThreeNums 10 6 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In Haskell, you can partially apply a function. That is, given a function that takes &lt;code&gt;n&lt;/code&gt; arguments, you can partially apply &lt;code&gt;k&lt;/code&gt; arguments (where &lt;code&gt;k &amp;lt; n&lt;/code&gt;), and you’ll end up with a function that takes &lt;code&gt;n-k&lt;/code&gt; arguments. Concretely, in the example, we see &lt;code&gt;add&lt;/code&gt;, which takes two arguments, and adds them together. &lt;code&gt;addToThree&lt;/code&gt; is a partially applied &lt;code&gt;add&lt;/code&gt;, where the first argument of &lt;code&gt;add&lt;/code&gt; is predefined as &lt;code&gt;3&lt;/code&gt;. Since the first argument is already defined, &lt;code&gt;addToThree&lt;/code&gt; only requires one more argument. Same idea for &lt;code&gt;multiplyThreeNums&lt;/code&gt;, where you can partially apply 1 or 2 arguments.&lt;/p&gt;

&lt;p&gt;Note that I didn’t add a type signature to any of the functions. In Haskell, if you don’t add a type signature, the compiler will automatically derive the type, allowing you the choice of whether or not to document the function.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;addFour&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; 
  &lt;span class=&#39;kr&#39;&gt;let&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
      &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
  &lt;span class=&#39;kr&#39;&gt;in&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;addFour&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt;
   &lt;span class=&#39;n&#39;&gt;z&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;
 &lt;span class=&#39;kr&#39;&gt;where&lt;/span&gt;
   &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
   &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;let ... in ...&lt;/code&gt; and &lt;code&gt;... where ...&lt;/code&gt; let you build up computation and store them in local variables. Picking between &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;where&lt;/code&gt; is a matter of preference - they achieve the same thing.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we see the typical fibonacci sequence using recursion. It’s no different compared to most other languages; the function calls itself. The &lt;code&gt;fib 0 = 1&lt;/code&gt; and &lt;code&gt;fib 1 = 1&lt;/code&gt; are interesting though. This is a case of “pattern matching”. Haskell goes down the list and tries to find a matching definition. It first checks if n is 0, and if so, returns the value associated with it (&lt;code&gt;fib 0 = 1&lt;/code&gt;). If n is not 0, then it goes down the list, and checks if n is 1, and returns the associated value if so (&lt;code&gt;fib 1 = 1&lt;/code&gt;). Otherwise, it goes to the catch-all definition, and returns that value (&lt;code&gt;fib n = fib (n - 1) + fib (n - 2)&lt;/code&gt;). Pattern matching is extremely useful in Haskell, and you’re bound to see it crop up in many places.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt;
  &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
  &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;otherwise&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; 
  &lt;span class=&#39;kr&#39;&gt;case&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;of&lt;/span&gt;
    &lt;span class=&#39;mi&#39;&gt;0&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
    &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
    &lt;span class=&#39;kr&#39;&gt;_&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt;
  &lt;span class=&#39;kr&#39;&gt;if&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;
   &lt;span class=&#39;kr&#39;&gt;then&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;
   &lt;span class=&#39;kr&#39;&gt;else&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;fib&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;n&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;-&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These are just variations of the same &lt;code&gt;fib&lt;/code&gt; function, using different syntax. The first one is called “guard expressions”, and uses &lt;code&gt;|&lt;/code&gt; followed by different cases and their values. &lt;code&gt;otherwise&lt;/code&gt; is just a catch-all value (in fact, &lt;code&gt;otherwise&lt;/code&gt; is the exact same as &lt;code&gt;True&lt;/code&gt;). Note that there is no &lt;code&gt;=&lt;/code&gt; before a guard expression. &lt;code&gt;case ... of ...&lt;/code&gt; is also pattern matching, except that you can also use it in the middle of a computation. &lt;code&gt;if ... then ... else ...&lt;/code&gt; is just a regular if statement. Note that every &lt;code&gt;if&lt;/code&gt; must have a corresponding &lt;code&gt;else&lt;/code&gt; in Haskell.&lt;/p&gt;

&lt;p&gt;Let’s define some bread-and-butter Haskell functions.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;_&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;xs&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;xs&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;addToThree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;+&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;map&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;addToThree&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;8&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;17&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [4, 11, 20]&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- (addToThree 1) : (map addToThree [4, 5])&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- 4 : (addToThree 8) : (map addToThree [5])&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- 4 : 11 : (addToThree 5) : (map addToThree [])&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- 4 : 11 : 20 : []&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- 4 : 11 : [20]&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- 4 : [11, 20]&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- [4, 11, 20]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt; takes a function and a list, and applies the function to every element of the list. &lt;code&gt;_&lt;/code&gt; is just ignoring the value of an argument. If we’ve reached the end of the list (the empty list &lt;code&gt;[]&lt;/code&gt;), there’s no need to bother with the value of the function. &lt;code&gt;_&lt;/code&gt; is not strictly necessary, but it adds to the readability of the pattern. &lt;code&gt;(x:xs)&lt;/code&gt; is the pattern matching notation of separating the head of the list (&lt;code&gt;x&lt;/code&gt;) and the rest of the list (&lt;code&gt;xs&lt;/code&gt;). So we see that in the case of the empty list, when there are no more elements to apply the function to, we return the empty list. Otherwise, we apply the function to the head of the list, and &lt;code&gt;:&lt;/code&gt; it onto the result of mapping the tail of the list.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;nf&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;_&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;[]&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;valid&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;xs&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; 
  &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;valid&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;:&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;valid&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;xs&lt;/span&gt;
  &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;otherwise&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;valid&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;xs&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;gtThree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;3&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;filter&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;gtThree&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;[&lt;/span&gt;&lt;span class=&#39;mi&#39;&gt;10&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;mi&#39;&gt;5&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;]&lt;/span&gt; &lt;span class=&#39;c1&#39;&gt;-- [10, 5]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;filter&lt;/code&gt; is similar to &lt;code&gt;map&lt;/code&gt;, except that it takes a function that converts an &lt;code&gt;a&lt;/code&gt; into a &lt;code&gt;Bool&lt;/code&gt;, and keeps a value in the list if &lt;code&gt;valid x&lt;/code&gt; returns &lt;code&gt;True&lt;/code&gt;. Otherwise it skips over the element.&lt;/p&gt;

&lt;p&gt;There are more list functions, including the big daddy &lt;code&gt;foldr&lt;/code&gt;, but researching and implementing them is &lt;em&gt;left as an exercise for the reader&lt;/em&gt; ™. Let’s move onto types. There are three ways to create new types.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;kr&#39;&gt;type&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Email&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;type&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Name&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;String&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;type&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;BigFunction&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;c&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;b&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;c&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;d&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;validForms&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Name&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Email&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- validForms :: String -&amp;gt; String -&amp;gt; Bool&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;crazyFunction&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;BigFunction&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;BigFunction&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- crazyFunction :: ((c -&amp;gt; d) -&amp;gt; (b -&amp;gt; c) -&amp;gt; (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; d)) -&amp;gt;&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;--                  ((c -&amp;gt; d) -&amp;gt; (b -&amp;gt; c) -&amp;gt; (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; d)) -&amp;gt;&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;--                  Bool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is called “type synonyms”. &lt;code&gt;type&lt;/code&gt; followed by the name of your type (must begin with a capital letter), followed by &lt;code&gt;=&lt;/code&gt;, and ended by an already defined type (such as &lt;code&gt;String&lt;/code&gt; or a function). Type synonyms do nothing other than provide extra documentation for the type signature, and reduce the amount of typing needed if you have a long type. The type synonyms can be used interchangeably with the types the represent. If you think that’s useless, just remember &lt;code&gt;type String = [Char]&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;kr&#39;&gt;data&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt;
&lt;span class=&#39;kr&#39;&gt;data&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Maybe&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Nothing&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Just&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;not&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Bool&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;not&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt;  &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;not&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;False&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;True&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;fromMaybe&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Maybe&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;fromMaybe&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Nothing&lt;/span&gt;  &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;x&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;fromMaybe&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;_&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Just&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we see Algebraic Data Types - we’re creating brand new types. Everything after the &lt;code&gt;data&lt;/code&gt; and before the &lt;code&gt;=&lt;/code&gt; is going to be part of the type signature (&lt;code&gt;func :: type1 -&amp;gt; type2 -&amp;gt; ... -&amp;gt; returntype&lt;/code&gt;). The parts after the &lt;code&gt;=&lt;/code&gt; are called value constructors, and will be part of the function computation. The &lt;code&gt;|&lt;/code&gt; works like an “or”: a &lt;code&gt;Bool&lt;/code&gt; can be either a &lt;code&gt;True&lt;/code&gt; &lt;em&gt;or&lt;/em&gt; a &lt;code&gt;False&lt;/code&gt;. &lt;code&gt;Bool&lt;/code&gt; is always part of the type signature, whereas during the computation, you work with &lt;code&gt;True&lt;/code&gt; and &lt;code&gt;False&lt;/code&gt;. Notice how you can both pattern match on the value constructors and use them during the computation (&lt;code&gt;not True = False&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Maybe String&lt;/code&gt;, &lt;code&gt;Maybe Int&lt;/code&gt;, and &lt;code&gt;Maybe a&lt;/code&gt; are all valid, but just &lt;code&gt;Maybe&lt;/code&gt; is invalid. The &lt;code&gt;a&lt;/code&gt; after the &lt;code&gt;Maybe&lt;/code&gt; type in &lt;code&gt;data Maybe a = ...&lt;/code&gt; is called a type parameter. Type parameters allow types to be polymorphic (i.e. &lt;code&gt;Maybe String&lt;/code&gt; and &lt;code&gt;Maybe Int&lt;/code&gt; are both supported). Any values after the value constructor name (&lt;code&gt;a&lt;/code&gt; in &lt;code&gt;Just a&lt;/code&gt;) are fields. The value constructors do not need to have the same amount of fields under it. &lt;code&gt;Nothing&lt;/code&gt; has zero fields, while &lt;code&gt;Just&lt;/code&gt; has one field of type &lt;code&gt;a&lt;/code&gt;. Again, you can pattern match on value constructors and their fields.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;kr&#39;&gt;data&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Empty&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Node&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;nf&#39;&gt;treeMap&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;b&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;treeMap&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;_&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Empty&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Empty&lt;/span&gt;
&lt;span class=&#39;nf&#39;&gt;treeMap&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Node&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;l&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;v&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;r&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Node&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;treeMap&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;l&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;v&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;treeMap&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;f&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;r&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;

&lt;span class=&#39;kr&#39;&gt;data&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Empty&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;|&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Node&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;left&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;value&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;right&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Tree&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;

&lt;span class=&#39;c1&#39;&gt;-- left  :: Tree a -&amp;gt; Tree a&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- value :: Tree a -&amp;gt; a&lt;/span&gt;
&lt;span class=&#39;c1&#39;&gt;-- right :: Tree a -&amp;gt; Tree a &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Algebraic Data Types can be self referencing. &lt;code&gt;Node&lt;/code&gt; has three fields, two of which are &lt;code&gt;Tree a&lt;/code&gt;s. The trees will be built up with &lt;code&gt;Node&lt;/code&gt;s, and &lt;code&gt;Empty&lt;/code&gt;s will be at the end of every tree. In &lt;code&gt;treeMap&lt;/code&gt;, we check if we’re at the end of a branch (&lt;code&gt;Empty&lt;/code&gt;) and return an &lt;code&gt;Empty&lt;/code&gt; if so. Otherwise we pattern match on the &lt;code&gt;Node&lt;/code&gt; to separate the subtrees and the value, apply the function on the value, apply the function recursively on the subtrees, and join them together with a &lt;code&gt;Node&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The second definition of &lt;code&gt;Tree&lt;/code&gt; is the same, except “record syntax” is used. Record syntax is an easy way to access fields. Instead of pattern matching to get the left subtree, you can just call the automatically generated function &lt;code&gt;left&lt;/code&gt; on a &lt;code&gt;Node&lt;/code&gt;: &lt;code&gt;left tree = leftSubtree&lt;/code&gt;. Record syntax is a great convenience that makes it easier to work with value constructors.&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;kr&#39;&gt;newtype&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;State&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;s&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;State&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;{&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;runState&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;::&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;s&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;s&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;,&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;a&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;newtype&lt;/code&gt; is used to generate a thin wrapper over another type. It can only have one value contructor, which can only have one field. There are other &lt;a href=&quot;http://www.haskell.org/haskellwiki/Newtype#The_messy_bits&quot; title=&quot;Subtle&quot;&gt;subtleties&lt;/a&gt;, but I’ll skip over them for the sake of brevity &lt;code&gt;newtype&lt;/code&gt; is extremely useful when dealing with typeclasses. What is a typeclass?&lt;/p&gt;

&lt;p&gt;It’s similar to an interface: a set of behaviors that a type must follow. For example, if a type is part of the &lt;code&gt;Eq&lt;/code&gt; typeclass, which deals with equality, it must implement either &lt;code&gt;==&lt;/code&gt; or &lt;code&gt;/=&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#39;highlight&#39;&gt;&lt;pre&gt;&lt;code class=&#39;haskell&#39;&gt;&lt;span class=&#39;kr&#39;&gt;data&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Rectangle&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Rect&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Int&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Int&lt;/span&gt;

&lt;span class=&#39;kr&#39;&gt;instance&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Eq&lt;/span&gt; &lt;span class=&#39;kt&#39;&gt;Rectangle&lt;/span&gt; &lt;span class=&#39;kr&#39;&gt;where&lt;/span&gt;
  &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Rect&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w1&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;h1&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;kt&#39;&gt;Rect&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w2&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;h2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;ow&#39;&gt;=&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;w1&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;w2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#39;p&#39;&gt;(&lt;/span&gt;&lt;span class=&#39;n&#39;&gt;h1&lt;/span&gt; &lt;span class=&#39;o&#39;&gt;==&lt;/span&gt; &lt;span class=&#39;n&#39;&gt;h2&lt;/span&gt;&lt;span class=&#39;p&#39;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we define a new data type called &lt;code&gt;Rect&lt;/code&gt;, and make &lt;code&gt;Rect&lt;/code&gt; an instance of &lt;code&gt;Eq&lt;/code&gt; by comparing the two fields of different &lt;code&gt;Rect&lt;/code&gt;s. This is quite a simplification, and typeclasses can get a little complex, but the gist is: typeclasses define a set of rules that other types must follow to be an instance of the typeclass. We can use typeclasses in type signatures if specific behaviors are needed. &lt;code&gt;func :: (Eq a) =&amp;gt; a -&amp;gt; b&lt;/code&gt;. Here, the type for &lt;code&gt;a&lt;/code&gt; must be an instance of &lt;code&gt;Eq&lt;/code&gt; for the program to compile.&lt;/p&gt;

&lt;p&gt;That’s it for basic Haskell. This tutorial probably went a bit fast, so if you don’t quite understand something, you might have to look it up. Good resources include &lt;a href=&quot;http://learnyouahaskell.com/&quot;&gt;Learn You a Haskell&lt;/a&gt;, &lt;a href=&quot;http://book.realworldhaskell.org/&quot;&gt;Real World Haskell&lt;/a&gt;, and &lt;a href=&quot;http://www.haskell.org/hoogle/&quot;&gt;Hoogle&lt;/a&gt;. Hoogle allows you to search using either the function name (&lt;code&gt;map&lt;/code&gt;) or its type signature (&lt;code&gt;(a -&amp;gt; b) -&amp;gt; [a] -&amp;gt; [b]&lt;/code&gt;). Hopefully now you can skim some Haskell code and understand it on a rudimentary level.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to /u/dave4420, /u/ingolemo, and /u/azeeem for correcting errors!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.reddit.com/r/haskell/comments/1jlpnu/a_quick_tour_of_haskell_syntax/&quot;&gt;Reddit discussion&lt;/a&gt;&lt;/p&gt;</description>
				<pubDate>Mon, 29 Jul 2013 00:00:00 -0700</pubDate>
				<link>http://prajitr.github.io/quick-haskell-syntax</link>
				<guid isPermaLink="true">http://prajitr.github.io/quick-haskell-syntax</guid>
			</item>
		
	</channel>
</rss>
