diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn
deleted file mode 100644
index d7870f5..0000000
--- a/.clj-kondo/config.edn
+++ /dev/null
@@ -1,2 +0,0 @@
-{:config-paths ["../resources/clj-kondo.exports/funcool/cats"]
- :lint-as {clojure.test.check.properties/for-all clojure.core/let}}
diff --git a/.clj-kondo/funcool/cats/config.edn b/.clj-kondo/funcool/cats/config.edn
deleted file mode 100644
index 0a11f75..0000000
--- a/.clj-kondo/funcool/cats/config.edn
+++ /dev/null
@@ -1,10 +0,0 @@
-{:lint-as {cats.core/mlet clojure.core/let
-           cats.core/alet clojure.core/let
-           cats.core/ap-> clojure.core/->
-           cats.core/ap->> clojure.core/->>
-           cats.core/as-ap-> clojure.core/as->
-           cats.core/->= clojure.core/->
-           cats.core/->>= clojure.core/->>
-           cats.core/as->= clojure.core/as->
-           cats.core/for clojure.core/for
-           cats.core/do-let clojure.core/for}}
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index e1aba69..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,22 +0,0 @@
-/target
-/classes
-/checkouts
-pom.xml
-pom.xml.asc
-*.jar
-*.class
-/.lein-*
-/.nrepl-port
-/*-init.clj
-/doc/dist/
-/out
-/repl
-/tests.js
-/node_modules
-\#*\#
-*~
-.\#*
-/.nrepl-history
-/nashorn_code_cache
-.lsp/.cache
-.clj-kondo/.cache
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1e9c2c6..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: clojure
-lein: lein
-sudo: false
-
-script:
-  - ./.travis/test-cljs.sh
-  - ./.travis/test-clj.sh
-jdk:
-  - oraclejdk8
diff --git a/.travis/test-clj.sh b/.travis/test-clj.sh
deleted file mode 100755
index 10b79ee..0000000
--- a/.travis/test-clj.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-# FIXME: Explicit namespace are needed because Leiningen ignores .cljc files :_
-#  https://github.com/technomancy/leiningen/issues/1827
-TEST_NAMESPACES=(
-    cats.core-spec
-    cats.data-spec
-    cats.builtin-spec
-    cats.labs.sugar-spec
-    cats.labs.channel-spec
-    cats.labs.manifold-spec
-    cats.labs.promise-spec
-    cats.monad.exception-spec
-    cats.monad.either-spec
-    cats.monad.maybe-spec
-    cats.monad.identity-spec
-)
-
-lein test ${TEST_NAMESPACES[@]}
diff --git a/.travis/test-cljs.sh b/.travis/test-cljs.sh
deleted file mode 100755
index 8b7471f..0000000
--- a/.travis/test-cljs.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-./scripts/build
-node out/tests.js
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index ffdac8e..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,308 +0,0 @@
-# Changelog #
-
-## Version 2.4.3
-
-Date: 2025-03-10
-
-- Change mlet to declare monad functions on a single let form to avoid too long class file names
-
-## Version 2.4.2
-
-Date: 2022-02-22
-
-- Exports clj-kondo configuration, this makes every lib consumer to lint correctly its usages
-
-## Version 2.4.1
-
-Date: 2020-11-04
-
-- Fix bug in `for` implementation
-
-## Version 2.4.0
-
-Date: 2020-11-03
-
-- Add `cats.core/for` macro
-
-## Version 2.3.6
-
-Date: 2020-04-07
-
-- Bump Promesa version from 1.9.0 to 5.1.0
-
-## Version 2.3.5
-
-Date: 2020-02-21
-
-- Change exception monad to catch all throwables instead of exceptions only
-
-## Version 2.3.4
-
-Date: 2020-02-11
-
-- gets can receive monad context as argument
-
-## Version 2.3.3
-
-Date: 2019-10-02
-
-- Fix typo in cats/monad/state.clj: -repr should return a string, not a regex
-
-## Version 2.3.2
-
-Date: 2018-11-07
-
-- Introduce haskell-inspired do-let macro
-
-## Version 2.3.1 ##
-
-Date: 2018-10-31
-
-- Override put,get,swap to receive monad context
-
-## Version 2.3.0 ##
-
-Date: 2018-08-29
-
-- Add state monad implementation
-
-Date: 2018-10-05
-
-- Implement Semigroup for Either
-
-## Version 2.2.0 ##
-
-Date: 2018-01-11
-
-- Fix some issues with wrong handling of dynamic context.
-- Convert some functions to macros for delay args evaluation.
-
-## Version 2.1.0 ##
-
-Date: 2017-04-20
-
-- Make cats work together with core.match for some types.
-- Convert `when` and `unless` to macros.
-- Update promesa dependency.
-
-## Version 2.0.0 ##
-
-Date: 2016-07-28
-
-This version intend to clean the library from unused and out of context stuff
-and leave only the useful abstractions. This is a list of main changes (mostly
-breaking):
-
-- Removed support for monad transformers. They add too many complex to the
-  implementation but in return adds very low value in context of dynamic
-  languages as is clojure.
-- Removed state, writer, reader and continuation monad namespaces.  They are not
-  very useful in clojure so having them without any particular usefulness it not
-  make sense.
-- Removed `cats.applicative` namespace because it is too many opinionated and
-  not really useful in the real world. The use case vary depending on when that
-  abstraction is used so we encourage users to define their own abstraction with
-  specific behavior for their application.
-- Removed CRDT's labs. It was an experiment and the final sensacion is that is
-  not very useful and in most circumstances the users defines their own
-  datastructures instead of rely on ones from third party packages. So,
-  maintaining them in the code base also does not make sense
-- Removed `lens` and `traversals` namespaces. The first one becomes very useful
-  and is properly externalized as [separated package][1]. The last one, seems
-  like it is not very useful and seems out of context of cats library. If anyone
-  is interested in maintaining it, the code can be extracted from the previos
-  git revisions and released as separated library.
-- Move `cats.labs.sugar` into `cats.core` namespace (`cats.labs.sugar` ns is
-  removed)
-
-And a list of other changes and contributions:
-
-- PersistentListq support in sequence context (@muhuk)
-- Rewrite `cats.labs.channel` integration with core.async combinators
-  (@yanatan16)
-- Add `cats.builtin.lazy-sequence-context` (@muhuk)
-- Fix bug in sequence context's fapply implementation (@muhuk)
-- Performance improvements in sequence context implementation (@muhuk)
-- Add `cats.monad.either/try-either` macro for capturing exceptions as left, values
-  as right (@shmish111)
-- Move `promesa.monad` namespace under `cats.labs.promise` ns.
-
-[1]: https://github.com/funcool/lentes
-
-
-## Version 1.2.1 ##
-
-Date: 2015-12-16
-
-- Fix functor implementation for Map.
-- Fix key overwritting on lenses focus/foci types.
-- Add utility functions to validation ns.
-
-
-## Version 1.2.0 ##
-
-Date: 2015-12-01
-
-- Add Bifunctor (@yurrriq)
-- Add a macro for lifting functions to applicatives
-
-## Version 1.1.0 ##
-
-Date: 2015-11-26
-
-- Add Lenses and Traversals.
-- Add timeout support for manifold deferred context.
-- Improved mapseq implementation.
-- Added function monoid and monad.
-- Implement functor, monad and foldable for any kind of map.
-- Make all types printable.
-- Add monadzero and monadplus for either and either-t.
-- Add `cats.labs.sugar` namespace with sugar syntax macros
-  (documentation is very welcome).
-- Update core.async version to 0.2.374
-- Update cljs compiler version to 0.7.170
-- Add basic support for crdt's under labs namespace.
-(documentation is missing).
-- Add test.check generators integration and property constructors
-
-
-## Version 1.0.0 ##
-
-Date: 2015-09-17
-
-### Bug fixes
-
-- The context doesn't need to be a monad anymore.
-- Fix Foldable implementation for clojure builtin collections.
-
-### New features
-
-- Add additional arity to `cats.core/mempty` function, that allows provide a context
-  instead of resolving it.
-- Sorted map is now also implements monoid.
-- Add `cats.labs` namespace for make room for previously removed **reader**, **writer**,
-  **state** and **continuation** monads.
-- Add core.async channel monad/applicative under `cats.labs.channel` namespace.
-- Add manifold deferred monad/applicative under `cats.labs.manifold` namespace.
-- Add **applicative-do** (with `alet` macro) syntax. You can read more about that in
-  [haskell wiki](https://ghc.haskell.org/trac/ghc/wiki/ApplicativeDo) and
-  [pull request](https://github.com/funcool/cats/pull/63).
-- Add **foldm** implementation to `cats.core` namespace.
-- Add a bunch of monoids: `all`, `any`, `sum`, `prod`, `pair` and `string`.
-- Add a [Traversable](https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Traversable.html)
-  protocol and implementations for vector, sequence, pair, maybe, either and validation.
-- Add **traverse** function to `cats.core` namespace.
-
-### Backwards incompatible changes
-
-- Revisit monad-transformers abstraction removing useless protocol methods: `base` and `inner`
-  are no longer part of the `MonadTrans` protocol.
-- The protocols methods are all renamed to `-name` for consistency with cljs style to
-  name internal functions.
-- The `Context` protocol has been renamed to `Contextual`, and `Context` is now a protocol
-  used to mark context instances and resolve their priority.
-
-
-## Version 0.6.1 ##
-
-Date: 2015-08-02
-
-- Remove src/user.clj that causes some problems.
-
-
-## Version 0.6.0 ##
-
-Date: 2015-08-02
-
-- Foldable abstraction.
-- Curry facilities.
-- Major code cleaning.
-- Context management moved into its own namespace.
-- A lot of performance improvements (removing unnecessary
-  function call forwarding).
-- Start using the clojurescript 1.7.28.
-
-
-## Version 0.5.0 ##
-
-Date: 2015-07-13
-
-- Set default and required clojure version to 1.7.0.
-- Replace cljx with clojure 1.7 conditional reader.
-- Add more util functions for treat for maybe monad types.
-- Add more util functions for treat for either monad types.
-- Add semigroup and monoid abstractions.
-- Add validation applicative (similar to either).
-- Minor performance improvements.
-- Fix inconsistences between fmap / fapply public functions
-  and its haskell-style aliases.
-- Add more documentation.
-- Deprecate the state, reader, writer and continuation
-  monads. They will be moved to a separated library for
-  future version.
-- Remove already deprecated `from-either` function.
-
-
-## Version 0.4.0 ##
-
-Date: 2015-03-25
-
-- The exception monad now raises a exception when you deref a failure instance.
-  This will allow easy use of monadic api from libraries or applications that
-  does not  use monads.
-- The `cats.monad.exception/failure` function now coerce all input that not
-  extends from exception to exception type (using `ex-info` clojure function).
-- Add channel monad using core.async channels abstraction (as separated repository)
-  This make easy treat channels as monads and using them in monadic compositions.
-- Remove mlet-with macro (bacause it sintax is ugly and with-monad usage is preferable)
-- Remove undocumented errlet macro.
-
-
-## Version 0.3.4 ##
-
-Date: 2015-03-14
-
-- Improve cljx build process.
-
-
-## Version 0.3.3 ##
-
-Date: 2015-03-14
-
-- Improvements on project.clj.
-
-
-## Version 0.3.2 ##
-
-Date: 2015-02-08
-
-- Empty version, only exists because clojars does not
-  allow remove wrong uploaded versions.
-
-
-## Version 0.3.0 ##
-
-Date: 2015-02-08
-
-- Dependencies versions update.
-- Add new arity to from-maybe function for default value.
-- Update required clojurescript version to 0.0-2760.
-- Use speclj for tests.
-- Add IDeref implementation to either, maybe, identity and exception monads types.
-- Remove maybe useless lazy monad.
-
-## Version 0.2.0 ##
-
-Date: 2014-10-26
-
-- Major api redesign.
-- Split monad definition from data type.
-- mlet macro is now not recursive.
-- New monads: lazy, exception.
-- Monad transformers.
-
-## Version 0.1.0 ##
-
-Date: 2014-07-09
-
-- First relase.
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index f9774e7..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index b0fde6a..0000000
--- a/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-cats
-====
-
-[![Travis Badge](https://img.shields.io/travis/funcool/cats/master.svg)](https://travis-ci.org/funcool/cats "Travis Badge")
-[![Join the chat at https://gitter.im/funcool/cats](https://badges.gitter.im/funcool/cats.svg)](https://gitter.im/funcool/cats?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-![](./logo/logo.png "cats logo")
-
-<blockquote>
-And there are my cats, engaged in a ritual that goes back thousands of years, tranquilly licking themselves after the meal. Practical animals, they prefer to have others provide the food ... some of them do. There must have been a split between the cats who accepted domestication and those who did not.
-<br/> <br/>
--- <cite>William S. Burroughs, The Cat Inside</cite>
-</blockquote>
-
-[![Clojars Project](http://clojars.org/funcool/cats/latest-version.svg)](http://clojars.org/funcool/cats)
-
-Category Theory and algebraic abstractions for Clojure and ClojureScript.
-
-Stable:
-
-- **Documentation:** http://funcool.github.io/cats/latest/
-- **API reference:** http://funcool.github.io/cats/latest/api/
-
-### Tests
-
-To run Clojure tests:
-
-```
-lein test
-```
-
-To run ClojureScript tests:
-
-```
-./scripts/build
-node out/tests.js
-```
diff --git a/dev/benchmarks.clj b/dev/benchmarks.clj
deleted file mode 100644
index d0274fc..0000000
--- a/dev/benchmarks.clj
+++ /dev/null
@@ -1,29 +0,0 @@
-(ns benchmarks
-  (:use cats.builtin)
-  (:require [criterium.core :as c]
-            [cats.core :as m])
-  (:gen-class))
-
-(def range1 (into [] (range 100)))
-(def range2 (into [] (range 200)))
-
-(defn bench-for-loop
-  []
-  (letfn [(using-for-loop []
-            (doall
-             (for [x range1
-                   y range2]
-               [x y])))
-          (using-cats-mlet []
-            (m/mlet [x range1
-                     y range2]
-              [x y]))]
-    (println "***************** FOR LOOP ********************")
-    (c/with-progress-reporting (c/bench (using-for-loop) :verbose))
-    (println "***************** MLET ********************")
-    (c/with-progress-reporting (c/bench (using-cats-mlet) :verbose))))
-
-(defn -main
-  [& args]
-  (bench-for-loop))
-
diff --git a/dev/user.clj b/dev/user.clj
deleted file mode 100644
index d90ca21..0000000
--- a/dev/user.clj
+++ /dev/null
@@ -1,37 +0,0 @@
-(ns user
-  (:require [clojure.tools.namespace.repl :as r]
-            [clojure.walk :refer [macroexpand-all]]
-            [clojure.pprint :refer [pprint]]
-            [clojure.test :as test]))
-
-(defonce ^:dynamic
-  *namespaces*
-  ['cats.core-spec
-   'cats.builtin-spec
-   'cats.labs.channel-spec
-   'cats.monad.identity-spec
-   'cats.monad.either-spec
-   'cats.monad.exception-spec
-   'cats.monad.maybe-spec])
-
-(defn run-tests'
-  []
-  (apply test/run-tests *namespaces*))
-
-(defn run-tests
-  [& nss]
-  (if (pos? (count nss))
-    (binding [*namespaces* nss]
-      (r/refresh :after 'user/run-tests'))
-    (r/refresh :after 'user/run-tests')))
-
-(defn trace
-  "Asynchronous friendly println variant."
-  [& strings]
-  (locking println
-    (apply println strings)))
-
-;; (require '[cats.core :as m]
-;;          '[cats.context :as mc]
-;;          '[cats.monad.either :as either]
-;;          '[cats.builtin])
diff --git a/doc/Makefile b/doc/Makefile
deleted file mode 100644
index d622865..0000000
--- a/doc/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all: doc
-
-api:
-	cd ..
-	lein doc
-
-doc:
-	mkdir -p dist/latest/
-	cp ../logo/logo.png dist/latest/
-	asciidoctor -a docinfo -a stylesheet! -o dist/latest/index.html content.adoc
-
-github: doc api
-	ghp-import -m "Generate documentation" -b gh-pages dist/
-	git push origin gh-pages
diff --git a/doc/content-docinfo.html b/doc/content-docinfo.html
deleted file mode 100644
index a16e8f9..0000000
--- a/doc/content-docinfo.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Liberation+Mono:400|Roboto+Slab:400,700"/>
-<link rel="stylesheet" href="https://www.niwi.nz/_assets/asciidoctor-styles/simple-red-titles/stylesheet.css"/>
diff --git a/doc/content.adoc b/doc/content.adoc
deleted file mode 100644
index 381e603..0000000
--- a/doc/content.adoc
+++ /dev/null
@@ -1,1660 +0,0 @@
-= Cats Documentation
-Andrey Antukh & Alejandro Gómez
-2.3.0
-:toc: left
-:!numbered:
-:idseparator: -
-:idprefix:
-:sectlinks:
-:source-highlighter: pygments
-:pygments-style: friendly
-
-image:logo.png[cats logo]
-
-== Introduction
-
-Category Theory and algebraic abstractions for Clojure.
-
-
-== Rationale
-
-The main motivations for writing this library are:
-
-* The existing libraries do not have support for ClojureScript.
-* We do not intend to write a little Haskell inside Clojure. We have adopted a
-  practical and Clojure like pragmatic approach, always with correctness in mind.
-* We do not like viral/copyleft like licenses and in contrast to other libraries
-  cats is licensed under the BSD (2 clauses) license.
-* We do not intend to only implement monads. Other category theory and algebraic
-  abstractions are also first class in cats.
-
-
-== Install
-
-The simplest way to use _cats_ in a Clojure project is by including
-it as a dependency in your *_project.clj_*:
-
-[source,clojure]
-----
-[funcool/cats "2.2.0"]
-----
-
-And it works with the following platforms: *jdk7*, *jdk8*, *node*
-(4.2.0, 5.10.1 and 6.2.0).
-
-
-== User Guide
-
-This section introduces almost all the category theory and algebraic abstractions
-that the _cats_ library supports.
-
-We will use _Maybe_ for the example snippets, because it has support for all
-the abstractions and is very easy to understand. You can read more about it in
-the next section of this documentation.
-
-
-=== Semigroup
-
-A semigroup is an algebraic structure with an associative binary operation
-(`mappend`). Most of the builtin collections form a semigroup because their
-associative binary operation is analogous to Clojure's `into`.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.builtin])
-
-(m/mappend [1 2 3] [4 5 6])
-;; => [1 2 3 4 5 6]
-----
-
-Given that the values it contains form a Semigroup, we can `mappend` multiple
-_Maybe_ values.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.builtin])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mappend (maybe/just [1 2 3])
-           (maybe/just [4 5 6]))
-;; => #<Just [1 2 3 4 5 6]>
-----
-
-
-=== Monoid
-
-A Monoid is a Semigroup with an identity element (`mempty`). For the collection
-types the `mempty` function is analogous to Clojure's `empty`.
-
-Given that the values it contains form a Semigroup, we can `mappend` multiple
-_Maybe_, with Nothing being the identity element.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.builtin])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mappend (maybe/just [1 2 3])
-           (maybe/nothing)
-           (maybe/just [4 5 6])
-           (maybe/nothing))
-;; => #<Just [1 2 3 4 5 6]>
-----
-
-
-=== Functor
-
-Let's dive into the functor. The Functor represents some sort of "computational
-context", and the abstraction consists of one unique function: *fmap*.
-
-.Signature of *fmap* function
-[source, clojure]
-----
-(fmap [f fv])
-----
-
-The higher-order function *fmap* takes a plain function as the first parameter and
-a value wrapped in a functor context as the second parameter. It extracts the
-inner value, applies the function to it and returns the result wrapped in same type
-as the second parameter.
-
-But what is the *functor context*? It sounds more complex than it is. A Functor
-wrapper is any type that acts as "Box" and implements the `Context` and `Functor`
-protocols.
-
-.One good example of a functor is the *Maybe* type:
-[source, clojure]
-----
-(require '[cats.monad.maybe :as maybe])
-
-(maybe/just 2)
-;; => #<Just 2>
-----
-
-The `just` function is a constructor of the Just type that is part of the
-Maybe monad.
-
-Let's see one example of using *fmap* over a *just* instance:
-
-.Example using fmap over *just* instance.
-[source, clojure]
-----
-(require '[cats.core :as m])
-
-(m/fmap inc (maybe/just 1))
-;; => #<Just 2>
-----
-
-The *Maybe* type also has another constructor: `nothing`. It represents the
-absence of a value. It is a safe substitute for `nil` and may represent failure.
-
-Let's see what happens if we perform the same operation as the previous example
-over a *nothing* instance:
-
-.Example using fmap over *nothing*.
-[source, clojure]
-----
-(require '[cats.monad.maybe :as maybe])
-(require '[cats.core :as m])
-
-(m/fmap inc (maybe/nothing))
-;; => #<Nothing>
-----
-
-Oh, awesome, instead of raising a `NullPointerException`, it just returns
-*nothing*. Another advantage of using the functor abstraction, is that it
-always returns a result of the same type as its second argument.
-
-Let's see an example of applying fmap over a Clojure vector:
-
-.Example using fmap over *vector*.
-[source, clojure]
-----
-(require '[cats.builtin])
-
-(m/fmap inc [1 2 3])
-;; => [2 3 4]
-----
-
-The main difference compared to the previous example with Clojure's map function,
-is that map returns lazy seqs no matter what collection we pass to it:
-
-[source, clojure]
-----
-(type (map inc [1 2 3]))
-;; => clojure.lang.LazySeq (cljs.core/LazySeq in ClojureScript)
-----
-
-But why can we pass vectors to the `fmap` function? Because some Clojure container
-types like vectors, lists and sets, also implement the functor abstraction. See
-the section on built-in types for more information.
-
-
-=== Applicative
-
-Let's continue with applicative functors. The Applicative Functor represents
-some sort of "computational context" like a plain Functor, but with the ability to
-execute a function wrapped in the same context.
-
-The Applicative Functor abstraction consists of two functions: *fapply* and
-*pure*.
-
-.Signature of *fapply* function
-[source, clojure]
-----
-(fapply [af av])
-----
-
-NOTE: the *pure* function will be explained later.
-
-The use case for Applicative Functors is roughly the same as for plain Functors:
-safe evaluation of some computation in a context.
-
-Let's see an example to better understand the differences between functor and
-applicative functor:
-
-Imagine you have some factory function that, depending on the language, returns a
-greeter function, and you only support a few languages.
-
-
-[source, clojure]
-----
-(defn make-greeter
-  [^String lang]
-  (condp = lang
-    "es" (fn [name] (str "Hola " name))
-    "en" (fn [name] (str "Hello " name))
-    nil))
-----
-
-Now, before using the resulting greeter you should always defensively check if
-the returned greeter is a valid function or a nil value.
-
-Let's convert this factory to use the Maybe type:
-
-[source, clojure]
-----
-(defn make-greeter
-  [^String lang]
-  (condp = lang
-    "es" (maybe/just (fn [name] (str "Hola " name)))
-    "en" (maybe/just (fn [name] (str "Hello " name)))
-    (maybe/nothing)))
-----
-
-As you can see, this version of the factory differs only slightly from the
-original implementation. And this tiny change gives you a new superpower: you
-can apply the returned greeter to any value without a defensive nil check:
-
-[source, clojure]
-----
-(m/fapply (make-greeter "es") (maybe/just "Alex"))
-;; => #<Just "Hola Alex">
-
-(m/fapply (make-greeter "en") (maybe/just "Alex"))
-;; => #<Just "Hello Alex">
-
-(m/fapply (make-greeter "it") (maybe/just "Alex"))
-;; => #<Nothing>
-----
-
-Moreover, the applicative functor comes with the *pure* function, which allows
-you to put some value in side-effect-free context of the current type.
-
-Examples:
-
-[source, clojure]
-----
-(require '[cats.monad.maybe :as maybe])
-
-(m/pure maybe/context 5)
-;; => #<Just 5>
-----
-
-If you do not understand the purpose of the *pure* function, the next sections
-should clarify its purpose.
-
-
-=== Foldable
-
-The *Foldable* is a generic abstraction for data structures that can be folded. It
-consists mainly on two functions: `foldl` and `foldr`. `foldl` is also known as
-`reduce` or `inject` in other mainstream programming languages.
-
-Both function have an identical signature and differ in how they traverse the
-data structure. Let's look at a little example using `foldl`:
-
-[source, clojure]
-----
-(m/foldl (fn [acc v] (+ acc v)) 0 [1 2 3 4 5])
-;; => 15
-----
-
-You can observe that `foldl` is identical to the clojure `reduce` function:
-
-[source, clojure]
-----
-(reduce (fn [acc v] (+ acc v)) 0 [1 2 3 4 5])
-;; => 15
-----
-
-And the same operation can be done using `foldr`:
-
-[source, clojure]
-----
-(m/foldr (fn [v wc] (+ v wc)) 0 [1 2 3 4 5])
-;; => 15
-----
-
-The main difference between `foldl` and `reduce` is that `foldl` has a fixed
-arity so all parameters are mandatory and `foldl` is a generic abstraction that
-can work with other types apart from collections.
-
-As we said previously, the `foldl` and `foldr` differ mainly on how they traverse
-the data structure. Then, for understanding better how they work internally,
-let's see a graphical representation of the `foldl` execution model:
-
-[source, text]
-----
-((((acc⊕1)⊕2)⊕3)⊕4)⊕5
-----
-
-In contrast to the `foldr` internal execution model that looks like that:
-
-[source, text]
-----
-1⊕(2⊕(3⊕(4⊕(5⊕(wc)))))
-----
-
-In languages with strict argument evaluation, `foldr` does not have many
-applications because when the data structure to fold grows it tends to consume
-all the stack (causing the well known stack overflow). In case of Clojure,
-the unique obvious case of using foldr is for small datastructures.
-
-[source, clojure]
-----
-(m/foldr #(cons (inc %1) %2) '() (range 100000))
-;; => StackOverflowError
-----
-
-The *Foldable* abstraction is already implemented for Clojure vectors, lazy seqs
-and ranges plus the cats maybe, either and validation types. Let see an example
-how it behaves with maybe:
-
-[source, clojure]
-----
-(m/foldl #(m/return (+ %1 %2)) 1 (maybe/just 1))
-;; => #<Just 2>
-
-(m/foldl #(m/return (+ %1 %2)) 1 (maybe/nothing))
-;; => 1
-----
-
-It there also other fold functions that are implemented in terms of the basic
-`foldl` or `foldr` that can be *foldm* and *foldmap*. At this moment, cats comes
-only with *foldm*.
-
-The *foldm* function in analgous to the `foldl` in terms of how it does the
-fold operation, with the difference that is aware of the monad context. Or in
-other terms, it works with reducing function that return monad types.
-
-Let see an example:
-
-[source, clojure]
-----
-(defn m-div
-  [x y]
-  (if (zero? y)
-    (maybe/nothing)
-    (maybe/just (/ x y))))
-
-(m/foldm m-div 1 [1 2 3])
-;; => #<Just 1/6>
-
-
-(m/foldm m-div 1 [1 0 3])
-;; => #<Nothing>
-----
-
-
-=== Traversable
-
-The *Traversable* is a generic abstraction for data structures that can be
-traversed from left to right, running an Applicative action for each element.
-Traversables must also be Functors and Foldables.
-
-Note that, since Traversables use the Applicative's `pure` operation, the context
-of the applicative must be set when using the `traverse` function.
-
-Let's look at an example: we have a vector with numbers that we want to map to
-a Maybe value, and we want to aggregate the result in a Maybe. If any of the
-actions fails (is Nothing) the resulting aggregate will be Nothing, but if all
-succeed we preserve the vector's structure inside a Just value.
-
-First of all, we define the function that will transform a number to a Maybe.
-Our function will wrap the value in a Just if it's even and in a Nothing if it's
-not:
-
-[source, clojure]
-----
-(require '[cats.monad.maybe :as maybe])
-
-(defn just-if-even
-  [n]
-  (if (even? n)
-    (maybe/just n)
-    (maybe/nothing)))
-----
-
-Now that we have a function that maps a value to the Maybe Applicative, we can
-traverse a vector of numbers and aggregate a Maybe value. The applicatives will
-be evaluated from left to right using the applicative's `fapply`.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.context :as ctx])
-
-(ctx/with-context maybe/context
-  (m/traverse just-if-even []))
-;; => #<Just []>
-
-(ctx/with-context maybe/context
-  (m/traverse just-if-even [2 4]))
-;; => #<Just [2 4]>
-
-(ctx/with-context maybe/context
-  (m/traverse just-if-even [1 2]))
-;; => #<Nothing>
-
-(ctx/with-context maybe/context
-  (m/traverse just-if-even [2 3]))
-;; => #<Nothing>
-----
-
-
-=== Monad
-
-Monads are the most discussed programming concept to come from category theory.
-Like functors and applicatives, monads deal with data in contexts.
-
-Additionally, monads can also transform contexts by unwrapping data, applying
-functions to it and putting new values in a completely different context.
-
-The monad abstraction consists of two functions: *bind* and *return*
-
-.Bind function signature.
-[source,clojure]
-----
-(bind [mv f])
-----
-
-As you can see, bind works much like a Functor but with inverted arguments. The
-main difference is that in a monad, the function is responsible for wrapping a
-returned value in a context.
-
-.Example usage of the bind higher-order function.
-[source,clojure]
-----
-(m/bind (maybe/just 1)
-        (fn [v] (maybe/just (inc v))))
-;; => #<Just 2>
-----
-
-One of the key features of the bind function is that any computation executed
-within the context of bind (monad) knows the context type implicitly. With this,
-if you apply some computation over some monadic value and you want to return
-the result in the same container context but don't know what that container is,
-you can use `return` or `pure` functions:
-
-.Usage of return function in bind context.
-[source,clojure]
-----
-(m/bind (maybe/just 1)
-        (fn [v]
-          (m/return (inc v))))
-;; => #<Just 2>
-----
-
-The `return` or `pure` functions, when called with one argument, try to use
-the dynamic scope context value that's set internally by the `bind` function.
-Therefore, you can't use them with one argument outside of a `bind` context.
-
-We now can compose any number of computations using monad *bind*
-functions. But observe what happens when the number of computations increases:
-
-.Composability example of bind function.
-[source, clojure]
-----
-(m/bind (maybe/just 1)
-        (fn [a]
-          (m/bind (maybe/just (inc a))
-                  (fn [b]
-                    (m/return (* b 2))))))
-----
-
-This can quickly lead to callback hell. To solve this, _cats_ comes with a powerful
-macro: *mlet*
-
-.Previous example but using *mlet* macro.
-[source, clojure]
-----
-(m/mlet [a (maybe/just 1)
-         b (maybe/just (inc a))]
-  (m/return (* b 2)))
-----
-
-
-=== MonadZero
-
-Some monads also have the notion of an identity element analogous to that of
-Monoid. When calling `bind` on a identity element for a monad, the same value is
-returned. This means that whenever we encounter the identity element in a monadic
-composition it will short-circuit.
-
-For the already familiar Maybe type the identity element is Nothing:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mzero maybe/context)
-;; => #<Nothing>
-----
-
-Having an identity element we can make a monadic composition short-circuit using
-a predicate:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/bind (maybe/just 1)
-        (fn [a]
-          (m/bind (if (= a 2)
-                    (m/return nil)
-                    (m/mzero))
-                  (fn [_]
-                    (m/return (* a 2))))))
-;; => #<Nothing>
-----
-
-As you can see in the above example the predicate `(= a 2)` returns either a
-monadic value `(m/return nil)` or the identity value for the maybe monad. This
-can be captured in a function, which is available in `cats.core` namespace:
-
-[source, clojure]
-----
-(defn guard
-  [b]
-  (if b
-    (return nil)
-    (mzero)))
-----
-
-The above example could be rewritten as:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/bind (maybe/just 1)
-        (fn [a]
-          (m/bind (m/guard (= a 2))
-                  (fn [_]
-                    (m/return (* a 2))))))
-;; => #<Nothing>
-----
-
-Or, using mlet:
-
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mlet [a (maybe/just 1)
-         :when (= a 2)]
-   (m/return (* a 2)))
-;; => #<Nothing>
-----
-
-
-=== MonadPlus
-
-MonadPlus is a complementary abstraction for Monads that support an associative
-binary operation, analogous to that of a Semigroup. If the monad implements the
-MonadZero and MonadPlus protocols it forms a monoid.
-
-For the Maybe type, `mplus` acts similarly to a logical OR that treats `Nothing`
-values as falsey.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mplus (maybe/nothing))
-;; => #<Nothing>
-
-(m/mplus (maybe/nothing) (maybe/just 1))
-;; => #<Just 1>
-
-(m/mplus (maybe/just 1) (maybe/just 2))
-;; => #<Just 1>
-----
-
-
-== Types
-
-This section will take a tour over the types exposed in cats library and explain
-how they can be used in the previously explained abstractions.
-
-
-=== Maybe
-
-This is one of the two most used monad types (also known as Optional in other
-programming languages).
-
-The Maybe monad represents encapsulation of an optional value; e.g. it is used
-as the return type of functions which may or may not return a meaningful value
-when they are applied. It consists of either an empty constructor (called None
-or Nothing), or a constructor encapsulating the original data type A (e.g.
-Just A or Some A).
-
-_cats_, implements two types:
-
-- `Just` that represents a value in a context.
-- `Nothing` that represents the abscense of value.
-
-.Example creating instances of `Just` and `Nothing` types:
-[source, clojure]
-----
-(maybe/just 1)
-;; => #<Just 1>
-
-(maybe/nothing)
-;; => #<Nothing>
-----
-
-There are other useful functions for working with maybe monad types in the same
-namespace. See the API documentation for a full list of them. But here we will
-explain a little relevant subset of them.
-
-We mentioned above that *fmap* extracts the value from a functor context. You
-will also want to extract values wrapped by *just* and you can do that with
-*from-maybe*.
-
-As we said previously, the Just or Nothing instances act like wrappers and
-in some circumstances you will want extract the plain value from them. cats offers
-the `from-maybe` function for that.
-
-.Example using *from-maybe* to extract values wrapped by *just*.
-[source, clojure]
-----
-(maybe/from-maybe (maybe/just 1))
-;; => 1
-
-(maybe/from-maybe (maybe/nothing))
-;; => nil
-
-(maybe/from-maybe (maybe/nothing) 42)
-;; => 42
-----
-
-The `from-maybe` function is a specialized version of a more generic one:
-`cats.core/extract`. The generic version is a polymorphic function and will
-also work with different types of different monads.
-
-For interoperability with Clojure and ClojureScript's `IDeref` abstraction,
-maybe values are derrefable.
-
-.Example using *deref* to extract values wrapped by *just*.
-[source, clojure]
-----
-(deref (maybe/just 1))
-;; => 1
-
-(deref (maybe/nothing))
-;; => nil
-----
-
-
-=== Either
-
-Either is another type that represents a result of a computation, but (in
-contrast with maybe) it can return some data with a failed computation result.
-
-In _cats_ it has two constructors:
-
-- `(left v)`: represents a failure.
-- `(right v)`: represents a successful result.
-
-.Usage example of *Either* constructors.
-[source, clojure]
-----
-(require '[cats.monad.either :refer :all])
-
-(right :valid-value)
-;; => #<Right [:valid-value :right]>
-
-(left "Error message")
-;; => #<Either [Error message :left]>
-----
-
-NOTE: Either is also (like Maybe) a Functor, Applicative Functor and Monad.
-
-Like Maybe, Either values can be dereferenced returning the value they contain.
-
-
-=== Exception
-
-Also known as the Try monad, as popularized by Scala.
-
-It represents a computation that may either result in an exception or return
-a successfully computed value. Is very similar to the Either monad, but is
-semantically different.
-
-It consists of two types: Success and Failure. The Success type is a simple
-wrapper, like Right of the Either monad. But the Failure type is slightly different
-from Left, because it always wraps an instance of Throwable (or any value in
-cljs since you can throw arbitrary values in the JavaScript host).
-
-The most common use case of this monad is to wrap third party libraries that
-use standard Exception based error handling. Under normal circumstances,
-however, you should use Either instead.
-
-It is an analogue of the try-catch block: it replaces try-catch's stack-based
-error handling with heap-based error handling. Instead of having an exception
-thrown and having to deal with it immediately in the same thread, it disconnects
-the error handling and recovery.
-
-.Usage example of *try-on* macro.
-[source, clojure]
-----
-(require '[cats.monad.exception :as exc])
-
-(exc/try-on 1)
-;; => #<Success [1]>
-
-(exc/try-on (+ 1 nil))
-;; => #<Failure [#<NullPointerException java.lang.NullPointerException>]>
-----
-
-_cats_ comes with other syntactic sugar macros: `try-or-else` that returns a
-default value if a computation fails, and `try-or-recover` that lets you handle
-the return value when executing a function with the exception as first parameter.
-
-.Usage example of `try-or-else` macro.
-[source, clojure]
-----
-(exc/try-or-else (+ 1 nil) 2)
-;; => #<Success [2]>
-----
-
-.Usage example of `try-or-recover` macro.
-[source, clojure]
-----
-(exc/try-or-recover (+ 1 nil)
-                    (fn [e]
-                      (cond
-                        (instance? NullPointerException e) 0
-                        :else 100)))
-;; => #<Success [0]>
-----
-
-The types defined for the Exception monad (Success and Failure) also implement
-the Clojure IDeref interface, which allows library development using monadic
-composition without forcing a user of that library to use or understand monads.
-
-That is because when you dereference the failure instance, it will reraise the
-enclosed exception.
-
-.Example dereferencing a failure instance
-[source, clojure]
-----
-(def f (exc/try-on (+ 1 nil)))
-
-@f
-;; => NullPointerException   clojure.lang.Numbers.ops (Numbers.java:961)
-----
-
-
-=== Built in types
-
-Some of the abstractions in _cats_ are implemented for built-in types but you
-can't use them directly. First, you must load the `cats.builtin` namespace:
-
-[source, clojure]
-----
-(require '[cats.builtin])
-(require '[cats.core :as m])
-
-(m/fmap inc [1 2 3 4])
-;; => [2 3 4 5]
-----
-
-
-==== nil
-
-Given the fact that `nil` is both a value and a type, we have extended the `nil`
-type to be equivalent to Maybe monad's `Nothing`. This means that you can use
-`nil` as if were a `Just` instance like in the following example:
-
-[source, clojure]
-----
-(use 'cats.builtin)
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mlet [x (maybe/just 42)
-         y nil]
-  (m/return (+ x y)))
-;; => nil
-----
-
-As you can see, the `mlet` short-circuits when encountering a `nil` value.
-
-
-==== Vector
-
-Clojure vectors also participate in several of the abstractions implemented
-in _cats_, most notably as a monad. Compare the following `for` comprehension:
-
-[source, clojure]
-----
-(for [x [1 2]
-      y [3 4 5]]
-   (+ x y))
-;; => (4 5 6 5 6 7)
-----
-
-with the equivalent using _mlet_:
-
-[source, clojure]
-----
-(use 'cats.builtin)
-(require '[cats.core :as m])
-
-(m/mlet [x [1 2]
-         y [3 4 5]]
-  (m/return (+ x y)))
-;; => [4 5 6 5 6 7]
-----
-
-Note the symmetry between `for` and `mlet`. This is not accidental, both are
-what is called a monad comprehension, the difference is that `for` is limited to
-sequences and `mlet` can work with arbitrary monads.
-
-Also, since `mlet` desugars into calls to the Monad's `bind` function, its result
-keeps the type of the monadic values.
-
-
-==== Lazy sequences
-
-Lazy sequences implement the same abstractions as vectors with practically an
-identical implementation. If you don't need the results right away or are
-interested in a subset of the final results, you can use lazy sequence
-comprehensions.
-
-Using `mlet` with lazy sequences yields exactly the same result as using `for`:
-
-[source, clojure]
-----
-(use 'cats.builtin)
-(require '[cats.core :as m])
-
-(m/mlet [x (lazy-seq [1 2])
-         y (lazy-seq [3 4 5])]
-  (m/return (+ x y)))
-;; => (4 5 6 5 6 7)
-----
-
-
-==== Set
-
-Sets implement almost every abstraction in _cats_, from Semigroup to Monad.
-
-[source, clojure]
-----
-(use 'cats.builtin)
-(require '[cats.core :as m])
-
-(m/pure set-context 42)
-;; => #{42}
-
-(m/fmap inc #{1 2 3 4})
-;; => #{4 3 2 5}
-
-(m/bind #{1 2 3}
-        (fn [v] #{v (inc v)}))
-;; => #{1 4 3 2}
-----
-
-
-==== Map
-
-Maps implement the _Semigroup_ protocol, since we can use `merge` as their
-associative binary operation. Using `mappend` on maps is a way to merge them
-together:
-
-[source, clojure]
-----
-(use 'cats.builtin)
-(require '[cats.core :as m])
-
-(m/mappend {:a "A"} {:b "B"})
-;; => {:a "A", :b "B"}
-----
-
-Since we can consider the empty map an identity element for the `mappend`
-associative binary operation maps also implement _Monoid_ and the `mempty`
-function gives an empty map.
-
-
-== Syntax sugar
-
-Additionally to the abstractions and types, *cats* exposes some powerful
-syntax abstractions that surelly will make the usage of that abstractions
-in a more familiar way.
-
-
-=== mlet
-
-The `mlet` syntactic abstraction intends to facilitate the composition
-of monadic operations.
-
-If you've followed along with the documentation you've seen many examples
-of its usage already, let's see what can `mlet` do. First of all, mlet turns
-this let-like bindings:
-
-[source, clojure]
-----
-(m/mlet [a (maybe/just 1)
-         b (maybe/just (inc a))]
-  (m/return (* a b)))
-----
-
-into a chain of calls to bind:
-
-[source, clojure]
-----
-(m/bind (maybe/just 1)
-        (fn [a]
-          (m/bind (maybe/just (inc a))
-                  (fn [b]
-                    (m/return (* a b))))))
-----
-
-That makes a lot more natural to write code that uses monads and gives a very
-familiar `let` like syntax abstraction that makes the clojure code that uses
-monads less "strange".
-
-If you are coming from Haskell, mlet is mostly analogous to the *do notation*.
-
-Since the bindings in the mlet macro run the monadic effects of the right-hand
-values we cannot just put any value in there and expect to be bound to its
-left symbol. For cases where we want the regular behavior of let we can inline
-a `:let` clause, just like with Clojure's `for`:
-
-[source, clojure]
-----
-(m/mlet [a (maybe/just 1)
-         b (maybe/just (inc a))
-         :let [z (+ a b)]]
-  (m/return (* z 2)))
-----
-
-`mlet` has support for using guards using a `:when` clause, analogous to the
-one used in `for`. We can filter out values using `bind` with `mlet` and
-`:when` like the following:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :as maybe])
-
-(m/mlet [a (maybe/just 1)
-         :when (= a 2)]
-   (m/return (* a 2)))
-;; => #<Nothing>
-----
-
-Any monadic type that implements `MonadZero` can be combined with guards
-inside `mlet` bindings. Here is an example with vectors:
-
-[source, clojure]
-----
-(require '[cats.builtin]
-(require '[cats.core :as m])
-
-(m/mlet [a [1 2 3 4]
-         :when (odd? a)]
-   (m/return (* a 2)))
-;; => [2 6]
-----
-
-
-=== alet
-
-One limitation of monadic bind is that all the steps are strictly sequential and
-happen one at a time. This piece of code illustrates the usage of monadic bind:
-
-[source, clojure]
-----
-(require '[cats.core :refer [bind return]])
-(require '[cats.monad.maybe :refer [just]])
-
-(bind (just 1)
-      (fn [a]
-        (bind (just 41)
-              (fn [b]
-                (return (+ a b))))))
-;; => #<Just 42>
-----
-
-In the first call to `bind`, `(just 1)` and the anonymous function will be
-evaluated. The call of the anonymous function performed by the first `bind`
-will cause the evaluation of the `(just 41)` and the next anonymous function,
-which will be also called to create the final result. Note that `(just 1)`
-and `(just 41)` are independent and thus could be evaluated at the same time.
-
-Here is the `mlet` version for reference and clarity:
-
-[source, clojure]
-----
-(mlet [a (just 1)
-       b (just 41)]
-  (return (+ a b)))
-;; => #<Just 42>
-----
-
-Now let's see the equivalent using `alet`:
-
-[source, clojure]
-----
-(require '[cats.core :refer [alet]])
-
-(alet [a (just 1)
-       b (just 41)]
-  (+ a b))
-;; => #<Just 42>
-----
-
-Note that no `return` is used, this is because the `alet` body runs inside
-the applicative context with `fapply`. This is roughly what `alet` desugars to:
-
-[source, clojure]
-----
-(fapply (fn [a]
-           (fn [b]
-             (do
-               (+ a b))))
-         (just 1)
-         (just 41))
-;; => #<Just 42>
-----
-
-Note that now `(just 1)` and `(just 41)` are evaluated at the same time. This
-use of `fapply` can be called "applicative bind" and in some cases is more
-efficient than monadic bind. Furthermore, the `alet` macro splits the bindings
-into batches that have dependencies only in previous values and evaluates all
-applicative values in the batch at the same time.
-
-This makes no difference at all for Maybe, but applicatives that have latency
-in their calculations (for example promises that do an async computation) get
-a pretty good evaluation strategy, which can minimize overall latency. In the
-next examples we use the link:https://github.com/funcool/promesa[promesa]
-clj/cljs library for emulate asynchronous behavior:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.labs.promise])
-(require '[promesa.core :as p])
-
-(defn sleep-promise
-  "A simple function that emulates an
-  asynchronous operation."
-  [wait]
-  (p/promise (fn [resolve reject]
-               (future
-                 (Thread/sleep wait)
-                 (resolve wait)))))
-
-;; note: deref-ing for blocking the current thread
-;; waiting for the promise being delivered
-
-(time
- @(m/mlet [x (sleep-promise 42)
-           y (sleep-promise 41)]
-    (m/return (+ x y))))
-;; "Elapsed time: 84.328182 msecs"
-;; => 83
-
-(time
- @(m/alet [x (sleep-promise 42)
-           y (sleep-promise 41)]
-    (+ x y)))
-;; "Elapsed time: 44.246427 msecs"
-;; => 83
-----
-
-Another example for illustrating dependencies between batches:
-
-[source, clojure]
-----
-(time
- @(m/mlet [x (sleep-promise 42)
-           y (sleep-promise 41)
-           z (sleep-promise (inc x))
-           a (sleep-promise (inc y))]
-   (m/return  (+ z a))))
-;; "Elapsed time: 194.253182 msecs"
-;; => 85
-
-(time
- @(m/alet [x (sleep-promise 42)
-           y (sleep-promise 41)
-           z (sleep-promise (inc x))
-           a (sleep-promise (inc y))]
-    (+ z a)))
-;; "Elapsed time: 86.20699 msecs"
-;; => 85
-----
-
-
-== Higher-order functions
-
-=== curry
-
-The first combinator that _cats_ provides is a `curry` macro. Given a function,
-it can convert it to a curried versions of itself. The generated function will
-accept parameters until all the expected parameters are given.
-
-Let's see some examples of a curried function in action:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-
-(defn add [a b c]
-  (+ a b c))
-
-(def curried-add (m/curry add))
-
-(= curried-add (curried-add))
-;; => true
-
-(= (curried-add 1 2 3) 6)
-;; => true
-
-(= ((curried-add 1) 2 3) 6)
-;; => true
-
-(= ((curried-add 1 2) 3) 6)
-;; => true
-----
-
-As you can see above, since the original `add` has a single arity (3) and is
-fixed (i.e. it doesn't accept a variable number of arguments), the `curry` macro
-was able to generate a curried function with the correct number of parameters.
-
-This doesn't mean that functions with multiple arities or variadic arguments
-can't be curried but an arity for the curried function must be given:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-
-(def curried+ (m/curry 3 +))
-
-(= curried+ (curried+))
-;; => true
-
-(= (curried+ 1 2 3) 6)
-;; => true
-
-(= ((curried+ 1) 2 3) 6)
-;; => true
-
-(= ((curried+ 1 2) 3) 6)
-;; => true
-----
-
-Curried functions are very useful in combination with the applicative's
-`fapply` operation, since we can curry a function and use applicatives for
-building up results with context-specific effects.
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :refer [just nothing]])
-
-(def curried+ (m/curry 3 +))
-
-(m/fapply (just curried+) (just 1) (just 2) (just 3))
-;; => #<Just 6>
-
-(m/fapply (just curried+) (just 1) (just 2) (nothing))
-;; => #<Nothing>
-
-(m/fapply (just curried+) (just 1) nil (just 3))
-;; => nil
-
-(m/fapply (m/fmap curried+ (just 1)) (just 2) (just 3))
-;; => #<Just 6>
-
-(m/<*> (m/<$> curried+ (just 1)) (just 2) (just 3))
-;; => #<Just 6>
-----
-
-
-=== lift-m
-
-The `lift-m` macro is a combinator for promoting functions that work on
-regular values to work on monadic values instead. It uses the monad's bind
-operation under the hood and, like `curry`, can be used without specifying arity
-if the function we are lifting has a fixed and a single arity:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :refer [just nothing]])
-
-(defn add [a b c]
-  (+ a b c))
-
-(def add-m (m/lift-m add))
-
-(add-m (just 1) (just 2) (just 3))
-;; => #<Just 6>
-
-(add-m (just 1) (nothing) (just 3))
-; => #<Nothing>
-
-(add-m (just 1) nil (just 3))
-;; => nil
-----
-
-Like with `curry`, we must provide an arity in case we are lifting a function
-that has multiple arities or is variadic:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :refer [just nothing]])
-
-(def add-m (m/lift-m 3 +))
-
-(add-m (just 1) (just 2) (just 3))
-;; => #<Just 6>
-
-(add-m (just 1) (nothing) (just 3))
-; => #<Nothing>
-
-(add-m (just 1) nil (just 3))
-;; => nil
-----
-
-Note that you can combine both `curry` and `lift-m` to get curried functions
-that work on monadic types using the `curry-lift-m` macro. The arity is
-mandatory when using this macro:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.monad.maybe :refer [just nothing]])
-
-(def curried-add-m (m/curry-lift-m 3 +))
-
-(curried-add-m (just 1) (just 2) (just 3))
-;; => #<Just 6>
-
-((curried-add-m (just 1)) (just 2) (just 3))
-;; => #<Just 6>
-
-((curried-add-m (just 1) (just 2)) (just 3))
-;; => #<Just 6>
-----
-
-
-== Labs
-
-This section intends to explain different kind of extra features that can be
-found under *cats.labs* namespace. The fact that they are here because they
-are experimental, requires external dependencies or simply does not have much
-application in clojure(script).
-
-In any case the state of each module will be notified on the start of the
-each section.
-
-
-=== test.check
-
-*Status:* Experimental
-
-The `cats.labs.test` namespace implements monad and applicative instances for
-generators, which lets you use the `cats.core/alet` and `cats.core/mlet` macros
-for writing generators:
-
-[source, clojure]
-----
-(require '[cats.core :as m])
-(require '[cats.labs.test])
-(require '[clojure.test.check.generators :as gen])
-
-(def color
-  (m/alet [r gen/int
-           g gen/int
-           b gen/int]
-    [r g b]))
-
-(gen/sample color 1)
-;; => ([0 0 0])
-
-(def mcolor
-  (m/mlet [r gen/int
-           g gen/int
-           b gen/int]
-    (m/return [r g b])))
-
-(gen/sample mcolor 1)
-;; => ([0 0 0])
-----
-
-Apart from that, the namespace contains multiple functions for generating test.check
-properties that verify the laws of Semigroup, Monoid, Functor, Applicative, Monad,
-MonadZero and MonadPlus.
-
-The implementation of cats' abstractions are tested using generative testing and
-the `cats.labs.test` property generation functions.
-
-
-=== Channel
-
-*Status:* Experimental
-
-This namespace exposes the ability to use the *core.async* channel as monadic
-type and in consequence use it in `mlet` or `alet` macros.
-
-Before use it, you should add core.async to your dependencies:
-
-[source, clojure]
-----
-[org.clojure/core.async "0.2.385"]
-----
-
-Now, let see some code. This will allow you understand how it can be used and
-why this integration between cats and core.async matters. At first step we will
-go to define a function that emulates whatever asynchronous task, that for
-our case it's consist in a just sleep operation:
-
-[source, clojure]
-----
-(require '[clojure.core.async :as a])
-(require '[cats.labs.channel])
-
-(defn async-call
-  "A function that emulates some asynchronous call."
-  [n]
-  (a/go
-    (println "---> sending request" n)
-    (a/<! (a/timeout n))
-    (println "<--- receiving request" n)
-    n))
-----
-
-Now, instead of using the `go` macro, just use a `let` like bindings with the
-help of the *mlet* macro for bind values to asyncrhonous calls:
-
-[source, clojure]
-----
-(time
- (<!! (m/mlet [x (async-call 200)
-               y (async-call 100)]
-        (m/return (+ x y)))))
-;; ---> sending request 200
-;; <--- receiving request 200
-;; ---> sending request 100
-;; <--- receiving request 100
-;; "Elapsed time: 302.236804 msecs"
-;; => 300
-----
-
-Here we can observe few things:
-
-* The asynchronous calls are made serially.
-* We are calling a function that return a channel and bind its value to a symbol.
-* At the end, an operation is performed with the `mlet` bindings.
-* The `mlet` macro also returns a channel.
-
-The main difference with the default clojure `let`, is that the bindings
-are already plain values (not channels). The take! operation is already
-performed automatically by the `mlet`. This kind of behavior will make you
-fully asynchronous code looks like synchronous code.
-
-But, cats also comes with `alet` that has identical aspect to the previously
-used `mlet` macro, but it has some advantages over it. Let see an example:
-
-[source, clojure]
-----
-(time
-  (a/<!! (m/alet [x (async-call 100)
-                  y (async-call 100)]
-            (+ x y)))))
-
-;; ---> sending request 100
-;; ---> sending request 100
-;; <--- receiving request 100
-;; <--- receiving request 100
-;; "Elapsed time: 101.06644 msecs"
-;; => 200
-----
-
-And here we can observe few things:
-
-* The asynchronous calls are made in parallel.
-* The total time of processing is half less of if we use `mlet`.
-* The `return` function is not used because `alet` evaluates the body in the context
-  of the applicative.
-
-The alet is a powerful macro that analyzes the dependencies between bindings
-and executes the expressions in batches resultin in a very atractive feature
-for asynchronous calls.
-
-Here an other examples that shows in a clearly way how the batches are executed:
-
-[source, clojure]
-----
-(time
- (a/<!! (m/alet [x (async-call 120)
-                 y (async-call 130)
-                 z (async-call (- x 100))
-                 u (async-call (- y 100))
-                 t (async-call (inc u))]
-          z))))
-;; ---> sending request  130
-;; ---> sending request  120
-;; <--- receiving request  120
-;; <--- receiving request  130
-;; ---> sending request  20
-;; ---> sending request  30
-;; <--- receiving request  20
-;; <--- receiving request  30
-;; ---> sending request  31
-;; <--- receiving request  31
-;; "Elapsed time: 194.536235 msecs"
-;; => 20
-----
-
-
-=== Manifold Deferred
-
-*Status:* Experimental
-
-This namespace exposes the ability to use the *manifold* deferred as monadic
-type and in consequence use it in `mlet` or `alet` macros.
-
-Before use it, you should add manifold to your dependencies:
-
-[source, clojure]
-----
-[manifold "0.1.1"]
-----
-
-Now, let see some code. This will allow you understand how it can be used
-and why this integration between cats and manifold matters. At first step we
-will go to define a function that emulates whatever asynchronous task, that for
-our case it's consist in a just sleep operation:
-
-For demostration purposes, let's define a function that emulates the asyncrhonous
-call:
-
-[source, clojure]
-----
-(require '[cats.labs.manifold :as mf]
-         '[manifold.deferred :as d])
-
-(defn async-call
-  "A function that emulates some asynchronous call."
-  [n]
-  (d/future
-    (println "---> sending request" n)
-    (Thread/sleep n)
-    (println "<--- receiving request" n)
-    n))
-----
-
-Now, the manifold deferreds can participate in the monad/applicative abstractions
-using `mlet` and `alet` respectivelly.
-
-.Example using manifold deferred with `mlet`.
-[source, clojure]
-----
-(time
-  @(m/mlet [x (async-call 200)
-            y (async-call 100)]
-     (m/return (+ x y)))))
-;; ---> sending request 200
-;; <--- receiving request 200
-;; ---> sending request 100
-;; <--- receiving request 100
-;; "Elapsed time: 302.236804 msecs"
-;; => 200
-----
-
-
-If you are familiar with manifold's `let-flow` macro, the cats `alet` serves
-for almost identical purpose, with difference that `alet` is defined as
-generic abstraction instread of a specific purpose macro.
-
-.Example using manifold deferred with `alet`.
-[source, clojure]
-----
-(time
-  @(m/alet [x (async-call 100)
-            y (async-call 100)]
-     (+ x y)))))
-
-;; ---> sending request 100
-;; ---> sending request 100
-;; <--- receiving request 100
-;; <--- receiving request 100
-;; "Elapsed time: 101.06644 msecs"
-;; => 200
-----
-
-
-
-== Complementary libraries
-
-* Promise monad: https://github.com/funcool/promesa
-* Concurrent data fetching: https://github.com/funcool/urania
-* Pattern matching for the Cats' types: https://github.com/zalando/cats.match
-
-== FAQ
-
-=== What Clojure types implement some of the Category Theory abstractions?
-
-In contrast to other similar libraries in Clojure, _cats_ doesn't intend to
-extend Clojure types that don't act like containers. For example, Clojure
-keywords are values but can not be containers so they should not extend any of
-the previously explained protocols.
-
-.Summary of Clojure types and implemented protocols
-[options="header"]
-|==========================================================================================
-| Name     | Implemented protocols
-| sequence | Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus, Foldable
-| vector   | Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus, Foldable
-| hash-set | Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus
-| hash-map | Semigroup, Monoid
-| function | Semigroup, Monoid, Functor, Applicative, Monad
-|==========================================================================================
-
-
-== Developers Guide
-
-=== Philosophy
-
-Five most important rules:
-
-- Beautiful is better than ugly.
-- Explicit is better than implicit.
-- Simple is better than complex.
-- Complex is better than complicated.
-- Readability counts.
-
-All contributions to _cats_ should keep these important rules in mind.
-
-
-=== Contributing
-
-Unlike Clojure and other Clojure contributed libraries, _cats_ does not have many
-restrictions for contributions. Just open an issue or pull request.
-
-
-=== Editor integration
-
-For making Emacs' clojure-mode treat `alet`, `mlet` et al like a `let` and indent
-them correctly, you can use `define-clojure-indent` like in the following example:
-
-[source, elisp]
-----
-(require 'clojure-mode)
-
-(define-clojure-indent
-  (alet 'defun)
-  (mlet 'defun))
-----
-
-
-=== Source Code
-
-_cats_ is open source and can be found on
-link:https://github.com/funcool/cats[github].
-
-You can clone the public repository with this command:
-
-[source,text]
-----
-git clone https://github.com/funcool/cats
-----
-
-
-=== Run tests
-
-For running tests just execute this for clojure:
-
-[source, text]
-----
-lein test
-----
-
-And this for clojurescript:
-
-[source, text]
-----
-./scripts/build
-node ./out/tests.js
-----
-
-
-=== License
-
-[source,text]
-----
-Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-----
diff --git a/latest/api/cats.applicative.validation.html b/latest/api/cats.applicative.validation.html
new file mode 100644
index 0000000..faed908
--- /dev/null
+++ b/latest/api/cats.applicative.validation.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.applicative.validation documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3 current"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.applicative.validation</h2><div class="doc"><div class="markdown"><p>The Validation applicative implementation and helper functions for validating values. Isomorphic to Either.</p></div></div><div class="public anchor" id="var-branch"><h3><a href="#var-branch">branch</a></h3><div class="usage"><code>(branch v fail-f ok-f)</code></div><div class="doc"><div class="markdown"><p>Given a validation value and two functions, if the validation is a failure apply the first function to the value it contains; if the validation is a success apply the second function to its value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L206">view source</a></div></div><div class="public anchor" id="var-branch-fail"><h3><a href="#var-branch-fail">branch-fail</a></h3><div class="usage"><code>(branch-fail v fail-f)</code></div><div class="doc"><div class="markdown"><p>Given a validation value and a function, if the validation is a failure, apply the function to the value it contains; if the validation is a success, return it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L218">view source</a></div></div><div class="public anchor" id="var-branch-ok"><h3><a href="#var-branch-ok">branch-ok</a></h3><div class="usage"><code>(branch-ok v ok-f)</code></div><div class="doc"><div class="markdown"><p>Given a validation value and a function, if the validation is a success, apply the function to the value it contains; if the validation is a failure, return it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L226">view source</a></div></div><div class="public anchor" id="var-either-.3Evalidation"><h3><a href="#var-either-.3Evalidation">either-&gt;validation</a></h3><div class="usage"><code>(either-&gt;validation ae)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L245">view source</a></div></div><div class="public anchor" id="var-fail"><h3><a href="#var-fail">fail</a></h3><div class="usage"><code>(fail)</code><code>(fail v)</code></div><div class="doc"><div class="markdown"><p>A Fail type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L110">view source</a></div></div><div class="public anchor" id="var-fail.3F"><h3><a href="#var-fail.3F">fail?</a></h3><div class="usage"><code>(fail? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of Fail type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L123">view source</a></div></div><div class="public anchor" id="var-ok"><h3><a href="#var-ok">ok</a></h3><div class="usage"><code>(ok v)</code></div><div class="doc"><div class="markdown"><p>An Ok type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L105">view source</a></div></div><div class="public anchor" id="var-ok.3F"><h3><a href="#var-ok.3F">ok?</a></h3><div class="usage"><code>(ok? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of Ok type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L117">view source</a></div></div><div class="public anchor" id="var-validation"><h3><a href="#var-validation">validation</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L216">view source</a></div></div><div class="public anchor" id="var-validation-.3Eeither"><h3><a href="#var-validation-.3Eeither">validation-&gt;either</a></h3><div class="usage"><code>(validation-&gt;either av)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L238">view source</a></div></div><div class="public anchor" id="var-validation.3F"><h3><a href="#var-validation.3F">validation?</a></h3><div class="usage"><code>(validation? v)</code></div><div class="doc"><div class="markdown"><p>Return true in case of <code>v</code> is instance of the Validation applicative.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/applicative/validation.cljc#L129">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.builtin.html b/latest/api/cats.builtin.html
new file mode 100644
index 0000000..8b5179c
--- /dev/null
+++ b/latest/api/cats.builtin.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.builtin documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch current"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.builtin</h2><div class="doc"><div class="markdown"><p>Clojure(Script) built-in types extensions.</p></div></div><div class="public anchor" id="var-all-monoid"><h3><a href="#var-all-monoid">all-monoid</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L501">view source</a></div></div><div class="public anchor" id="var-any-monoid"><h3><a href="#var-any-monoid">any-monoid</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L484">view source</a></div></div><div class="public anchor" id="var-function-context"><h3><a href="#var-function-context">function-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L437">view source</a></div></div><div class="public anchor" id="var-lazy-sequence-context"><h3><a href="#var-lazy-sequence-context">lazy-sequence-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L157">view source</a></div></div><div class="public anchor" id="var-map-context"><h3><a href="#var-map-context">map-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L335">view source</a></div></div><div class="public anchor" id="var-prod-monoid"><h3><a href="#var-prod-monoid">prod-monoid</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L535">view source</a></div></div><div class="public anchor" id="var-range-context"><h3><a href="#var-range-context">range-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L233">view source</a></div></div><div class="public anchor" id="var-sequence-context"><h3><a href="#var-sequence-context">sequence-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L50">view source</a></div></div><div class="public anchor" id="var-set-context"><h3><a href="#var-set-context">set-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L383">view source</a></div></div><div class="public anchor" id="var-string-monoid"><h3><a href="#var-string-monoid">string-monoid</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L552">view source</a></div></div><div class="public anchor" id="var-sum-monoid"><h3><a href="#var-sum-monoid">sum-monoid</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L518">view source</a></div></div><div class="public anchor" id="var-vector-context"><h3><a href="#var-vector-context">vector-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/builtin.cljc#L262">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.context.html b/latest/api/cats.context.html
new file mode 100644
index 0000000..3880ca8
--- /dev/null
+++ b/latest/api/cats.context.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.context documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch current"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.context</h2><div class="doc"><div class="markdown"><p>A cats context management.</p></div></div><div class="public anchor" id="var-*context*"><h3><a href="#var-*context*">*context*</a></h3><h4 class="dynamic">dynamic</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L30">view source</a></div></div><div class="public anchor" id="var-*override*"><h3><a href="#var-*override*">*override*</a></h3><h4 class="dynamic">dynamic</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L31">view source</a></div></div><div class="public anchor" id="var-context.3F"><h3><a href="#var-context.3F">context?</a></h3><div class="usage"><code>(context? v)</code></div><div class="doc"><div class="markdown"><p>Return <code>true</code> if the provided value satisfies the Context protocol.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L39">view source</a></div></div><div class="public anchor" id="var-get-current"><h3><a href="#var-get-current">get-current</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(get-current &amp; args)</code></div><div class="doc"><div class="markdown"><p>Deprecated alias to <code>infer</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L99">view source</a></div></div><div class="public anchor" id="var-with-context"><h3><a href="#var-with-context">with-context</a></h3><h4 class="type">macro</h4><div class="usage"><code>(with-context ctx &amp; body)</code></div><div class="doc"><div class="markdown"><p>Set current context to specific monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L46">view source</a></div></div><div class="public anchor" id="var-with-context-override"><h3><a href="#var-with-context-override">with-context-override</a></h3><h4 class="type">macro</h4><div class="usage"><code>(with-context-override ctx &amp; body)</code></div><div class="doc"><div class="markdown"><p>Set current context to specific monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L57">view source</a></div></div><div class="public anchor" id="var-with-monad"><h3><a href="#var-with-monad">with-monad</a></h3><h4 class="type">macro</h4><div class="usage"><code>(with-monad ctx &amp; body)</code></div><div class="doc"><div class="markdown"><p>Semantic alias for <code>with-context</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/context.cljc#L69">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.core.html b/latest/api/cats.core.html
new file mode 100644
index 0000000..766f640
--- /dev/null
+++ b/latest/api/cats.core.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.core documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch current"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.core</h2><div class="doc"><div class="markdown"><p>Category Theory abstractions for Clojure</p></div></div><div class="public anchor" id="var--.3E.3D"><h3><a href="#var--.3E.3D">-&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(-&gt;= expr &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like <code>-&gt;</code>, but with monadic binding instead of pure application. A mnemonic for the name is a pun on <code>&gt;&gt;=</code>, the monadic bind operator, and clojure&rsquo;s regular arrow macros.</p>
+<p>You can think of it as generalizing the <code>some-&gt;</code> thread macro to all Monads instead of just Maybe.</p>
+<p>Alternatively, if you think of the regular thread macro as sugar for <code>let</code>:</p>
+<p>(-&gt; :a b (c (other args)) d) =&gt; (let [res (b :a)  res (c res (other args))  res (d res)]  res)</p>
+<p>Then <code>-&gt;=</code> is sugar for cats.core/mlet:</p>
+<p>(-&gt;= m-a b (c (other args)) d) (mlet [res m-a  res (c res (other args))  res (d res)]  (return res))</p>
+<p>Note that extra args in this context are assumed pure, and will be evaluated along with the function itself; this also matches the behavior of <code>some-&gt;</code> wrt extra args.</p>
+<p>Threading through pure functions is somewhat awkward, but can be done:</p>
+<p>(-&gt;= m-a  monadic-fn  (-&gt; pure-fn  other-pure-fn  m/return)  other-monadic-fn)</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L561">view source</a></div></div><div class="public anchor" id="var--.3E.3E.3D"><h3><a href="#var--.3E.3E.3D">-&gt;&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(-&gt;&gt;= expr &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like -&gt;&gt;, but with monadic binding instead of pure application. See <code>cats.labs.sugar/-&gt;=</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L606">view source</a></div></div><div class="public anchor" id="var-.3C.24.3E"><h3><a href="#var-.3C.24.3E">&lt;$&gt;</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>A Haskell-style <code>fmap</code> alias.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L881">view source</a></div></div><div class="public anchor" id="var-.3C*.3E"><h3><a href="#var-.3C*.3E">&lt;*&gt;</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>A Haskell-style <code>fapply</code> alias.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L885">view source</a></div></div><div class="public anchor" id="var-.3C.3D.3C"><h3><a href="#var-.3C.3D.3C">&lt;=&lt;</a></h3><div class="usage"><code>(&lt;=&lt; mg mf x)</code></div><div class="doc"><div class="markdown"><p>Right-to-left composition of monads. Same as <code>&gt;=&gt;</code> with its first two arguments flipped.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L924">view source</a></div></div><div class="public anchor" id="var-.3C.3E"><h3><a href="#var-.3C.3E">&lt;&gt;</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L939">view source</a></div></div><div class="public anchor" id="var-.3D.3C.3C"><h3><a href="#var-.3D.3C.3C">=&lt;&lt;</a></h3><div class="usage"><code>(=&lt;&lt; f mv)</code></div><div class="doc"><div class="markdown"><p>Same as the two argument version of <code>&gt;&gt;=</code> but with the arguments flipped.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L910">view source</a></div></div><div class="public anchor" id="var-.3E.3D.3E"><h3><a href="#var-.3E.3D.3E">&gt;=&gt;</a></h3><div class="usage"><code>(&gt;=&gt; mf mg x)</code></div><div class="doc"><div class="markdown"><p>Left-to-right composition of monads.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L916">view source</a></div></div><div class="public anchor" id="var-.3E.3E"><h3><a href="#var-.3E.3E">&gt;&gt;</a></h3><div class="usage"><code>(&gt;&gt; mv mv&apos;)</code><code>(&gt;&gt; mv mv&apos; &amp; mvs)</code></div><div class="doc"><div class="markdown"><p>Perform a Haskell-style left-associative bind, ignoring the values produced by the monadic computations.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L902">view source</a></div></div><div class="public anchor" id="var-.3E.3E.3D"><h3><a href="#var-.3E.3E.3D">&gt;&gt;=</a></h3><div class="usage"><code>(&gt;&gt;= mv f)</code><code>(&gt;&gt;= mv f &amp; fs)</code></div><div class="doc"><div class="markdown"><p>Perform a Haskell-style left-associative bind.</p>
+<p>Let&rsquo;s see it in action:</p>
+<pre><code>(&gt;&gt;= (just 1) (comp just inc) (comp just inc))
+;; =&gt; #&lt;Just [3]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L889">view source</a></div></div><div class="public anchor" id="var-alet"><h3><a href="#var-alet">alet</a></h3><h4 class="type">macro</h4><div class="usage"><code>(alet bindings &amp; body)</code></div><div class="doc"><div class="markdown"><p>Applicative composition macro similar to Clojure&rsquo;s <code>let</code>. This macro facilitates composition of applicative computations using <code>fmap</code> and <code>fapply</code> and evaluating applicative values in parallel.</p>
+<p>Let&rsquo;s see an example to understand how it works. This code uses fmap for executing computations inside an applicative context:</p>
+<p>(fmap (fn [a] (inc a)) (just 1))  ;=&gt; #&lt;Just [2]&gt;</p>
+<p>Now see how this code can be made clearer by using the alet macro:</p>
+<p>(alet [a (just 1)]  (inc a))  ;=&gt; #&lt;Just [2]&gt;</p>
+<p>Let&rsquo;s look at a more complex example, imagine we have dependencies between applicative values:</p>
+<p>(join  (fapply  (fmap  (fn [a]  (fn [b]  (fmap (fn [c] (inc c))  (just (+ a b)))))  (just 1))  (just 2)))  ;=&gt; #&lt;Just [4]&gt;</p>
+<p>This is greatly simplified using <code>alet</code>:</p>
+<p>(alet [a (just 1)  b (just 2)  c (just (+ a b))]  (inc c))  ;=&gt; #&lt;Just [4]&gt;</p>
+<p>The intent of the code is much clearer and evaluates <code>a</code> and <code>b</code> at the same time, then proceeds to evaluate <code>c</code> when all the values it depends on are available. This evaluation strategy is specially helpful for asynchronous applicatives.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L413">view source</a></div></div><div class="public anchor" id="var-ap"><h3><a href="#var-ap">ap</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap f &amp; args)</code></div><div class="doc"><div class="markdown"><p>Apply a pure function to applicative arguments, e.g.</p>
+<p>(ap + (just 1) (just 2) (just 3)) ;; =&gt; #&lt;Just [6]&gt; (ap str [&ldquo;hi&rdquo; &ldquo;lo&rdquo;] [&ldquo;bye&rdquo; &ldquo;woah&rdquo; &ldquo;hey&rdquo;]) ;; =&gt; [&ldquo;hibye&rdquo; &ldquo;hiwoah&rdquo; &ldquo;hihey&rdquo;  &ldquo;lobye&rdquo; &ldquo;lowoah&rdquo; &ldquo;lohey&rdquo;]</p>
+<p><code>ap</code> is essentially sugar for <code>(apply fapply (pure f) args)</code>, but for the common case where you have a pure, uncurried, possibly variadic function.</p>
+<p><code>ap</code> actually desugars in <code>alet</code> form:</p>
+<p>(macroexpand-1 `(ap + (just 1) (just2))) ;; =&gt; (alet [a1 (just 1) a2 (just 2)] (+ a1 a2))</p>
+<p>That way, variadic functions Just Work, without needing to specify an arity separately.</p>
+<p>If you&rsquo;re familiar with Haskell, this is closest to writing &ldquo;in Applicative style&rdquo;: you can straightforwardly convert pure function application to effectful application by with some light syntax (&lt;$&gt; and &lt;*&gt; in case of Haskell, and <code>ap</code> here).</p>
+<p>See the original Applicative paper for more inspiration: <a href="http://staff.city.ac.uk/~ross/papers/Applicative.pdf">http://staff.city.ac.uk/~ross/papers/Applicative.pdf</a></p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L480">view source</a></div></div><div class="public anchor" id="var-ap-.3E"><h3><a href="#var-ap-.3E">ap-&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap-&gt; x &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>-&gt;</code>, within an applicative idiom.</p>
+<p>Compare:</p>
+<p>(macroexpand-1 `(-&gt; a b c (d e f))) =&gt; (d (c (b a) e f)</p>
+<p>with:</p>
+<p>(macroexpand-1 `(ap-&gt; a b c (d e f)) =&gt; (ap d (ap c (ap b a) e f))</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L513">view source</a></div></div><div class="public anchor" id="var-ap-.3E.3E"><h3><a href="#var-ap-.3E.3E">ap-&gt;&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap-&gt;&gt; x &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>-&gt;&gt;</code>, within an applicative idiom. See <code>cats.labs.sugar/ap-&gt;</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L536">view source</a></div></div><div class="public anchor" id="var-as-.3E.3D"><h3><a href="#var-as-.3E.3D">as-&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(as-&gt;= expr name &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like <code>as-&gt;</code>, but with monadic binding instead of pure application. See <code>cats.labs.sugar/-&gt;=</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L616">view source</a></div></div><div class="public anchor" id="var-as-ap-.3E"><h3><a href="#var-as-ap-.3E">as-ap-&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(as-ap-&gt; expr name &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>as-&gt;</code>, within an applicative idiom. See <code>cats.labs.sugar/ap-&gt;</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L549">view source</a></div></div><div class="public anchor" id="var-bimap"><h3><a href="#var-bimap">bimap</a></h3><div class="usage"><code>(bimap f g)</code><code>(bimap f g bv)</code></div><div class="doc"><div class="markdown"><p>Map over both arguments at the same time.</p>
+<p>Given functions <code>f</code> and <code>g</code> and a value wrapped in a bifunctor <code>bv</code>, apply <code>f</code> to a first argument or <code>g</code> to a second argument.</p>
+<pre><code>(bimap dec inc (either/right 1)
+;; =&gt; #&lt;Right 2&gt;
+
+(bimap dec inc (either/left 1)
+;; =&gt; #&lt;Left 0&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L133">view source</a></div></div><div class="public anchor" id="var-bind"><h3><a href="#var-bind">bind</a></h3><div class="usage"><code>(bind mv f)</code></div><div class="doc"><div class="markdown"><p>Given a monadic value <code>mv</code> and a function <code>f</code>, apply <code>f</code> to the unwrapped value of <code>mv</code>.</p>
+<pre><code>(bind (either/right 1) (fn [v]
+                         (return (inc v))))
+;; =&gt; #&lt;Right [2]&gt;
+</code></pre>
+<p>For convenience, you may prefer to use the <code>mlet</code> macro, which provides a beautiful, <code>let</code>-like syntax for composing operations with the <code>bind</code> function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L81">view source</a></div></div><div class="public anchor" id="var-curry"><h3><a href="#var-curry">curry</a></h3><h4 class="type">macro</h4><div class="usage"><code>(curry f)</code><code>(curry n f)</code></div><div class="doc"><div class="markdown"><p>Given either a fixed arity function or an arity and a function, return another which is curried.</p>
+<p>With inferred arity (function must have one fixed arity):</p>
+<pre><code>(defn add2 [x y] (+ x y))
+(def cadd2 (curry add2))
+
+((cadd2 1) 3)
+;; =&gt; 4
+
+(cadd2 1 3)
+;; =&gt; 4
+</code></pre>
+<p>With given arity:</p>
+<pre><code>(def c+ (curry 3 +))
+
+((c+ 1 2) 3)
+;; =&gt; 6
+
+((((c+) 1) 2) 3)
+;; =&gt; 6
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L661">view source</a></div></div><div class="public anchor" id="var-curry*"><h3><a href="#var-curry*">curry*</a></h3><h4 class="type">macro</h4><div class="usage"><code>(curry* args body)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L644">view source</a></div></div><div class="public anchor" id="var-curry-lift-m"><h3><a href="#var-curry-lift-m">curry-lift-m</a></h3><h4 class="type">macro</h4><div class="usage"><code>(curry-lift-m n f)</code></div><div class="doc"><div class="markdown"><p>Composition of <code>curry</code> and <code>lift-m</code></p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L772">view source</a></div></div><div class="public anchor" id="var-extract"><h3><a href="#var-extract">extract</a></h3><div class="usage"><code>(extract v)</code></div><div class="doc"><div class="markdown"><p>Generic function to unwrap/extract the inner value of a container.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L933">view source</a></div></div><div class="public anchor" id="var-fapply"><h3><a href="#var-fapply">fapply</a></h3><div class="usage"><code>(fapply af &amp; avs)</code></div><div class="doc"><div class="markdown"><p>Given a function wrapped in a monadic context <code>af</code>, and a value wrapped in a monadic context <code>av</code>, apply the unwrapped function to the unwrapped value and return the result, wrapped in the same context as <code>av</code>.</p>
+<p>This function is variadic, so it can be used like a Haskell-style left-associative fapply.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L186">view source</a></div></div><div class="public anchor" id="var-filter"><h3><a href="#var-filter">filter</a></h3><div class="usage"><code>(filter p mv)</code></div><div class="doc"><div class="markdown"><p>Apply a predicate to a value in a <code>MonadZero</code> instance, returning the identity element when the predicate does not hold.</p>
+<p>Otherwise, return the instance unchanged.</p>
+<pre><code>(require &#39;[cats.monad.maybe :as maybe])
+(require &#39;[cats.core :as m])
+
+(m/filter (partial &lt; 2) (maybe/just 3))
+;=&gt; &lt;Just [3]&gt;
+
+(m/filter (partial &lt; 4) (maybe/just 3))
+;=&gt; &lt;Nothing&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L857">view source</a></div></div><div class="public anchor" id="var-fmap"><h3><a href="#var-fmap">fmap</a></h3><div class="usage"><code>(fmap f)</code><code>(fmap f fv)</code></div><div class="doc"><div class="markdown"><p>Apply a function <code>f</code> to the value wrapped in functor <code>fv</code>, preserving the context type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L122">view source</a></div></div><div class="public anchor" id="var-foldl"><h3><a href="#var-foldl">foldl</a></h3><div class="usage"><code>(foldl f z xs)</code></div><div class="doc"><div class="markdown"><p>Perform a left-associative fold on the data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L948">view source</a></div></div><div class="public anchor" id="var-foldm"><h3><a href="#var-foldm">foldm</a></h3><div class="usage"><code>(foldm f z xs)</code><code>(foldm ctx f z xs)</code></div><div class="doc"><div class="markdown"><p>Given an optional monadic context, a function that takes two non-monadic arguments and returns a value inside the given monadic context, an initial value, and a collection of values, perform a left-associative fold.</p>
+<pre><code>(require &#39;[cats.context :as ctx]
+         &#39;[cats.core :as m]
+         &#39;[cats.monad.maybe :as maybe])
+
+(defn m-div [x y]
+  (if (zero? y)
+    (maybe/nothing)
+    (maybe/just (/ x y))))
+
+(m/foldm m-div 1 [1 2 3])
+(m/foldm maybe/context m-div 1 [1 2 3])
+;; =&gt; #&lt;Just 1/6&gt;
+
+(m/foldm maybe/context m-div 1 [1 0 3])
+;; =&gt; #&lt;Nothing&gt;
+
+(foldm m-div 1 [])
+;; =&gt; Exception
+
+(m/foldm maybe/context m-div 1 [])
+(ctx/with-context maybe/context
+  (foldm m-div 1 []))
+;; =&gt; #&lt;Just 1&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L955">view source</a></div></div><div class="public anchor" id="var-foldr"><h3><a href="#var-foldr">foldr</a></h3><div class="usage"><code>(foldr f z xs)</code></div><div class="doc"><div class="markdown"><p>Perform a right-associative fold on the data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L941">view source</a></div></div><div class="public anchor" id="var-forseq"><h3><a href="#var-forseq">forseq</a></h3><div class="usage"><code>(forseq vs mf)</code></div><div class="doc"><div class="markdown"><p>Same as <code>mapseq</code> but with the arguments flipped.</p>
+<p>Let&rsquo;s see a little example:</p>
+<pre><code>(m/forseq [2 3] maybe/just)
+;; =&gt; &lt;Just [[2 3]]&gt;
+</code></pre>
+<p>Yet an other example that fails:</p>
+<pre><code>(m/forseq [1 2]
+          (fn [v]
+            (if (odd? v)
+              (maybe/just v)
+              (maybe/nothing))))
+;; =&gt; &lt;Nothing&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L837">view source</a></div></div><div class="public anchor" id="var-guard"><h3><a href="#var-guard">guard</a></h3><div class="usage"><code>(guard b)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L110">view source</a></div></div><div class="public anchor" id="var-join"><h3><a href="#var-join">join</a></h3><div class="usage"><code>(join mv)</code></div><div class="doc"><div class="markdown"><p>Remove one level of monadic structure. This is the same as <code>(bind mv identity)</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L116">view source</a></div></div><div class="public anchor" id="var-left-map"><h3><a href="#var-left-map">left-map</a></h3><div class="usage"><code>(left-map f)</code><code>(left-map f bv)</code></div><div class="doc"><div class="markdown"><p>Map covariantly over the first argument.</p>
+<p>Given a function <code>f</code> and a value wrapped in a bifunctor <code>bv</code>, apply <code>f</code> to the first argument, if present, otherwise leave <code>bv</code> unchanged.</p>
+<pre><code>(left-map dec (either/right 1)
+;; =&gt; #&lt;Right 1&gt;
+
+(left-map dec (either/left 1)
+;; =&gt; #&lt;Left 0&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L152">view source</a></div></div><div class="public anchor" id="var-lift-a"><h3><a href="#var-lift-a">lift-a</a></h3><h4 class="type">macro</h4><div class="usage"><code>(lift-a f)</code><code>(lift-a n f)</code></div><div class="doc"><div class="markdown"><p>Lift a function with a given fixed arity to an applicative context.</p>
+<p>(def app+ (lift-a 2 +))</p>
+<p>(app+ (maybe/just 1) (maybe/just 2)) ;; =&gt; <Just 3></p>
+<p>(app+ (maybe/just 1) (maybe/nothing)) ;; =&gt; <Nothing></p>
+<p>(app+ [0 2 4] [1 2]) ;; =&gt; [1 2 3 4 5 6]</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L737">view source</a></div></div><div class="public anchor" id="var-lift-m"><h3><a href="#var-lift-m">lift-m</a></h3><h4 class="type">macro</h4><div class="usage"><code>(lift-m f)</code><code>(lift-m n f)</code></div><div class="doc"><div class="markdown"><p>Lift a function with a given fixed arity to a monadic context.</p>
+<p>(def monad+ (lift-m 2 +))</p>
+<p>(monad+ (maybe/just 1) (maybe/just 2)) ;; =&gt; &lt;Just [3]&gt;</p>
+<p>(monad+ (maybe/just 1) (maybe/nothing)) ;; =&gt; <Nothing></p>
+<p>(monad+ [0 2 4] [1 2]) ;; =&gt; [1 2 3 4 5 6]</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L702">view source</a></div></div><div class="public anchor" id="var-mappend"><h3><a href="#var-mappend">mappend</a></h3><div class="usage"><code>(mappend &amp; svs)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L48">view source</a></div></div><div class="public anchor" id="var-mapseq"><h3><a href="#var-mapseq">mapseq</a></h3><div class="usage"><code>(mapseq mf coll)</code></div><div class="doc"><div class="markdown"><p>Given a function <code>mf</code> that takes a value and puts it into a monadic context, and a collection, map <code>mf</code> over the collection, calling <code>sequence</code> on the results.</p>
+<pre><code>(require &#39;[cats.context :as ctx]
+         &#39;[cats.monad.maybe :as maybe]
+         &#39;[cats.core :as m])
+
+(m/mapseq maybe/just [2 3])
+;=&gt; &lt;Just [[2 3]]&gt;
+
+(m/mapseq (fn [v]
+            (if (odd? v)
+              (maybe/just v)
+              (maybe/nothing)))
+          [1 2])
+;; =&gt; #&lt;Nothing&gt;
+
+(ctx/with-context maybe/context
+  (mapseq #(maybe/just (* % 2)) []))
+;; =&gt; #&lt;Just [()]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L811">view source</a></div></div><div class="public anchor" id="var-mempty"><h3><a href="#var-mempty">mempty</a></h3><div class="usage"><code>(mempty)</code><code>(mempty ctx)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L44">view source</a></div></div><div class="public anchor" id="var-mlet"><h3><a href="#var-mlet">mlet</a></h3><h4 class="type">macro</h4><div class="usage"><code>(mlet bindings &amp; body)</code></div><div class="doc"><div class="markdown"><p>Monad composition macro that works like Clojure&rsquo;s <code>let</code>. This facilitates much easier composition of monadic computations.</p>
+<p>Let&rsquo;s see an example to understand how it works. This code uses bind to compose a few operations:</p>
+<pre><code>(bind (just 1)
+      (fn [a]
+        (bind (just (inc a))
+                (fn [b]
+                  (return (* b 2))))))
+;=&gt; #&lt;Just [4]&gt;
+</code></pre>
+<p>Now see how this code can be made clearer by using the mlet macro:</p>
+<pre><code>(mlet [a (just 1)
+       b (just (inc a))]
+  (return (* b 2)))
+;=&gt; #&lt;Just [4]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L233">view source</a></div></div><div class="public anchor" id="var-mplus"><h3><a href="#var-mplus">mplus</a></h3><div class="usage"><code>(mplus &amp; mvs)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L104">view source</a></div></div><div class="public anchor" id="var-mzero"><h3><a href="#var-mzero">mzero</a></h3><div class="usage"><code>(mzero)</code><code>(mzero ctx)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L98">view source</a></div></div><div class="public anchor" id="var-pure"><h3><a href="#var-pure">pure</a></h3><div class="usage"><code>(pure v)</code><code>(pure ctx v)</code></div><div class="doc"><div class="markdown"><p>Given any value <code>v</code>, return it wrapped in the default/effect-free context.</p>
+<p>This is a multi-arity function that with arity <code>pure/1</code> uses the dynamic scope to resolve the current context. With <code>pure/2</code>, you can force a specific context value.</p>
+<p>Example:</p>
+<pre><code>(with-context either/context
+  (pure 1))
+;; =&gt; #&lt;Right [1]&gt;
+
+(pure either/context 1)
+;; =&gt; #&lt;Right [1]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L54">view source</a></div></div><div class="public anchor" id="var-return"><h3><a href="#var-return">return</a></h3><div class="usage"><code>(return v)</code><code>(return ctx v)</code></div><div class="doc"><div class="markdown"><p>This is a monad version of <code>pure</code> and works identically to it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L75">view source</a></div></div><div class="public anchor" id="var-right-map"><h3><a href="#var-right-map">right-map</a></h3><div class="usage"><code>(right-map g)</code><code>(right-map g bv)</code></div><div class="doc"><div class="markdown"><p>Map covariantly over the second argument.</p>
+<p>Given a function <code>g</code> and a value wrapped in a bifunctor <code>bv</code>, apply <code>g</code> to the second argument, if present, otherwise leave <code>bv</code> unchanged.</p>
+<pre><code>(right-map inc (either/right 1)
+;; =&gt; #&lt;Right 2&gt;
+
+(right-map inc (either/left 1)
+;; =&gt; #&lt;Left 1&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L169">view source</a></div></div><div class="public anchor" id="var-sequence"><h3><a href="#var-sequence">sequence</a></h3><div class="usage"><code>(sequence mvs)</code></div><div class="doc"><div class="markdown"><p>Given a collection of monadic values, collect their values in a seq returned in the monadic context.</p>
+<pre><code>(require &#39;[cats.context :as ctx]
+         &#39;[cats.monad.maybe :as maybe]
+         &#39;[cats.core :as m])
+
+(m/sequence [(maybe/just 2) (maybe/just 3)])
+;; =&gt; #&lt;Just [[2, 3]]&gt;
+
+(m/sequence [(maybe/nothing) (maybe/just 3)])
+;; =&gt; #&lt;Nothing&gt;
+
+(ctx/with-context maybe/context
+  (m/sequence []))
+;; =&gt; #&lt;Just [()]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L781">view source</a></div></div><div class="public anchor" id="var-traverse"><h3><a href="#var-traverse">traverse</a></h3><div class="usage"><code>(traverse f tv)</code><code>(traverse ctx f tv)</code></div><div class="doc"><div class="markdown"><p>Map each element of a structure to an action, evaluate these actions from left to right, and collect the results.</p>
+<pre><code>(defn inc-if-even
+  [n]
+  (if (even? n)
+    (maybe/just (inc n))
+    (maybe/nothing)))
+
+(ctx/with-context maybe/context
+  (m/traverse inc-if-even [2 4]))
+;; =&gt; #&lt;Just [3 4]&gt;
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L997">view source</a></div></div><div class="public anchor" id="var-unless"><h3><a href="#var-unless">unless</a></h3><h4 class="type">macro</h4><div class="usage"><code>(unless b mv)</code><code>(unless ctx b mv)</code></div><div class="doc"><div class="markdown"><p>Given an expression and a monadic value, if the expression is not logical true, return the monadic value. Otherwise, return nil in a monadic context.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L214">view source</a></div></div><div class="public anchor" id="var-when"><h3><a href="#var-when">when</a></h3><h4 class="type">macro</h4><div class="usage"><code>(when b mv)</code><code>(when ctx b mv)</code></div><div class="doc"><div class="markdown"><p>Given an expression and a monadic value, if the expression is logical true, return the monadic value. Otherwise, return nil in a monadic context.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/core.cljc#L200">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.data.html b/latest/api/cats.data.html
new file mode 100644
index 0000000..768491d
--- /dev/null
+++ b/latest/api/cats.data.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.data documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch current"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.data</h2><div class="doc"><div class="markdown"><p>Data structures that are used in various places of the library.</p></div></div><div class="public anchor" id="var-pair"><h3><a href="#var-pair">pair</a></h3><div class="usage"><code>(pair fst snd)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/data.cljc#L82">view source</a></div></div><div class="public anchor" id="var-pair-monoid"><h3><a href="#var-pair-monoid">pair-monoid</a></h3><div class="usage"><code>(pair-monoid inner-monoid)</code></div><div class="doc"><div class="markdown"><p>A pair monoid type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/data.cljc#L126">view source</a></div></div><div class="public anchor" id="var-pair.3F"><h3><a href="#var-pair.3F">pair?</a></h3><div class="usage"><code>(pair? v)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/data.cljc#L86">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.channel.html b/latest/api/cats.labs.channel.html
new file mode 100644
index 0000000..ef246b9
--- /dev/null
+++ b/latest/api/cats.labs.channel.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.channel documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch current"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.channel</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var-channel.3F"><h3><a href="#var-channel.3F">channel?</a></h3><div class="usage"><code>(channel? c)</code></div><div class="doc"><div class="markdown"><p>Return true if a <code>c</code> is a channel.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/channel.cljc#L53">view source</a></div></div><div class="public anchor" id="var-with-value"><h3><a href="#var-with-value">with-value</a></h3><div class="usage"><code>(with-value value)</code><code>(with-value value ch)</code></div><div class="doc"><div class="markdown"><p>Simple helper that creates a channel and attach an value to it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/channel.cljc#L45">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.continuation.html b/latest/api/cats.labs.continuation.html
new file mode 100644
index 0000000..ae14037
--- /dev/null
+++ b/latest/api/cats.labs.continuation.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.continuation documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.continuation</h2><div class="doc"><div class="markdown"><p>The Continuation Monad.</p></div></div><div class="public anchor" id="var-call-cc"><h3><a href="#var-call-cc">call-cc</a></h3><div class="usage"><code>(call-cc f)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/continuation.cljc#L92">view source</a></div></div><div class="public anchor" id="var-context"><h3><a href="#var-context">context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/continuation.cljc#L61">view source</a></div></div><div class="public anchor" id="var-continuation"><h3><a href="#var-continuation">continuation</a></h3><div class="usage"><code>(continuation mfn)</code></div><div class="doc"><div class="markdown"><p>Default constructor for continuation.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/continuation.cljc#L52">view source</a></div></div><div class="public anchor" id="var-run-cont"><h3><a href="#var-run-cont">run-cont</a></h3><div class="usage"><code>(run-cont cont)</code></div><div class="doc"><div class="markdown"><p>Given a Continuation instance, execute the wrapped computation and return its value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/continuation.cljc#L85">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.gcounter.html b/latest/api/cats.labs.crdt.gcounter.html
new file mode 100644
index 0000000..a1d28e7
--- /dev/null
+++ b/latest/api/cats.labs.crdt.gcounter.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt.gcounter documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch current"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt.gcounter</h2><div class="doc"><div class="markdown"><p>A G-Counter is a grow-only counter (inspired by vector clocks) in which only increment and merge are possible. Incrementing the counter adds 1 to the count for the current actor.</p><p>Divergent histories are resolved by taking the maximum count for each actor (like a vector clock merge). The value of the counter is the sum of all actor counts.</p></div></div><div class="public anchor" id="var--.3EGCounter"><h3><a href="#var--.3EGCounter">-&gt;GCounter</a></h3><div class="usage"><code>(-&gt;GCounter e node)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.crdt.gcounter.GCounter.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gcounter.cljc#L13">view source</a></div></div><div class="public anchor" id="var-gcounter"><h3><a href="#var-gcounter">gcounter</a></h3><div class="usage"><code>(gcounter)</code><code>(gcounter node)</code></div><div class="doc"><div class="markdown"><p>A G-Counter data type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gcounter.cljc#L62">view source</a></div></div><div class="public anchor" id="var-gcounter*"><h3><a href="#var-gcounter*">gcounter*</a></h3><div class="usage"><code>(gcounter* data node)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gcounter.cljc#L57">view source</a></div></div><div class="public anchor" id="var-gcounter.3F"><h3><a href="#var-gcounter.3F">gcounter?</a></h3><div class="usage"><code>(gcounter? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is a instance of GCounter type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gcounter.cljc#L51">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.gset.html b/latest/api/cats.labs.crdt.gset.html
new file mode 100644
index 0000000..cef5fe0
--- /dev/null
+++ b/latest/api/cats.labs.crdt.gset.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt.gset documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch current"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt.gset</h2><div class="doc"><div class="markdown"><p>Set union is commutative and convergent; hence it is always safe to have simultaneous writes to a set which only allows addition. You cannot remove an element of a G-Set.</p></div></div><div class="public anchor" id="var--.3EGSet"><h3><a href="#var--.3EGSet">-&gt;GSet</a></h3><div class="usage"><code>(-&gt;GSet s)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.crdt.gset.GSet.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gset.cljc#L55">view source</a></div></div><div class="public anchor" id="var-gset"><h3><a href="#var-gset">gset</a></h3><div class="usage"><code>(gset)</code><code>(gset data)</code></div><div class="doc"><div class="markdown"><p>A g-set data type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gset.cljc#L132">view source</a></div></div><div class="public anchor" id="var-gset*"><h3><a href="#var-gset*">gset*</a></h3><div class="usage"><code>(gset* data)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gset.cljc#L124">view source</a></div></div><div class="public anchor" id="var-gset.3F"><h3><a href="#var-gset.3F">gset?</a></h3><div class="usage"><code>(gset? v)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/gset.cljc#L120">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.html b/latest/api/cats.labs.crdt.html
new file mode 100644
index 0000000..8063021
--- /dev/null
+++ b/latest/api/cats.labs.crdt.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 current"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var--decode"><h3><a href="#var--decode">-decode</a></h3><h4 class="type">multimethod</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L66">view source</a></div></div><div class="public anchor" id="var--encode"><h3><a href="#var--encode">-encode</a></h3><h4 class="type">multimethod</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L65">view source</a></div></div><div class="public anchor" id="var--load"><h3><a href="#var--load">-load</a></h3><h4 class="type">multimethod</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L64">view source</a></div></div><div class="public anchor" id="var-dec"><h3><a href="#var-dec">dec</a></h3><div class="usage"><code>(dec owner)</code></div><div class="doc"><div class="markdown"><p>A shortcut for <code>(inc-by counter -1)</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L25">view source</a></div></div><div class="public anchor" id="var-decode"><h3><a href="#var-decode">decode</a></h3><div class="usage"><code>(decode data)</code><code>(decode data format)</code></div><div class="doc"><div class="markdown"><p>Deserialize crdt data type.</p><p>Only edn format is supported out of the box. This apo is extensible.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L101">view source</a></div></div><div class="public anchor" id="var-encode"><h3><a href="#var-encode">encode</a></h3><div class="usage"><code>(encode data)</code><code>(encode data format)</code></div><div class="doc"><div class="markdown"><p>Serialize crdt data type.</p><p>Only edn format is supported out of the box. This api is extensible.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L91">view source</a></div></div><div class="public anchor" id="var-inc"><h3><a href="#var-inc">inc</a></h3><div class="usage"><code>(inc owner)</code></div><div class="doc"><div class="markdown"><p>Increment the counter value in 1.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L15">view source</a></div></div><div class="public anchor" id="var-inc-by"><h3><a href="#var-inc-by">inc-by</a></h3><div class="usage"><code>(inc-by owner v)</code></div><div class="doc"><div class="markdown"><p>Increment the counter value in <code>v</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L20">view source</a></div></div><div class="public anchor" id="var-ISerializable"><h3><a href="#var-ISerializable">ISerializable</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--dump"><h3><a href="#var--dump">-dump</a></h3><div class="usage"><code>(-dump _)</code></div><div class="doc"><div class="markdown"><p>Get plain representation of the data type.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L45">view source</a></div></div><div class="public anchor" id="var-merge"><h3><a href="#var-merge">merge</a></h3><div class="usage"><code>(merge owner other)</code></div><div class="doc"><div class="markdown"><p>Converge two data structures. Both provided data types should satify the JoinSemiLattice protocol.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt.cljc#L34">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.pncounter.html b/latest/api/cats.labs.crdt.pncounter.html
new file mode 100644
index 0000000..b44ebd9
--- /dev/null
+++ b/latest/api/cats.labs.crdt.pncounter.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt.pncounter documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch current"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt.pncounter</h2><div class="doc"><div class="markdown"><p>PN-Counters allow the counter to be incremented by tracking the increments (P) separate from the decrements (N). Both P and N are represented as internal G-Counters.</p><p>Merge is handled by merging the internal P and N counters. The value of the counter is the value of the P counter minus the value of the N counter.</p></div></div><div class="public anchor" id="var--.3EPNCounter"><h3><a href="#var--.3EPNCounter">-&gt;PNCounter</a></h3><div class="usage"><code>(-&gt;PNCounter p n)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.crdt.pncounter.PNCounter.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/pncounter.cljc#L18">view source</a></div></div><div class="public anchor" id="var-pncounter"><h3><a href="#var-pncounter">pncounter</a></h3><div class="usage"><code>(pncounter)</code><code>(pncounter node)</code></div><div class="doc"><div class="markdown"><p>A G-Counter data type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/pncounter.cljc#L64">view source</a></div></div><div class="public anchor" id="var-pncounter*"><h3><a href="#var-pncounter*">pncounter*</a></h3><div class="usage"><code>(pncounter* data node)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/pncounter.cljc#L55">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.protocols.html b/latest/api/cats.labs.crdt.protocols.html
new file mode 100644
index 0000000..29de7de
--- /dev/null
+++ b/latest/api/cats.labs.crdt.protocols.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt.protocols documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch current"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt.protocols</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var-*node*"><h3><a href="#var-*node*">*node*</a></h3><h4 class="dynamic">dynamic</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/protocols.cljc#L4">view source</a></div></div><div class="public anchor" id="var-ICounter"><h3><a href="#var-ICounter">ICounter</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A basic protocol for counters.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--add"><h3><a href="#var--add">-add</a></h3><div class="usage"><code>(-add _ delta)</code></div><div class="doc"><div class="markdown"><p>Add operation in a counter.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/protocols.cljc#L6">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.crdt.util.html b/latest/api/cats.labs.crdt.util.html
new file mode 100644
index 0000000..272f446
--- /dev/null
+++ b/latest/api/cats.labs.crdt.util.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.crdt.util documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4 current"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.crdt.util</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var-hostname"><h3><a href="#var-hostname">hostname</a></h3><div class="usage"><code>(hostname)</code></div><div class="doc"><div class="markdown"><p>Determines the hostname in the most portable manner.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/crdt/util.cljc#L4">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.lens.html b/latest/api/cats.labs.lens.html
new file mode 100644
index 0000000..44eea79
--- /dev/null
+++ b/latest/api/cats.labs.lens.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.lens documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.lens</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var--.3EFoci"><h3><a href="#var--.3EFoci">-&gt;Foci</a></h3><div class="usage"><code>(-&gt;Foci trav a)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.lens.Foci.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L337">view source</a></div></div><div class="public anchor" id="var--.3EFocus"><h3><a href="#var--.3EFocus">-&gt;Focus</a></h3><div class="usage"><code>(-&gt;Focus lens a)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.lens.Focus.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L265">view source</a></div></div><div class="public anchor" id="var-both"><h3><a href="#var-both">both</a></h3><div class="usage"><code>(both one other)</code></div><div class="doc"><div class="markdown"><p>Given two traversals, compose them in parallel. The getter of the resulting traversal will combine results from both traversals and the setter will update the state with both setters.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L93">view source</a></div></div><div class="public anchor" id="var-cat"><h3><a href="#var-cat">cat</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L216">view source</a></div></div><div class="public anchor" id="var-const-setter"><h3><a href="#var-const-setter">const-setter</a></h3><div class="usage"><code>(const-setter s _)</code></div><div class="doc"><div class="markdown"><p>The constant setter, returns the state unaltered.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L40">view source</a></div></div><div class="public anchor" id="var-each"><h3><a href="#var-each">each</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>A traversal into each element of a sequence.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L209">view source</a></div></div><div class="public anchor" id="var-ffoci"><h3><a href="#var-ffoci">ffoci</a></h3><div class="usage"><code>(ffoci traversal s)</code></div><div class="doc"><div class="markdown"><p>Given a traversal and a state, return the first value focused by the traversal.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L73">view source</a></div></div><div class="public anchor" id="var-filter"><h3><a href="#var-filter">filter</a></h3><div class="usage"><code>(filter applies?)</code></div><div class="doc"><div class="markdown"><p>Given a predicate, return a traversal that focuses the elements that pass the predicate.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L219">view source</a></div></div><div class="public anchor" id="var-foci"><h3><a href="#var-foci">foci</a></h3><div class="usage"><code>(foci traversal s)</code></div><div class="doc"><div class="markdown"><p>Given a traversal and a state, return the values focused by the traversal.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L67">view source</a></div></div><div class="public anchor" id="var-foci-atom"><h3><a href="#var-foci-atom">foci-atom</a></h3><div class="usage"><code>(foci-atom traversal a)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L413">view source</a></div></div><div class="public anchor" id="var-focus"><h3><a href="#var-focus">focus</a></h3><div class="usage"><code>(focus lens s)</code></div><div class="doc"><div class="markdown"><p>Given a lens and a state, return the value focused by the lens.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L61">view source</a></div></div><div class="public anchor" id="var-focus-atom"><h3><a href="#var-focus-atom">focus-atom</a></h3><div class="usage"><code>(focus-atom lens a)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L409">view source</a></div></div><div class="public anchor" id="var-fst"><h3><a href="#var-fst">fst</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L144">view source</a></div></div><div class="public anchor" id="var-id"><h3><a href="#var-id">id</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Identity lens.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L45">view source</a></div></div><div class="public anchor" id="var-id-setter"><h3><a href="#var-id-setter">id-setter</a></h3><div class="usage"><code>(id-setter s f)</code></div><div class="doc"><div class="markdown"><p>The identity setter, applies the function to the state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L35">view source</a></div></div><div class="public anchor" id="var-in"><h3><a href="#var-in">in</a></h3><div class="usage"><code>(in path)</code><code>(in path default)</code></div><div class="doc"><div class="markdown"><p>Given a path and optionally a default value, return a lens that focuses the given path in an associative data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L186">view source</a></div></div><div class="public anchor" id="var-indexed"><h3><a href="#var-indexed">indexed</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L256">view source</a></div></div><div class="public anchor" id="var-it"><h3><a href="#var-it">it</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Identity traversal.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L49">view source</a></div></div><div class="public anchor" id="var-key"><h3><a href="#var-key">key</a></h3><div class="usage"><code>(key k)</code></div><div class="doc"><div class="markdown"><p>Given a key, returns a lens that focuses on the given key of an associative data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L163">view source</a></div></div><div class="public anchor" id="var-keys"><h3><a href="#var-keys">keys</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Focus on the keys of an associative data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L238">view source</a></div></div><div class="public anchor" id="var-lens"><h3><a href="#var-lens">lens</a></h3><div class="usage"><code>(lens getter setter)</code></div><div class="doc"><div class="markdown"><p>Given a function for getting the focused value from a state (getter) and a function that takes the state and and update function (setter), constructs a lens.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L9">view source</a></div></div><div class="public anchor" id="var-lens-.3Etraversal"><h3><a href="#var-lens-.3Etraversal">lens-&gt;traversal</a></h3><div class="usage"><code>(lens-&gt;traversal l)</code></div><div class="doc"><div class="markdown"><p>Derive a traversal from a lens.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L200">view source</a></div></div><div class="public anchor" id="var-nothing"><h3><a href="#var-nothing">nothing</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Identity traversal under <code>both</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L53">view source</a></div></div><div class="public anchor" id="var-nth"><h3><a href="#var-nth">nth</a></h3><div class="usage"><code>(nth n)</code></div><div class="doc"><div class="markdown"><p>Given a number, returns a lens that focuses on the given index of a collection.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L134">view source</a></div></div><div class="public anchor" id="var-only"><h3><a href="#var-only">only</a></h3><div class="usage"><code>(only applies?)</code></div><div class="doc"><div class="markdown"><p>Given a predicate, return a traversal that filters a coll.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L233">view source</a></div></div><div class="public anchor" id="var-over"><h3><a href="#var-over">over</a></h3><div class="usage"><code>(over st f s)</code></div><div class="doc"><div class="markdown"><p>Given a setter, a function and a state, apply the function over the value focused by the setter.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L78">view source</a></div></div><div class="public anchor" id="var-passes"><h3><a href="#var-passes">passes</a></h3><div class="usage"><code>(passes applies?)</code></div><div class="doc"><div class="markdown"><p>Given a predicate, return a lens that focuses in an element only if passes the predicate.</p><p>The lens is not well-behaved, depens on the outcome of the predicate.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L119">view source</a></div></div><div class="public anchor" id="var-put"><h3><a href="#var-put">put</a></h3><div class="usage"><code>(put st v s)</code></div><div class="doc"><div class="markdown"><p>Given a setter, a new value and a state, replace the value focused by the lens with the new one.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L85">view source</a></div></div><div class="public anchor" id="var-select-keys"><h3><a href="#var-select-keys">select-keys</a></h3><div class="usage"><code>(select-keys ks)</code></div><div class="doc"><div class="markdown"><p>Return a lens focused on the given keys in an associative data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L173">view source</a></div></div><div class="public anchor" id="var-snd"><h3><a href="#var-snd">snd</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L145">view source</a></div></div><div class="public anchor" id="var-tail"><h3><a href="#var-tail">tail</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>A lens into the tail of a collection.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L154">view source</a></div></div><div class="public anchor" id="var-traversal"><h3><a href="#var-traversal">traversal</a></h3><div class="usage"><code>(traversal getter setter)</code></div><div class="doc"><div class="markdown"><p>Given a function for getting the focused values from a state (getter) and a function that takes the state and and update function (setter), constructs a traversal.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L21">view source</a></div></div><div class="public anchor" id="var-units"><h3><a href="#var-units">units</a></h3><div class="usage"><code>(units one-&gt;other other-&gt;one)</code></div><div class="doc"><div class="markdown"><p>Given a function from unit A to unit B and another in the opposite direction, construct a lens that focuses and updates a converted value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L107">view source</a></div></div><div class="public anchor" id="var-vals"><h3><a href="#var-vals">vals</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Focus on the values of an associative data structure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/lens.cljc#L247">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.manifold.html b/latest/api/cats.labs.manifold.html
new file mode 100644
index 0000000..f95e706
--- /dev/null
+++ b/latest/api/cats.labs.manifold.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.manifold documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.manifold</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var--.3EDeferredContext"><h3><a href="#var--.3EDeferredContext">-&gt;DeferredContext</a></h3><div class="usage"><code>(-&gt;DeferredContext timeout timeout-value)</code></div><div class="doc"><div class="markdown"><p>Positional factory function for class cats.labs.manifold.DeferredContext.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/manifold.clj#L47">view source</a></div></div><div class="public anchor" id="var-deferred-context"><h3><a href="#var-deferred-context">deferred-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>A default context for manifold deferred.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/manifold.clj#L101">view source</a></div></div><div class="public anchor" id="var-deferred-context*"><h3><a href="#var-deferred-context*">deferred-context*</a></h3><div class="usage"><code>(deferred-context*)</code><code>(deferred-context* timeout)</code><code>(deferred-context* timeout timeout-value)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/manifold.clj#L95">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.promise.html b/latest/api/cats.labs.promise.html
new file mode 100644
index 0000000..15f3e24
--- /dev/null
+++ b/latest/api/cats.labs.promise.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.promise documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.promise</h2><div class="doc"><div class="markdown"><p>A promise monad that uses promesa library.</p></div></div><div class="public anchor" id="var-promise-context"><h3><a href="#var-promise-context">promise-context</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>Deprecated alias for <code>context</code>.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/promise.cljc#L57">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.reader.html b/latest/api/cats.labs.reader.html
new file mode 100644
index 0000000..5a5af1c
--- /dev/null
+++ b/latest/api/cats.labs.reader.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.reader documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.reader</h2><div class="doc"><div class="markdown"><p>The Reader Monad.</p></div></div><div class="public anchor" id="var-ask"><h3><a href="#var-ask">ask</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L175">view source</a></div></div><div class="public anchor" id="var-local"><h3><a href="#var-local">local</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L181">view source</a></div></div><div class="public anchor" id="var-MonadReader"><h3><a href="#var-MonadReader">MonadReader</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A specific case of Monad abstraction that allows a read only access to an environment.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--ask"><h3><a href="#var--ask">-ask</a></h3><div class="usage"><code>(-ask m)</code></div><div class="doc"><div class="markdown"><p>Return the current environment.</p></div></div></div><div class="public anchor" id="var--local"><h3><a href="#var--local">-local</a></h3><div class="usage"><code>(-local m f reader)</code></div><div class="doc"><div class="markdown"><p>Create a reader in a modified version of the environment.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L41">view source</a></div></div><div class="public anchor" id="var-reader"><h3><a href="#var-reader">reader</a></h3><div class="usage"><code>(reader f)</code></div><div class="doc"><div class="markdown"><p>The Reader type constructor.</p><p>The purpose of Reader type is wrap a simple function that fullfill the reader signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L64">view source</a></div></div><div class="public anchor" id="var-reader-t"><h3><a href="#var-reader-t">reader-t</a></h3><div class="usage"><code>(reader-t inner-monad)</code></div><div class="doc"><div class="markdown"><p>The Reader transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L124">view source</a></div></div><div class="public anchor" id="var-reader.3F"><h3><a href="#var-reader.3F">reader?</a></h3><div class="usage"><code>(reader? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of Reader type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L75">view source</a></div></div><div class="public anchor" id="var-run-reader"><h3><a href="#var-run-reader">run-reader</a></h3><div class="usage"><code>(run-reader reader seed)</code></div><div class="doc"><div class="markdown"><p>Given a Reader instance, execute the wrapped computation and returns a value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/reader.cljc#L168">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.state.html b/latest/api/cats.labs.state.html
new file mode 100644
index 0000000..98b3220
--- /dev/null
+++ b/latest/api/cats.labs.state.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.state documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.state</h2><div class="doc"><div class="markdown"><p>The State Monad.</p></div></div><div class="public anchor" id="var-eval-state"><h3><a href="#var-eval-state">eval-state</a></h3><div class="usage"><code>(eval-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and return the resultant value, ignoring the state. Equivalent to taking the first value of the pair instance returned by <code>run-state</code> function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L238">view source</a></div></div><div class="public anchor" id="var-exec-state"><h3><a href="#var-exec-state">exec-state</a></h3><div class="usage"><code>(exec-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and return the resultant state. Equivalent to taking the second value of the pair instance returned by <code>run-state</code> function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L247">view source</a></div></div><div class="public anchor" id="var-get-state"><h3><a href="#var-get-state">get-state</a></h3><div class="usage"><code>(get-state)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that returns the current state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L203">view source</a></div></div><div class="public anchor" id="var-MonadState"><h3><a href="#var-MonadState">MonadState</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A specific case of Monad abstraction for work with state in pure functional way.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--get-state"><h3><a href="#var--get-state">-get-state</a></h3><div class="usage"><code>(-get-state m)</code></div><div class="doc"><div class="markdown"><p>Return the current state.</p></div></div></div><div class="public anchor" id="var--put-state"><h3><a href="#var--put-state">-put-state</a></h3><div class="usage"><code>(-put-state m newstate)</code></div><div class="doc"><div class="markdown"><p>Update the state.</p></div></div></div><div class="public anchor" id="var--swap-state"><h3><a href="#var--swap-state">-swap-state</a></h3><div class="usage"><code>(-swap-state m f)</code></div><div class="doc"><div class="markdown"><p>Apply a function to the current state and update it.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L43">view source</a></div></div><div class="public anchor" id="var-put-state"><h3><a href="#var-put-state">put-state</a></h3><div class="usage"><code>(put-state newstate)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that replaces the current state with specified new state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L209">view source</a></div></div><div class="public anchor" id="var-run-state"><h3><a href="#var-run-state">run-state</a></h3><div class="usage"><code>(run-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and returns a cats.data.Pair instance with result and new state.</p><p>(def computation (mlet [x (get-state)  y (put-state (inc x))]  (return y)))</p><p>(def initial-state 1)  (run-state computation initial-state)</p><p>This should be return something to: #&lt;Pair [1 2]&gt;</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L221">view source</a></div></div><div class="public anchor" id="var-state"><h3><a href="#var-state">state</a></h3><div class="usage"><code>(state f)</code></div><div class="doc"><div class="markdown"><p>The State type constructor.</p><p>The purpose of State type is wrap a simple function that fullfill the state signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L67">view source</a></div></div><div class="public anchor" id="var-state-t"><h3><a href="#var-state-t">state-t</a></h3><div class="usage"><code>(state-t inner-monad)</code></div><div class="doc"><div class="markdown"><p>The State transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L131">view source</a></div></div><div class="public anchor" id="var-state.3F"><h3><a href="#var-state.3F">state?</a></h3><div class="usage"><code>(state? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of the State type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L78">view source</a></div></div><div class="public anchor" id="var-swap-state"><h3><a href="#var-swap-state">swap-state</a></h3><div class="usage"><code>(swap-state f)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that applies the specified function to state and returns the old state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/state.cljc#L215">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.sugar.html b/latest/api/cats.labs.sugar.html
new file mode 100644
index 0000000..700a63e
--- /dev/null
+++ b/latest/api/cats.labs.sugar.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.sugar documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch current"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.sugar</h2><div class="doc"><div class="markdown"><p>Experimental syntax sugar for core abstractions. Sugar that proves its worthiness will graduate to the cats.core namespace.</p></div></div><div class="public anchor" id="var--.3E.3D"><h3><a href="#var--.3E.3D">-&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(-&gt;= expr &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like <code>-&gt;</code>, but with monadic binding instead of pure application. A mnemonic for the name is a pun on <code>&gt;&gt;=</code>, the monadic bind operator, and clojure&rsquo;s regular arrow macros.</p><p>You can think of it as generalizing the <code>some-&gt;</code> thread macro to all Monads instead of just Maybe.</p><p>Alternatively, if you think of the regular thread macro as sugar for <code>let</code>:</p><p>(-&gt; :a b (c (other args)) d) =&gt; (let [res (b :a)  res (c res (other args))  res (d res)]  res)</p><p>Then <code>-&gt;=</code> is sugar for cats.core/mlet:</p><p>(-&gt;= m-a b (c (other args)) d) (mlet [res m-a  res (c res (other args))  res (d res)]  (return res))</p><p>Note that extra args in this context are assumed pure, and will be evaluated along with the function itself; this also matches the behavior of <code>some-&gt;</code> wrt extra args.</p><p>Threading through pure functions is somewhat awkward, but can be done:</p><p>(-&gt;= m-a  monadic-fn  (-&gt; pure-fn  other-pure-fn  m/return)  other-monadic-fn)</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L116">view source</a></div></div><div class="public anchor" id="var--.3E.3E.3D"><h3><a href="#var--.3E.3E.3D">-&gt;&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(-&gt;&gt;= expr &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like -&gt;&gt;, but with monadic binding instead of pure application. See <code>cats.labs.sugar/-&gt;=</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L161">view source</a></div></div><div class="public anchor" id="var-ap"><h3><a href="#var-ap">ap</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap f &amp; args)</code></div><div class="doc"><div class="markdown"><p>Apply a pure function to applicative arguments, e.g.</p><p>(ap + (just 1) (just 2) (just 3)) ;; =&gt; #&lt;Just [6]&gt; (ap str [&ldquo;hi&rdquo; &ldquo;lo&rdquo;] [&ldquo;bye&rdquo; &ldquo;woah&rdquo; &ldquo;hey&rdquo;]) ;; =&gt; [&ldquo;hibye&rdquo; &ldquo;hiwoah&rdquo; &ldquo;hihey&rdquo;  &ldquo;lobye&rdquo; &ldquo;lowoah&rdquo; &ldquo;lohey&rdquo;]</p><p><code>ap</code> is essentially sugar for <code>(apply fapply (pure f) args)</code>, but for the common case where you have a pure, uncurried, possibly variadic function.</p><p><code>ap</code> actually desugars in <code>alet</code> form:</p><p>(macroexpand-1 `(ap + (just 1) (just2))) ;; =&gt; (alet [a1 (just 1) a2 (just 2)] (+ a1 a2))</p><p>That way, variadic functions Just Work, without needing to specify an arity separately.</p><p>If you&rsquo;re familiar with Haskell, this is closest to writing &ldquo;in Applicative style&rdquo;: you can straightforwardly convert pure function application to effectful application by with some light syntax (&lt;$&gt; and &lt;*&gt; in case of Haskell, and <code>ap</code> here).</p><p>See the original Applicative paper for more inspiration: <a href="http://staff.city.ac.uk/~ross/papers/Applicative.pdf">http://staff.city.ac.uk/~ross/papers/Applicative.pdf</a></p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L35">view source</a></div></div><div class="public anchor" id="var-ap-.3E"><h3><a href="#var-ap-.3E">ap-&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap-&gt; x &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>-&gt;</code>, within an applicative idiom.</p><p>Compare:</p><p>(macroexpand-1 `(-&gt; a b c (d e f))) =&gt; (d (c (b a) e f)</p><p>with:</p><p>(macroexpand-1 `(ap-&gt; a b c (d e f)) =&gt; (ap d (ap c (ap b a) e f))</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L68">view source</a></div></div><div class="public anchor" id="var-ap-.3E.3E"><h3><a href="#var-ap-.3E.3E">ap-&gt;&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(ap-&gt;&gt; x &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>-&gt;&gt;</code>, within an applicative idiom. See <code>cats.labs.sugar/ap-&gt;</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L91">view source</a></div></div><div class="public anchor" id="var-as-.3E.3D"><h3><a href="#var-as-.3E.3D">as-&gt;=</a></h3><h4 class="type">macro</h4><div class="usage"><code>(as-&gt;= expr name &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Like <code>as-&gt;</code>, but with monadic binding instead of pure application. See <code>cats.labs.sugar/-&gt;=</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L171">view source</a></div></div><div class="public anchor" id="var-as-ap-.3E"><h3><a href="#var-as-ap-.3E">as-ap-&gt;</a></h3><h4 class="type">macro</h4><div class="usage"><code>(as-ap-&gt; expr name &amp; forms)</code></div><div class="doc"><div class="markdown"><p>Thread like <code>as-&gt;</code>, within an applicative idiom. See <code>cats.labs.sugar/ap-&gt;</code> for more in-depth discussion.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/sugar.cljc#L104">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.test.html b/latest/api/cats.labs.test.html
new file mode 100644
index 0000000..dc80e60
--- /dev/null
+++ b/latest/api/cats.labs.test.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.test documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3 current"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.test</h2><div class="doc"><div class="markdown"></div></div><div class="public anchor" id="var-applicative-composition"><h3><a href="#var-applicative-composition">applicative-composition</a></h3><div class="usage"><code>(applicative-composition {:keys [ctx gen appf appg eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L141">view source</a></div></div><div class="public anchor" id="var-applicative-homomorphism"><h3><a href="#var-applicative-homomorphism">applicative-homomorphism</a></h3><div class="usage"><code>(applicative-homomorphism {:keys [ctx gen f eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L129">view source</a></div></div><div class="public anchor" id="var-applicative-identity-law"><h3><a href="#var-applicative-identity-law">applicative-identity-law</a></h3><div class="usage"><code>(applicative-identity-law {:keys [ctx gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L123">view source</a></div></div><div class="public anchor" id="var-applicative-interchange"><h3><a href="#var-applicative-interchange">applicative-interchange</a></h3><div class="usage"><code>(applicative-interchange {:keys [ctx gen appf eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L135">view source</a></div></div><div class="public anchor" id="var-bifunctor-bimap-identity"><h3><a href="#var-bifunctor-bimap-identity">bifunctor-bimap-identity</a></h3><div class="usage"><code>(bifunctor-bimap-identity {:keys [gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L109">view source</a></div></div><div class="public anchor" id="var-bifunctor-composition"><h3><a href="#var-bifunctor-composition">bifunctor-composition</a></h3><div class="usage"><code>(bifunctor-composition {:keys [gen f g eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L115">view source</a></div></div><div class="public anchor" id="var-bifunctor-first-identity"><h3><a href="#var-bifunctor-first-identity">bifunctor-first-identity</a></h3><div class="usage"><code>(bifunctor-first-identity {:keys [gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L98">view source</a></div></div><div class="public anchor" id="var-bifunctor-second-identity"><h3><a href="#var-bifunctor-second-identity">bifunctor-second-identity</a></h3><div class="usage"><code>(bifunctor-second-identity {:keys [gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L103">view source</a></div></div><div class="public anchor" id="var-first-functor-law"><h3><a href="#var-first-functor-law">first-functor-law</a></h3><div class="usage"><code>(first-functor-law {:keys [gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L84">view source</a></div></div><div class="public anchor" id="var-first-monad-law"><h3><a href="#var-first-monad-law">first-monad-law</a></h3><div class="usage"><code>(first-monad-law {:keys [ctx mf gen eq], :or {gen gen/any, eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L153">view source</a></div></div><div class="public anchor" id="var-gen-context"><h3><a href="#var-gen-context">gen-context</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L35">view source</a></div></div><div class="public anchor" id="var-monadplus-associativity"><h3><a href="#var-monadplus-associativity">monadplus-associativity</a></h3><div class="usage"><code>(monadplus-associativity {:keys [ctx gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L175">view source</a></div></div><div class="public anchor" id="var-monadzero-bind"><h3><a href="#var-monadzero-bind">monadzero-bind</a></h3><div class="usage"><code>(monadzero-bind {:keys [ctx gen zero eq], :or {zero (m/mzero ctx), eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L192">view source</a></div></div><div class="public anchor" id="var-monadzero-identity-element"><h3><a href="#var-monadzero-identity-element">monadzero-identity-element</a></h3><div class="usage"><code>(monadzero-identity-element {:keys [ctx gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L184">view source</a></div></div><div class="public anchor" id="var-monoid-identity-element"><h3><a href="#var-monoid-identity-element">monoid-identity-element</a></h3><div class="usage"><code>(monoid-identity-element {:keys [ctx gen empty eq], :or {empty (m/mempty ctx), eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L74">view source</a></div></div><div class="public anchor" id="var-second-functor-law"><h3><a href="#var-second-functor-law">second-functor-law</a></h3><div class="usage"><code>(second-functor-law {:keys [gen f g eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L90">view source</a></div></div><div class="public anchor" id="var-second-monad-law"><h3><a href="#var-second-monad-law">second-monad-law</a></h3><div class="usage"><code>(second-monad-law {:keys [ctx eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L159">view source</a></div></div><div class="public anchor" id="var-semigroup-associativity"><h3><a href="#var-semigroup-associativity">semigroup-associativity</a></h3><div class="usage"><code>(semigroup-associativity {:keys [ctx gen eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L63">view source</a></div></div><div class="public anchor" id="var-third-monad-law"><h3><a href="#var-third-monad-law">third-monad-law</a></h3><div class="usage"><code>(third-monad-law {:keys [ctx f g eq], :or {eq =}})</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/test.cljc#L166">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.labs.writer.html b/latest/api/cats.labs.writer.html
new file mode 100644
index 0000000..03ec7b6
--- /dev/null
+++ b/latest/api/cats.labs.writer.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.labs.writer documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 1.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3"><a href="cats.labs.crdt.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>crdt</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gcounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gcounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.gset.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>gset</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.pncounter.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>pncounter</span></div></a></li><li class="depth-4 branch"><a href="cats.labs.crdt.protocols.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-4"><a href="cats.labs.crdt.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.lens.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>lens</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.sugar.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>sugar</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-3 current"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -486px;"><span class="top" style="height: 495px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.labs.writer</h2><div class="doc"><div class="markdown"><p>The Writer Monad.</p></div></div><div class="public anchor" id="var-listen"><h3><a href="#var-listen">listen</a></h3><div class="usage"><code>(listen mv)</code></div><div class="doc"><div class="markdown"><p>Get the value from the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L195">view source</a></div></div><div class="public anchor" id="var-log"><h3><a href="#var-log">log</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L206">view source</a></div></div><div class="public anchor" id="var-MonadWriter"><h3><a href="#var-MonadWriter">MonadWriter</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A specific case of Monad abstraction that allows emulate write operations in pure functional way.</p><p>A great example is writing a log message.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--listen"><h3><a href="#var--listen">-listen</a></h3><div class="usage"><code>(-listen m mv)</code></div><div class="doc"><div class="markdown"><p>Given a writer, yield a (value, log) pair as a value.</p></div></div></div><div class="public anchor" id="var--pass"><h3><a href="#var--pass">-pass</a></h3><div class="usage"><code>(-pass m mv)</code></div><div class="doc"><div class="markdown"><p>Given a writer whose value is a pair with a function as its second element, yield a writer which has the first element of the pair as the value and the result of applying the aforementioned function to the log as the new log.</p></div></div></div><div class="public anchor" id="var--tell"><h3><a href="#var--tell">-tell</a></h3><div class="usage"><code>(-tell m v)</code></div><div class="doc"><div class="markdown"><p>Add the given value to the log.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L45">view source</a></div></div><div class="public anchor" id="var-pass"><h3><a href="#var-pass">pass</a></h3><div class="usage"><code>(pass mv)</code></div><div class="doc"><div class="markdown"><p>Apply a function to the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L200">view source</a></div></div><div class="public anchor" id="var-tell"><h3><a href="#var-tell">tell</a></h3><div class="usage"><code>(tell v)</code></div><div class="doc"><div class="markdown"><p>Add the value to the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L190">view source</a></div></div><div class="public anchor" id="var-value"><h3><a href="#var-value">value</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L205">view source</a></div></div><div class="public anchor" id="var-writer"><h3><a href="#var-writer">writer</a></h3><div class="usage"><code>(writer f)</code></div><div class="doc"><div class="markdown"><p>The Writer type constructor.</p><p>The purpose of Writer type is wrap a simple function that fullfill the writer signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L75">view source</a></div></div><div class="public anchor" id="var-writer-t"><h3><a href="#var-writer-t">writer-t</a></h3><div class="usage"><code>(writer-t inner-context)</code></div><div class="doc"><div class="markdown"><p>The Writer transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L132">view source</a></div></div><div class="public anchor" id="var-writer.3F"><h3><a href="#var-writer.3F">writer?</a></h3><div class="usage"><code>(writer? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of Writer type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/labs/writer.cljc#L86">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.continuation.html b/latest/api/cats.monad.continuation.html
new file mode 100644
index 0000000..94c1afc
--- /dev/null
+++ b/latest/api/cats.monad.continuation.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.continuation documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.5.0-SNAPSHOT</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><a href="cats.monad.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch current"><a href="cats.monad.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3"><a href="cats.monad.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -238px;"><span class="top" style="height: 247px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.continuation</h2><div class="doc"><div class="markdown"><p>The Continuation Monad.</p></div></div><div class="public anchor" id="var-call-cc"><h3><a href="#var-call-cc">call-cc</a></h3><div class="usage"><code>(call-cc f)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/continuation.cljc#L82">view source</a></div></div><div class="public anchor" id="var-continuation"><h3><a href="#var-continuation">continuation</a></h3><div class="usage"><code>(continuation mfn)</code></div><div class="doc"><div class="markdown"><p>Default constructor for continuation.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/continuation.cljc#L51">view source</a></div></div><div class="public anchor" id="var-continuation-monad"><h3><a href="#var-continuation-monad">continuation-monad</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/continuation.cljc#L60">view source</a></div></div><div class="public anchor" id="var-run-cont"><h3><a href="#var-run-cont">run-cont</a></h3><div class="usage"><code>(run-cont cont)</code></div><div class="doc"><div class="markdown"><p>Given a Continuation instance, execute the wrapped computation and return its value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/continuation.cljc#L75">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.either.html b/latest/api/cats.monad.either.html
new file mode 100644
index 0000000..c60ff38
--- /dev/null
+++ b/latest/api/cats.monad.either.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.either documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch current"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.either</h2><div class="doc"><div class="markdown"><p>The Either monad implementation and helper functions for working with either related types.</p>
+<p>Also commonly known as Error monad.</p>
+<pre><code>(require &#39;[cats.monad.either :as either])
+
+(either/right 1)
+;; =&gt; #&lt;Right [1]&gt;
+
+(either/left 1)
+;; =&gt; #&lt;Left [1]&gt;
+</code></pre></div></div><div class="public anchor" id="var-branch"><h3><a href="#var-branch">branch</a></h3><div class="usage"><code>(branch e lf rf)</code></div><div class="doc"><div class="markdown"><p>Given an either value and two functions, if the either is a left apply the first function to the value it contains; if the either is a right apply the second function to its value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L198">view source</a></div></div><div class="public anchor" id="var-branch-left"><h3><a href="#var-branch-left">branch-left</a></h3><div class="usage"><code>(branch-left e lf)</code></div><div class="doc"><div class="markdown"><p>Given an either value and a function, if the either is a left, apply the function to the value it contains; if the either is a right, return it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L210">view source</a></div></div><div class="public anchor" id="var-branch-right"><h3><a href="#var-branch-right">branch-right</a></h3><div class="usage"><code>(branch-right e rf)</code></div><div class="doc"><div class="markdown"><p>Either-specific synonym for #&rsquo;cats.core/bind</p>
+<p>Given an either value and a function, if the either is a right, apply the function to the value it contains; if the either is a left, return it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L218">view source</a></div></div><div class="public anchor" id="var-either"><h3><a href="#var-either">either</a></h3><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L208">view source</a></div></div><div class="public anchor" id="var-either.3F"><h3><a href="#var-either.3F">either?</a></h3><div class="usage"><code>(either? v)</code></div><div class="doc"><div class="markdown"><p>Return true in case of <code>v</code> is instance of Either monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L108">view source</a></div></div><div class="public anchor" id="var-first-left"><h3><a href="#var-first-left">first-left</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Given a collection of either, return the first value that is left</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L236">view source</a></div></div><div class="public anchor" id="var-first-right"><h3><a href="#var-first-right">first-right</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Given a collection of either, return the first value that is right</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L240">view source</a></div></div><div class="public anchor" id="var-invert"><h3><a href="#var-invert">invert</a></h3><div class="usage"><code>(invert e)</code></div><div class="doc"><div class="markdown"><p>Convert a left to a right or viceversa, preserving content.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L244">view source</a></div></div><div class="public anchor" id="var-left"><h3><a href="#var-left">left</a></h3><div class="usage"><code>(left)</code><code>(left v)</code></div><div class="doc"><div class="markdown"><p>A Left type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L86">view source</a></div></div><div class="public anchor" id="var-left.3F"><h3><a href="#var-left.3F">left?</a></h3><div class="usage"><code>(left? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of Left type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L96">view source</a></div></div><div class="public anchor" id="var-lefts"><h3><a href="#var-lefts">lefts</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Given a collection of eithers, return only the values that are left.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L228">view source</a></div></div><div class="public anchor" id="var-map-.3ELeft"><h3><a href="#var-map-.3ELeft">map-&gt;Left</a></h3><div class="usage"><code>(map-&gt;Left m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.either.Left, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L64">view source</a></div></div><div class="public anchor" id="var-map-.3ERight"><h3><a href="#var-map-.3ERight">map-&gt;Right</a></h3><div class="usage"><code>(map-&gt;Right m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.either.Right, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L48">view source</a></div></div><div class="public anchor" id="var-right"><h3><a href="#var-right">right</a></h3><div class="usage"><code>(right)</code><code>(right v)</code></div><div class="doc"><div class="markdown"><p>A Right type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L91">view source</a></div></div><div class="public anchor" id="var-right.3F"><h3><a href="#var-right.3F">right?</a></h3><div class="usage"><code>(right? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of Right type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L102">view source</a></div></div><div class="public anchor" id="var-rights"><h3><a href="#var-rights">rights</a></h3><div class="usage"></div><div class="doc"><div class="markdown"><p>Given a collection of eithers, return only the values that are right.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L232">view source</a></div></div><div class="public anchor" id="var-try-either"><h3><a href="#var-try-either">try-either</a></h3><h4 class="type">macro</h4><div class="usage"><code>(try-either &amp; body)</code></div><div class="doc"><div class="markdown"><p>Try to evalute the body and return the result as an either. If an exception is thrown return the exception as a left, otherwise return the result as a right.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/either.cljc#L253">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.exception.html b/latest/api/cats.monad.exception.html
new file mode 100644
index 0000000..7502085
--- /dev/null
+++ b/latest/api/cats.monad.exception.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.exception documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch current"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.exception</h2><div class="doc"><div class="markdown"><p>The Exception monad.</p>
+<p>Also known as Try monad, popularized by Scala.</p>
+<p>It represents a computation that may either result in an exception or return a successfully computed value. Is very similar to Either monad, but is semantically different.</p>
+<p>It consists in two types: Success and Failure. The Success type is a simple wrapper like Right of Either monad. But the Failure type is slightly different from Left, because it is forced to wrap an instance of Throwable (or Error in cljs).</p>
+<p>The most common use case of this monad is for wrap third party libraries that uses standard Exception based error handling. In normal circumstances you should use Either instead.</p>
+<p>The types defined for Exception monad (Success and Failure) also implementes the clojure IDeref interface which facilitates libraries developing using monadic composition without forcing a user of that library to use or understand monads.</p>
+<p>That is because when you will dereference the failure instance, it will reraise the containing exception.</p></div></div><div class="public anchor" id="var-exception.3F"><h3><a href="#var-exception.3F">exception?</a></h3><div class="usage"><code>(exception? v)</code></div><div class="doc"><div class="markdown"><p>Return true in case of <code>v</code> is instance of Exception monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L157">view source</a></div></div><div class="public anchor" id="var-extract"><h3><a href="#var-extract">extract</a></h3><div class="usage"><code>(extract mv)</code><code>(extract mv default)</code></div><div class="doc"><div class="markdown"><p>Return inner value from exception monad.</p>
+<p>This is a specialized version of <code>cats.core/extract</code> for Exception monad types that allows set up the default value.</p>
+<p>If a provided <code>mv</code> is an instance of Failure type it will re raise the inner exception. If you need extract value without raising it, use <code>cats.core/extract</code> function for it.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L171">view source</a></div></div><div class="public anchor" id="var-failure"><h3><a href="#var-failure">failure</a></h3><div class="usage"><code>(failure e)</code><code>(failure e message)</code></div><div class="doc"><div class="markdown"><p>A failure type constructor.</p>
+<p>If a provided parameter is an exception, it wraps it in a <code>Failure</code> instance and return it. But if a provided parameter is arbitrary data, it tries create an exception from it using clojure <code>ex-info</code> function.</p>
+<p>Take care that <code>ex-info</code> function in clojurescript differs a little bit from clojure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L128">view source</a></div></div><div class="public anchor" id="var-failure.3F"><h3><a href="#var-failure.3F">failure?</a></h3><div class="usage"><code>(failure? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of the Failure type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L151">view source</a></div></div><div class="public anchor" id="var-map-.3EFailure"><h3><a href="#var-map-.3EFailure">map-&gt;Failure</a></h3><div class="usage"><code>(map-&gt;Failure m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.exception.Failure, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L98">view source</a></div></div><div class="public anchor" id="var-map-.3ESuccess"><h3><a href="#var-map-.3ESuccess">map-&gt;Success</a></h3><div class="usage"><code>(map-&gt;Success m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.exception.Success, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L82">view source</a></div></div><div class="public anchor" id="var-success"><h3><a href="#var-success">success</a></h3><div class="usage"><code>(success v)</code></div><div class="doc"><div class="markdown"><p>A Success type constructor.</p>
+<p>It wraps any arbitrary value into success type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L120">view source</a></div></div><div class="public anchor" id="var-success.3F"><h3><a href="#var-success.3F">success?</a></h3><div class="usage"><code>(success? v)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of the Success type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L145">view source</a></div></div><div class="public anchor" id="var-throw-exception"><h3><a href="#var-throw-exception">throw-exception</a></h3><div class="usage"><code>(throw-exception message)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L66">view source</a></div></div><div class="public anchor" id="var-throwable.3F"><h3><a href="#var-throwable.3F">throwable?</a></h3><div class="usage"><code>(throwable? e)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>v</code> is an instance of the Throwable or js/Error type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L72">view source</a></div></div><div class="public anchor" id="var-try-on"><h3><a href="#var-try-on">try-on</a></h3><h4 class="type">macro</h4><div class="usage"><code>(try-on expr)</code></div><div class="doc"><div class="markdown"><p>Wraps a computation and return success of failure.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L223">view source</a></div></div><div class="public anchor" id="var-try-or-else"><h3><a href="#var-try-or-else">try-or-else</a></h3><h4 class="type">macro</h4><div class="usage"><code>(try-or-else expr defaultvalue)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L230">view source</a></div></div><div class="public anchor" id="var-try-or-recover"><h3><a href="#var-try-or-recover">try-or-recover</a></h3><h4 class="type">macro</h4><div class="usage"><code>(try-or-recover expr func)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L236">view source</a></div></div><div class="public anchor" id="var-wrap"><h3><a href="#var-wrap">wrap</a></h3><div class="usage"><code>(wrap func)</code></div><div class="doc"><div class="markdown"><p>Wrap a function in a try monad.</p>
+<p>Is a high order function that accept a function as parameter and returns an other that returns success or failure depending of result of the first function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/exception.cljc#L241">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.html b/latest/api/cats.monad.html
new file mode 100644
index 0000000..03fe199
--- /dev/null
+++ b/latest/api/cats.monad.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.7.0-SNAPSHOT</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3"><a href="cats.labs.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2 current"><a href="cats.monad.html"><div class="inner"><span class="tree" style="top: -176px;"><span class="top" style="height: 185px;"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad</h2><div class="doc"><div class="markdown"></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.identity.html b/latest/api/cats.monad.identity.html
new file mode 100644
index 0000000..b72c982
--- /dev/null
+++ b/latest/api/cats.monad.identity.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.identity documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch current"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.identity</h2><div class="doc"><div class="markdown"><p>The Identity Monad.</p></div></div><div class="public anchor" id="var-identity"><h3><a href="#var-identity">identity</a></h3><div class="usage"><code>(identity v)</code></div><div class="doc"><div class="markdown"><p>The Identity type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/identity.cljc#L57">view source</a></div></div><div class="public anchor" id="var-identity.3F"><h3><a href="#var-identity.3F">identity?</a></h3><div class="usage"><code>(identity? v)</code></div><div class="doc"><div class="markdown"><p>Return true in case of <code>v</code> is instance of Identity monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/identity.cljc#L62">view source</a></div></div><div class="public anchor" id="var-map-.3EIdentity"><h3><a href="#var-map-.3EIdentity">map-&gt;Identity</a></h3><div class="usage"><code>(map-&gt;Identity m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.identity.Identity, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/identity.cljc#L37">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.maybe.html b/latest/api/cats.monad.maybe.html
new file mode 100644
index 0000000..2c59811
--- /dev/null
+++ b/latest/api/cats.monad.maybe.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.maybe documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3 current"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.maybe</h2><div class="doc"><div class="markdown"><p>The Maybe monad implementation and helpers functions for working with maybe related types.</p>
+<pre><code>(require &#39;[cats.monad.maybe :as maybe])
+
+(maybe/just 1)
+;; =&gt; #&lt;Just [1]&gt;
+</code></pre></div></div><div class="public anchor" id="var-cat-maybes"><h3><a href="#var-cat-maybes">cat-maybes</a></h3><div class="usage"><code>(cat-maybes coll)</code></div><div class="doc"><div class="markdown"><p>Given a collection of maybes, return a sequence of the values that the just&rsquo;s contain.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L261">view source</a></div></div><div class="public anchor" id="var-from-maybe"><h3><a href="#var-from-maybe">from-maybe</a></h3><div class="usage"><code>(from-maybe mv)</code><code>(from-maybe mv default)</code></div><div class="doc"><div class="markdown"><p>Return inner value from maybe monad.</p>
+<p>This is a specialized version of <code>cats.core/extract</code> for Maybe monad types that allows set up the default value.</p>
+<p>Let see some examples:</p>
+<pre><code>(from-maybe (just 1))
+;=&gt; 1
+
+(from-maybe (nothing))
+;=&gt; nil
+
+(from-maybe (nothing) 42)
+;=&gt; 42
+</code></pre></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L117">view source</a></div></div><div class="public anchor" id="var-just"><h3><a href="#var-just">just</a></h3><div class="usage"><code>(just v)</code></div><div class="doc"><div class="markdown"><p>A Just type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L92">view source</a></div></div><div class="public anchor" id="var-just.3F"><h3><a href="#var-just.3F">just?</a></h3><div class="usage"><code>(just? v)</code></div><div class="doc"><div class="markdown"><p>Returns true if <code>v</code> is an instance of <code>Just</code> type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L103">view source</a></div></div><div class="public anchor" id="var-map-.3EJust"><h3><a href="#var-map-.3EJust">map-&gt;Just</a></h3><div class="usage"><code>(map-&gt;Just m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.maybe.Just, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L45">view source</a></div></div><div class="public anchor" id="var-map-.3ENothing"><h3><a href="#var-map-.3ENothing">map-&gt;Nothing</a></h3><div class="usage"><code>(map-&gt;Nothing m__7585__auto__)</code></div><div class="doc"><div class="markdown"><p>Factory function for class cats.monad.maybe.Nothing, taking a map of keywords to field values.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L61">view source</a></div></div><div class="public anchor" id="var-map-maybe"><h3><a href="#var-map-maybe">map-maybe</a></h3><div class="usage"><code>(map-maybe mf coll)</code></div><div class="doc"><div class="markdown"><p>Given a maybe-returning function and a collection, map the function over the collection returning the values contained in the just values of the resulting collection.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L267">view source</a></div></div><div class="public anchor" id="var-maybe"><h3><a href="#var-maybe">maybe</a></h3><h4 class="type">macro</h4><div class="usage"><code>(maybe default m f)</code></div><div class="doc"><div class="markdown"><p>Given a default value, a maybe and a function, return the default if the maybe is a nothing; if its a just, apply the function to the value it contains and return the result.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L227">view source</a></div></div><div class="public anchor" id="var-maybe-.3Eseq"><h3><a href="#var-maybe-.3Eseq">maybe-&gt;seq</a></h3><div class="usage"><code>(maybe-&gt;seq m)</code></div><div class="doc"><div class="markdown"><p>Given a maybe, return an empty seq if its nothing or a one-element seq with its value if its not.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L246">view source</a></div></div><div class="public anchor" id="var-maybe.3F"><h3><a href="#var-maybe.3F">maybe?</a></h3><div class="usage"><code>(maybe? v)</code></div><div class="doc"><div class="markdown"><p>Return true in case of <code>v</code> is instance of Maybe monad.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L83">view source</a></div></div><div class="public anchor" id="var-nothing"><h3><a href="#var-nothing">nothing</a></h3><div class="usage"><code>(nothing)</code></div><div class="doc"><div class="markdown"><p>A Nothing type constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L98">view source</a></div></div><div class="public anchor" id="var-nothing.3F"><h3><a href="#var-nothing.3F">nothing?</a></h3><div class="usage"><code>(nothing? v)</code></div><div class="doc"><div class="markdown"><p>Returns true if <code>v</code> is an instance of <code>Nothing</code> type or is nil.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L109">view source</a></div></div><div class="public anchor" id="var-seq-.3Emaybe"><h3><a href="#var-seq-.3Emaybe">seq-&gt;maybe</a></h3><div class="usage"><code>(seq-&gt;maybe coll)</code></div><div class="doc"><div class="markdown"><p>Given a collection, return a nothing if its empty or a just with its first element if its not.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/maybe.cljc#L238">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.reader.html b/latest/api/cats.monad.reader.html
new file mode 100644
index 0000000..b60f7e4
--- /dev/null
+++ b/latest/api/cats.monad.reader.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.reader documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.5.0-SNAPSHOT</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><a href="cats.monad.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-3 branch current"><a href="cats.monad.reader.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>reader</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3"><a href="cats.monad.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -269px;"><span class="top" style="height: 278px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.reader</h2><div class="doc"><div class="markdown"><p>The Reader Monad.</p></div></div><div class="public anchor" id="var-ask"><h3><a href="#var-ask">ask</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L155">view source</a></div></div><div class="public anchor" id="var-local"><h3><a href="#var-local">local</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L161">view source</a></div></div><div class="public anchor" id="var-reader"><h3><a href="#var-reader">reader</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(reader f)</code></div><div class="doc"><div class="markdown"><p>The Reader type constructor.</p><p>The purpose of Reader type is wrap a simple function that fullfill the reader signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L48">view source</a></div></div><div class="public anchor" id="var-reader-transformer"><h3><a href="#var-reader-transformer">reader-transformer</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(reader-transformer inner-monad)</code></div><div class="doc"><div class="markdown"><p>The Reader transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L102">view source</a></div></div><div class="public anchor" id="var-reader.3F"><h3><a href="#var-reader.3F">reader?</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(reader? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of Reader type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L60">view source</a></div></div><div class="public anchor" id="var-run-reader"><h3><a href="#var-run-reader">run-reader</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(run-reader reader seed)</code></div><div class="doc"><div class="markdown"><p>Given a Reader instance, execute the wrapped computation and returns a value.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/reader.cljc#L147">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.state.html b/latest/api/cats.monad.state.html
new file mode 100644
index 0000000..7350310
--- /dev/null
+++ b/latest/api/cats.monad.state.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.state documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.5.0-SNAPSHOT</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><a href="cats.monad.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-3 branch current"><a href="cats.monad.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3"><a href="cats.monad.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -238px;"><span class="top" style="height: 247px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.state</h2><div class="doc"><div class="markdown"><p>The State Monad.</p></div></div><div class="public anchor" id="var-eval-state"><h3><a href="#var-eval-state">eval-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(eval-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and return the resultant value, ignoring the state. Equivalent to taking the first value of the pair instance returned by <code>run-state</code> function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L236">view source</a></div></div><div class="public anchor" id="var-exec-state"><h3><a href="#var-exec-state">exec-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(exec-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and return the resultant state. Equivalent to taking the second value of the pair instance returned by <code>run-state</code> function.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L246">view source</a></div></div><div class="public anchor" id="var-get-state"><h3><a href="#var-get-state">get-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(get-state)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that returns the current state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L197">view source</a></div></div><div class="public anchor" id="var-put-state"><h3><a href="#var-put-state">put-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(put-state newstate)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that replaces the current state with specified new state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L204">view source</a></div></div><div class="public anchor" id="var-run-state"><h3><a href="#var-run-state">run-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(run-state state seed)</code></div><div class="doc"><div class="markdown"><p>Given a State instance, execute the wrapped computation and returns a cats.data.Pair instance with result and new state.</p><p>(def computation (mlet [x (get-state)  y (put-state (inc x))]  (return y)))</p><p>(def initial-state 1)  (run-state computation initial-state)</p><p>This should be return something to: #&lt;Pair [1 2]&gt;</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L218">view source</a></div></div><div class="public anchor" id="var-state-t"><h3><a href="#var-state-t">state-t</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(state-t f)</code></div><div class="doc"><div class="markdown"><p>The State type constructor.</p><p>The purpose of State type is wrap a simple function that fullfill the state signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L53">view source</a></div></div><div class="public anchor" id="var-state-transformer"><h3><a href="#var-state-transformer">state-transformer</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(state-transformer inner-monad)</code></div><div class="doc"><div class="markdown"><p>The State transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L117">view source</a></div></div><div class="public anchor" id="var-state.3F"><h3><a href="#var-state.3F">state?</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(state? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of the State type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L65">view source</a></div></div><div class="public anchor" id="var-swap-state"><h3><a href="#var-swap-state">swap-state</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(swap-state f)</code></div><div class="doc"><div class="markdown"><p>Return a State instance with computation that applies the specified function to state and returns the old state.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/state.cljc#L211">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.monad.writer.html b/latest/api/cats.monad.writer.html
new file mode 100644
index 0000000..566852e
--- /dev/null
+++ b/latest/api/cats.monad.writer.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.monad.writer documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.5.0-SNAPSHOT</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><a href="cats.monad.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.continuation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>continuation</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.state.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>state</span></div></a></li><li class="depth-3 current"><a href="cats.monad.writer.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>writer</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -238px;"><span class="top" style="height: 247px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.monad.writer</h2><div class="doc"><div class="markdown"><p>The Writer Monad.</p></div></div><div class="public anchor" id="var-listen"><h3><a href="#var-listen">listen</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(listen mv)</code></div><div class="doc"><div class="markdown"><p>Get the value from the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L165">view source</a></div></div><div class="public anchor" id="var-log"><h3><a href="#var-log">log</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L178">view source</a></div></div><div class="public anchor" id="var-pass"><h3><a href="#var-pass">pass</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(pass mv)</code></div><div class="doc"><div class="markdown"><p>Apply a function to the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L171">view source</a></div></div><div class="public anchor" id="var-tell"><h3><a href="#var-tell">tell</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(tell v)</code></div><div class="doc"><div class="markdown"><p>Add the value to the log.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L159">view source</a></div></div><div class="public anchor" id="var-value"><h3><a href="#var-value">value</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L177">view source</a></div></div><div class="public anchor" id="var-writer"><h3><a href="#var-writer">writer</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(writer f)</code></div><div class="doc"><div class="markdown"><p>The Writer type constructor.</p><p>The purpose of Writer type is wrap a simple function that fullfill the writer signature.</p><p>It exists just for avoid extend the clojure function type because is very generic type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L50">view source</a></div></div><div class="public anchor" id="var-writer-transformer"><h3><a href="#var-writer-transformer">writer-transformer</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(writer-transformer inner-monad)</code></div><div class="doc"><div class="markdown"><p>The Writer transformer constructor.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L101">view source</a></div></div><div class="public anchor" id="var-writer.3F"><h3><a href="#var-writer.3F">writer?</a></h3><h4 class="deprecated">deprecated</h4><div class="usage"><code>(writer? s)</code></div><div class="doc"><div class="markdown"><p>Return true if <code>s</code> is instance of Writer type.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/monad/writer.cljc#L62">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.protocols.html b/latest/api/cats.protocols.html
new file mode 100644
index 0000000..d08e915
--- /dev/null
+++ b/latest/api/cats.protocols.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.protocols documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch current"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.protocols</h2><div class="doc"><div class="markdown"><p>A collection of protocols upon which the cats abstractions are built.</p>
+<p>NOTE: Functions of this namespace are not intended to be used directly. It is considered internal api.</p></div></div><div class="public anchor" id="var-Applicative"><h3><a href="#var-Applicative">Applicative</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>The Applicative abstraction.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--fapply"><h3><a href="#var--fapply">-fapply</a></h3><div class="usage"><code>(-fapply app af av)</code></div><div class="doc"><div class="markdown"><p>Applies the function(s) inside af&rsquo;s context to the value(s) inside av&rsquo;s context while preserving the context.</p></div></div></div><div class="public anchor" id="var--pure"><h3><a href="#var--pure">-pure</a></h3><div class="usage"><code>(-pure app v)</code></div><div class="doc"><div class="markdown"><p>Takes any context or monadic value <code>app</code> and any value <code>v</code>, and puts the value <code>v</code> in the most minimal context (normally <code>mempty</code>) of same type of <code>app</code></p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L69">view source</a></div></div><div class="public anchor" id="var-Bifunctor"><h3><a href="#var-Bifunctor">Bifunctor</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A &lsquo;Functor&rsquo; of two arguments.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--bimap"><h3><a href="#var--bimap">-bimap</a></h3><div class="usage"><code>(-bimap btor f g bv)</code></div><div class="doc"><div class="markdown"><p>Map over both arguments at the same time.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L65">view source</a></div></div><div class="public anchor" id="var-Context"><h3><a href="#var-Context">Context</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A marker protocol for identifying the valid context types.</p></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L32">view source</a></div></div><div class="public anchor" id="var-Contextual"><h3><a href="#var-Contextual">Contextual</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>Abstraction that establishes a concrete type as a member of a context.</p>
+<p>A great example is the Maybe monad type Just. It implements this abstraction to establish that Just is part of the Maybe monad.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--get-context"><h3><a href="#var--get-context">-get-context</a></h3><div class="usage"><code>(-get-context _)</code></div><div class="doc"><div class="markdown"><p>Get the context associated with the type.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L35">view source</a></div></div><div class="public anchor" id="var-Extract"><h3><a href="#var-Extract">Extract</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A type class to extract the value from a monad context.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--extract"><h3><a href="#var--extract">-extract</a></h3><div class="usage"><code>(-extract mv)</code></div><div class="doc"><div class="markdown"><p>Extract the value from monad context.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L56">view source</a></div></div><div class="public anchor" id="var-Foldable"><h3><a href="#var-Foldable">Foldable</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>Abstraction of data structures that can be folded to a summary value.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--foldl"><h3><a href="#var--foldl">-foldl</a></h3><div class="usage"><code>(-foldl fctx f z xs)</code></div><div class="doc"><div class="markdown"><p>Left-associative fold of a structure.</p></div></div></div><div class="public anchor" id="var--foldr"><h3><a href="#var--foldr">-foldr</a></h3><div class="usage"><code>(-foldr fctx f z xs)</code></div><div class="doc"><div class="markdown"><p>Right-associative fold of a structure.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L78">view source</a></div></div><div class="public anchor" id="var-Functor"><h3><a href="#var-Functor">Functor</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A data type that can be mapped over without altering its context.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--fmap"><h3><a href="#var--fmap">-fmap</a></h3><div class="usage"><code>(-fmap ftor f fv)</code></div><div class="doc"><div class="markdown"><p>Applies function f to the value(s) inside the context of the functor fv.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L61">view source</a></div></div><div class="public anchor" id="var-Monad"><h3><a href="#var-Monad">Monad</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>The Monad abstraction.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--mbind"><h3><a href="#var--mbind">-mbind</a></h3><div class="usage"><code>(-mbind m mv f)</code></div><div class="doc"><div class="markdown"></div></div></div><div class="public anchor" id="var--mreturn"><h3><a href="#var--mreturn">-mreturn</a></h3><div class="usage"><code>(-mreturn m v)</code></div><div class="doc"><div class="markdown"></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L90">view source</a></div></div><div class="public anchor" id="var-MonadPlus"><h3><a href="#var-MonadPlus">MonadPlus</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A complement abstraction for Monad that supports the notion of addition.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--mplus"><h3><a href="#var--mplus">-mplus</a></h3><div class="usage"><code>(-mplus m mv mv&apos;)</code></div><div class="doc"><div class="markdown"><p>An associative addition operation.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L100">view source</a></div></div><div class="public anchor" id="var-MonadZero"><h3><a href="#var-MonadZero">MonadZero</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A complement abstraction for monad that supports the notion of an identity element.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--mzero"><h3><a href="#var--mzero">-mzero</a></h3><div class="usage"><code>(-mzero m)</code></div><div class="doc"><div class="markdown"><p>The identity element for the given monadzero.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L95">view source</a></div></div><div class="public anchor" id="var-Monoid"><h3><a href="#var-Monoid">Monoid</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A Semigroup which has an identity element with respect to an associative binary operation.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--mempty"><h3><a href="#var--mempty">-mempty</a></h3><div class="usage"><code>(-mempty s)</code></div><div class="doc"><div class="markdown"><p>The identity element for the given monoid.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L52">view source</a></div></div><div class="public anchor" id="var-Printable"><h3><a href="#var-Printable">Printable</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>An abstraction to make a type printable in a platform independent manner.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--repr"><h3><a href="#var--repr">-repr</a></h3><div class="usage"><code>(-repr _)</code></div><div class="doc"><div class="markdown"><p>Get the repl ready representation of the object.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L43">view source</a></div></div><div class="public anchor" id="var-Semigroup"><h3><a href="#var-Semigroup">Semigroup</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>A structure with an associative binary operation.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--mappend"><h3><a href="#var--mappend">-mappend</a></h3><div class="usage"><code>(-mappend s sv sv&apos;)</code></div><div class="doc"><div class="markdown"><p>An associative addition operation.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L48">view source</a></div></div><div class="public anchor" id="var-Traversable"><h3><a href="#var-Traversable">Traversable</a></h3><h4 class="type">protocol</h4><div class="usage"></div><div class="doc"><div class="markdown"><p>Abstraction of data structures that can be traversed from left to right performing an action on every element.</p></div></div><div class="members"><h4>members</h4><div class="inner"><div class="public anchor" id="var--traverse"><h3><a href="#var--traverse">-traverse</a></h3><div class="usage"><code>(-traverse tctx f tv)</code></div><div class="doc"><div class="markdown"><p>Map each element to an Applicative, evaluate the applicatives from left to right and collect the results.</p></div></div></div></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/protocols.cljc#L83">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/cats.util.html b/latest/api/cats.util.html
new file mode 100644
index 0000000..0e79175
--- /dev/null
+++ b/latest/api/cats.util.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>cats.util documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2 current"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">cats.util</h2><div class="doc"><div class="markdown"><p>A collection of utils that used around the library.</p></div></div><div class="public anchor" id="var-make-printable"><h3><a href="#var-make-printable">make-printable</a></h3><div class="usage"><code>(make-printable klass)</code></div><div class="doc"><div class="markdown"></div></div><div class="src-link"><a href="http://github.com/funcool/cats/blob/master/src/cats/util.cljc#L30">view source</a></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/css/default.css b/latest/api/css/default.css
new file mode 100644
index 0000000..257ab2c
--- /dev/null
+++ b/latest/api/css/default.css
@@ -0,0 +1,442 @@
+@import url(http://fonts.googleapis.com/css?family=Droid+Sans+Mono:200,300,400);
+@import url(http://fonts.googleapis.com/css?family=Lato:light,regular);
+@import url(http://fonts.googleapis.com/css?family=Ubuntu:300,400,500);
+
+body {
+    font-family: "Lato", Helvetica, Arial, sans-serif;
+    font-weight: 300;
+    color:#585858;
+    font-size: 100%;
+    margin: 0px;
+}
+
+pre, code {
+    font-family: "Droid Sans Mono","DejaVu Sans Mono","Monospace",monospace;
+    font-weight: 300;
+}
+
+section.container {
+    display: flex;
+    font-size: 100%;
+}
+
+h2 {
+    font-weight: normal;
+    font-size: 3em;
+    padding: 10px 0 2px 0;
+    margin: 0;
+}
+
+header {
+    color: #333;
+    padding: 10px;
+}
+
+header small {
+    font-style: italic;
+}
+
+header h1 {
+    margin: 0;
+    padding: 0;
+    /* font-size: 12pt; */
+    font-weight: lighter;
+    /* text-shadow: -1px -1px 0px #333; */
+}
+
+header h1 a {
+    color: #333;
+    /* font-size: 32px; */
+    font-weight: 400;
+    text-decoration: none;
+}
+
+#content {
+    overflow: auto;
+    background: #fff;
+    color: #333;
+    padding: 0 18px;
+    font-size: 1.3em;
+}
+
+#namespaces {
+    border-right: solid 1px #cccccc;
+    min-width: 200px;
+    padding-right: 15px;
+}
+
+#vars {
+    border-right: solid 1px #cccccc;
+    width: 200px;
+}
+
+.sidebar {
+    overflow: auto;
+}
+
+.sidebar a {
+    color: #333;
+    display: block;
+    text-decoration: none;
+}
+
+.sidebar h3 {
+    margin: 0;
+    padding: 10px 10px 0 10px;
+    font-size: 19px;
+    font-weight: normal;
+}
+
+.sidebar ul {
+    padding: 0.5em 0em;
+    margin: 0;
+}
+
+.sidebar li {
+    display: block;
+    vertical-align: middle;
+}
+
+.sidebar li a, .sidebar li .no-link {
+    border-left: 3px solid transparent;
+    padding: 0 15px;
+    white-space: nowrap;
+}
+
+.sidebar li .no-link {
+    display: block;
+    color: #777;
+    font-style: italic;
+}
+
+.sidebar li .inner {
+    display: inline-block;
+    padding-top: 7px;
+    height: 24px;
+}
+
+.sidebar li a, .sidebar li .tree {
+    height: 31px;
+    /* height: 25px; */
+}
+
+.depth-1 .inner { padding-left: 2px; }
+.depth-2 .inner { padding-left: 6px; }
+.depth-3 .inner { padding-left: 20px; }
+.depth-4 .inner { padding-left: 34px; }
+.depth-5 .inner { padding-left: 48px; }
+.depth-6 .inner { padding-left: 62px; }
+
+.sidebar li .tree {
+    display: block;
+    float: left;
+    position: relative;
+    top: -10px;
+    margin: 0 4px 0 0;
+    padding: 0;
+}
+
+.sidebar li.depth-1 .tree {
+    display: none;
+}
+
+.sidebar li .tree .top, .sidebar li .tree .bottom {
+    display: block;
+    margin: 0;
+    padding: 0;
+    width: 7px;
+}
+
+.sidebar li .tree .top {
+    border-left: 1px solid #aaa;
+    border-bottom: 1px solid #aaa;
+    height: 19px;
+}
+
+.sidebar li .tree .bottom {
+    height: 22px;
+}
+
+.sidebar li.branch .tree .bottom {
+    border-left: 1px solid #aaa;
+}
+
+#namespaces li.current a {
+    border-left: 3px solid #a33;
+    border-left: 3px solid #7a2518;
+    color: #a33;
+    color: #7a2518;
+
+}
+
+#vars li.current a {
+    border-left: 3px solid #33a;
+    color: #33a;
+}
+
+.namespace-docs h2 {
+    color: #7a2518;
+}
+
+.namespace-docs h3 a {
+    color: #ba3925;
+    font-family: "Droid Sans Mono","DejaVu Sans Mono","Monospace",monospace;
+    font-weight: 400;
+    text-decoration: none;
+}
+
+.namespace-docs .usage code {
+    display: block;
+    color: #777;
+    margin: 2px 0;
+    font-size: 0.6em;
+}
+
+/* .usage code:first-child { */
+/*     padding-top: 10px; */
+/* } */
+
+
+
+.namespace-index h3 a {
+    text-decoration: none;
+    color: #ba3925;
+    font-family: "Droid Sans Mono","DejaVu Sans Mono","Monospace",monospace;
+    font-weight: 300;
+}
+
+.public h3 {
+    margin: 0;
+}
+
+.public {
+    margin: 0;
+    border-top: 1px solid #efefef;
+    padding-top: 14px;
+    padding-bottom: 6px;
+}
+
+.public:last-child {
+    margin-bottom: 20%;
+}
+
+.members .public:last-child {
+    margin-bottom: 0;
+}
+
+.members {
+    margin: 15px 0;
+}
+
+.members h4 {
+    color: #555;
+    font-weight: normal;
+    font-variant: small-caps;
+    margin: 0 0 5px 0;
+}
+
+.members .inner {
+    padding-top: 5px;
+    padding-left: 12px;
+    margin-top: 2px;
+    margin-left: 7px;
+    border-left: 1px solid #bbb;
+}
+
+#content .members .inner h3 {
+    /* font-size: 12pt; */
+}
+
+.members .public {
+    border-top: none;
+    margin-top: 0;
+    padding-top: 6px;
+    padding-bottom: 0;
+}
+
+.members .public:first-child {
+    padding-top: 0;
+}
+
+h4.type,
+h4.dynamic,
+h4.added,
+h4.deprecated {
+    margin: 3px 10px 10spx 0;
+    font-weight: bold;
+    font-variant: small-caps;
+}
+
+.public h4.type,
+.public h4.dynamic,
+.public h4.added,
+.public h4.deprecated {
+    font-weight: bold;
+    /* margin: 3px 0 0 10px; */
+    font-size: 0.7em;
+}
+
+.members h4.type,
+.members h4.added,
+.members h4.deprecated {
+    margin-top: 1px;
+}
+
+h4.type {
+    color: #717171;
+}
+
+h4.dynamic {
+    color: #9933aa;
+}
+
+h4.added {
+    color: #508820;
+}
+
+h4.deprecated {
+    color: #880000;
+}
+
+.namespace {
+    margin-bottom: 40px;
+}
+
+.namespace:last-child {
+    margin-bottom: 10%;
+}
+
+.index {
+    padding: 0;
+    margin: 15px 0;
+}
+
+.index * {
+    display: inline;
+}
+
+.index p {
+    padding-right: 3px;
+}
+
+.index li {
+    padding-right: 5px;
+}
+
+.index li a {
+    color: #333;
+    font-family: "Droid Sans Mono","DejaVu Sans Mono","Monospace",monospace;
+    font-size: 0.8em;
+    text-decoration: none;
+    font-weight: 300;
+}
+
+.index ul {
+    padding-left: 0;
+}
+
+p {
+    margin: 15px 0;
+}
+
+.public p:first-child, .public pre.plaintext {
+    margin-top: 12px;
+}
+
+.doc {
+    margin: 0 0 26px 0;
+    clear: both;
+}
+
+.public .doc {
+    margin: 0;
+}
+
+.namespace-index .doc {
+    margin-bottom: 20px;
+}
+
+.namespace-index .namespace .doc {
+    margin-bottom: 10px;
+}
+
+.markdown {
+    /* line-height: 18px; */
+    /* font-size: 16px; */
+}
+
+.doc, .public, .namespace .index {
+    max-width: 780px;
+    overflow-x: visible;
+}
+
+.markdown code, .src-link a {
+    border-radius: 2px;
+    font-size: 0.8em;
+    color: #444;
+}
+
+.markdown pre {
+    background: #f4f4f4;
+    border: 1px solid #e0e0e0;
+    /* border-radius: 2px; */
+    padding: 5px 5px;
+    border-top: 1px solid #e0e0e0;
+    border-bottom: 1px solid #e0e0e0;
+}
+
+.markdown pre code {
+    background: transparent;
+    border: none;
+}
+
+.doc ul, .doc ol {
+    padding-left: 30px;
+}
+
+.doc table {
+    border-collapse: collapse;
+    margin: 0 10px;
+}
+
+.doc table td, .doc table th {
+    border: 1px solid #dddddd;
+    padding: 4px 6px;
+}
+
+.doc table th {
+    background: #f2f2f2;
+}
+
+.doc dl {
+    margin: 0 10px 20px 10px;
+}
+
+.doc dl dt {
+    font-weight: bold;
+    margin: 0;
+    padding: 3px 0;
+    border-bottom: 1px solid #ddd;
+}
+
+.doc dl dd {
+    padding: 5px 0;
+    margin: 0 0 5px 10px;
+}
+
+.doc abbr {
+    border-bottom: 1px dotted #333;
+    font-variant: none
+                      cursor: help;
+}
+
+.src-link {
+    margin-bottom: 15px;
+}
+
+.src-link a {
+    /* font-size: 70%; */
+    padding: 1px 4px;
+    text-decoration: none;
+    color: #5555bb;
+}
\ No newline at end of file
diff --git a/latest/api/index.html b/latest/api/index.html
new file mode 100644
index 0000000..986a5c6
--- /dev/null
+++ b/latest/api/index.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>Cats 2.2.0 API documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 2.2.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>labs</span></div></div></li><li class="depth-3 branch"><a href="cats.labs.channel.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>channel</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.manifold.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>manifold</span></div></a></li><li class="depth-3 branch"><a href="cats.labs.promise.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>promise</span></div></a></li><li class="depth-3"><a href="cats.labs.test.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>test</span></div></a></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>monad</span></div></div></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2 branch"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-2"><a href="cats.util.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>util</span></div></a></li></ul></div><section class="namespace-index" id="content"><section class="title-container"><h2>Cats</h2><div class="doc"><p>Category Theory abstractions for Clojure</p></div></section><div class="namespace"><h3><a href="cats.builtin.html">cats.builtin</a></h3><div class="doc"><div class="markdown"><p>Clojure(Script) built-in types extensions.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.builtin.html#var-all-monoid">all-monoid</a> </li><li> <a href="cats.builtin.html#var-any-monoid">any-monoid</a> </li><li> <a href="cats.builtin.html#var-function-context">function-context</a> </li><li> <a href="cats.builtin.html#var-lazy-sequence-context">lazy-sequence-context</a> </li><li> <a href="cats.builtin.html#var-map-context">map-context</a> </li><li> <a href="cats.builtin.html#var-prod-monoid">prod-monoid</a> </li><li> <a href="cats.builtin.html#var-range-context">range-context</a> </li><li> <a href="cats.builtin.html#var-sequence-context">sequence-context</a> </li><li> <a href="cats.builtin.html#var-set-context">set-context</a> </li><li> <a href="cats.builtin.html#var-string-monoid">string-monoid</a> </li><li> <a href="cats.builtin.html#var-sum-monoid">sum-monoid</a> </li><li> <a href="cats.builtin.html#var-vector-context">vector-context</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.context.html">cats.context</a></h3><div class="doc"><div class="markdown"><p>A cats context management.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.context.html#var-*context*">*context*</a> </li><li> <a href="cats.context.html#var-*override*">*override*</a> </li><li> <a href="cats.context.html#var-context.3F">context?</a> </li><li> <a href="cats.context.html#var-get-current">get-current</a> </li><li> <a href="cats.context.html#var-with-context">with-context</a> </li><li> <a href="cats.context.html#var-with-context-override">with-context-override</a> </li><li> <a href="cats.context.html#var-with-monad">with-monad</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.core.html">cats.core</a></h3><div class="doc"><div class="markdown"><p>Category Theory abstractions for Clojure</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.core.html#var--.3E.3D">-&gt;=</a> </li><li> <a href="cats.core.html#var--.3E.3E.3D">-&gt;&gt;=</a> </li><li> <a href="cats.core.html#var-.3C.24.3E">&lt;$&gt;</a> </li><li> <a href="cats.core.html#var-.3C*.3E">&lt;*&gt;</a> </li><li> <a href="cats.core.html#var-.3C.3D.3C">&lt;=&lt;</a> </li><li> <a href="cats.core.html#var-.3C.3E">&lt;&gt;</a> </li><li> <a href="cats.core.html#var-.3D.3C.3C">=&lt;&lt;</a> </li><li> <a href="cats.core.html#var-.3E.3D.3E">&gt;=&gt;</a> </li><li> <a href="cats.core.html#var-.3E.3E">&gt;&gt;</a> </li><li> <a href="cats.core.html#var-.3E.3E.3D">&gt;&gt;=</a> </li><li> <a href="cats.core.html#var-alet">alet</a> </li><li> <a href="cats.core.html#var-ap">ap</a> </li><li> <a href="cats.core.html#var-ap-.3E">ap-&gt;</a> </li><li> <a href="cats.core.html#var-ap-.3E.3E">ap-&gt;&gt;</a> </li><li> <a href="cats.core.html#var-as-.3E.3D">as-&gt;=</a> </li><li> <a href="cats.core.html#var-as-ap-.3E">as-ap-&gt;</a> </li><li> <a href="cats.core.html#var-bimap">bimap</a> </li><li> <a href="cats.core.html#var-bind">bind</a> </li><li> <a href="cats.core.html#var-curry">curry</a> </li><li> <a href="cats.core.html#var-curry*">curry*</a> </li><li> <a href="cats.core.html#var-curry-lift-m">curry-lift-m</a> </li><li> <a href="cats.core.html#var-extract">extract</a> </li><li> <a href="cats.core.html#var-fapply">fapply</a> </li><li> <a href="cats.core.html#var-filter">filter</a> </li><li> <a href="cats.core.html#var-fmap">fmap</a> </li><li> <a href="cats.core.html#var-foldl">foldl</a> </li><li> <a href="cats.core.html#var-foldm">foldm</a> </li><li> <a href="cats.core.html#var-foldr">foldr</a> </li><li> <a href="cats.core.html#var-forseq">forseq</a> </li><li> <a href="cats.core.html#var-guard">guard</a> </li><li> <a href="cats.core.html#var-join">join</a> </li><li> <a href="cats.core.html#var-left-map">left-map</a> </li><li> <a href="cats.core.html#var-lift-a">lift-a</a> </li><li> <a href="cats.core.html#var-lift-m">lift-m</a> </li><li> <a href="cats.core.html#var-mappend">mappend</a> </li><li> <a href="cats.core.html#var-mapseq">mapseq</a> </li><li> <a href="cats.core.html#var-mempty">mempty</a> </li><li> <a href="cats.core.html#var-mlet">mlet</a> </li><li> <a href="cats.core.html#var-mplus">mplus</a> </li><li> <a href="cats.core.html#var-mzero">mzero</a> </li><li> <a href="cats.core.html#var-pure">pure</a> </li><li> <a href="cats.core.html#var-return">return</a> </li><li> <a href="cats.core.html#var-right-map">right-map</a> </li><li> <a href="cats.core.html#var-sequence">sequence</a> </li><li> <a href="cats.core.html#var-traverse">traverse</a> </li><li> <a href="cats.core.html#var-unless">unless</a> </li><li> <a href="cats.core.html#var-when">when</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.data.html">cats.data</a></h3><div class="doc"><div class="markdown"><p>Data structures that are used in various places of the library.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.data.html#var-pair">pair</a> </li><li> <a href="cats.data.html#var-pair-monoid">pair-monoid</a> </li><li> <a href="cats.data.html#var-pair.3F">pair?</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.labs.channel.html">cats.labs.channel</a></h3><div class="doc"><div class="markdown"></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.labs.channel.html#var-channel.3F">channel?</a> </li><li> <a href="cats.labs.channel.html#var-with-value">with-value</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.labs.manifold.html">cats.labs.manifold</a></h3><div class="doc"><div class="markdown"></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.labs.manifold.html#var--.3EDeferredContext">-&gt;DeferredContext</a> </li><li> <a href="cats.labs.manifold.html#var-deferred-context">deferred-context</a> </li><li> <a href="cats.labs.manifold.html#var-deferred-context*">deferred-context*</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.labs.promise.html">cats.labs.promise</a></h3><div class="doc"><div class="markdown"><p>A promise monad that uses promesa library.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.labs.promise.html#var-promise-context">promise-context</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.labs.test.html">cats.labs.test</a></h3><div class="doc"><div class="markdown"></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.labs.test.html#var-applicative-composition">applicative-composition</a> </li><li> <a href="cats.labs.test.html#var-applicative-homomorphism">applicative-homomorphism</a> </li><li> <a href="cats.labs.test.html#var-applicative-identity-law">applicative-identity-law</a> </li><li> <a href="cats.labs.test.html#var-applicative-interchange">applicative-interchange</a> </li><li> <a href="cats.labs.test.html#var-bifunctor-bimap-identity">bifunctor-bimap-identity</a> </li><li> <a href="cats.labs.test.html#var-bifunctor-composition">bifunctor-composition</a> </li><li> <a href="cats.labs.test.html#var-bifunctor-first-identity">bifunctor-first-identity</a> </li><li> <a href="cats.labs.test.html#var-bifunctor-second-identity">bifunctor-second-identity</a> </li><li> <a href="cats.labs.test.html#var-first-functor-law">first-functor-law</a> </li><li> <a href="cats.labs.test.html#var-first-monad-law">first-monad-law</a> </li><li> <a href="cats.labs.test.html#var-gen-context">gen-context</a> </li><li> <a href="cats.labs.test.html#var-monadplus-associativity">monadplus-associativity</a> </li><li> <a href="cats.labs.test.html#var-monadzero-bind">monadzero-bind</a> </li><li> <a href="cats.labs.test.html#var-monadzero-identity-element">monadzero-identity-element</a> </li><li> <a href="cats.labs.test.html#var-monoid-identity-element">monoid-identity-element</a> </li><li> <a href="cats.labs.test.html#var-second-functor-law">second-functor-law</a> </li><li> <a href="cats.labs.test.html#var-second-monad-law">second-monad-law</a> </li><li> <a href="cats.labs.test.html#var-semigroup-associativity">semigroup-associativity</a> </li><li> <a href="cats.labs.test.html#var-third-monad-law">third-monad-law</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.monad.either.html">cats.monad.either</a></h3><div class="doc"><div class="markdown"><p>The Either monad implementation and helper functions for working with either related types.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.monad.either.html#var-branch">branch</a> </li><li> <a href="cats.monad.either.html#var-branch-left">branch-left</a> </li><li> <a href="cats.monad.either.html#var-branch-right">branch-right</a> </li><li> <a href="cats.monad.either.html#var-either">either</a> </li><li> <a href="cats.monad.either.html#var-either.3F">either?</a> </li><li> <a href="cats.monad.either.html#var-first-left">first-left</a> </li><li> <a href="cats.monad.either.html#var-first-right">first-right</a> </li><li> <a href="cats.monad.either.html#var-invert">invert</a> </li><li> <a href="cats.monad.either.html#var-left">left</a> </li><li> <a href="cats.monad.either.html#var-left.3F">left?</a> </li><li> <a href="cats.monad.either.html#var-lefts">lefts</a> </li><li> <a href="cats.monad.either.html#var-map-.3ELeft">map-&gt;Left</a> </li><li> <a href="cats.monad.either.html#var-map-.3ERight">map-&gt;Right</a> </li><li> <a href="cats.monad.either.html#var-right">right</a> </li><li> <a href="cats.monad.either.html#var-right.3F">right?</a> </li><li> <a href="cats.monad.either.html#var-rights">rights</a> </li><li> <a href="cats.monad.either.html#var-try-either">try-either</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.monad.exception.html">cats.monad.exception</a></h3><div class="doc"><div class="markdown"><p>The Exception monad.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.monad.exception.html#var-exception.3F">exception?</a> </li><li> <a href="cats.monad.exception.html#var-extract">extract</a> </li><li> <a href="cats.monad.exception.html#var-failure">failure</a> </li><li> <a href="cats.monad.exception.html#var-failure.3F">failure?</a> </li><li> <a href="cats.monad.exception.html#var-map-.3EFailure">map-&gt;Failure</a> </li><li> <a href="cats.monad.exception.html#var-map-.3ESuccess">map-&gt;Success</a> </li><li> <a href="cats.monad.exception.html#var-success">success</a> </li><li> <a href="cats.monad.exception.html#var-success.3F">success?</a> </li><li> <a href="cats.monad.exception.html#var-throw-exception">throw-exception</a> </li><li> <a href="cats.monad.exception.html#var-throwable.3F">throwable?</a> </li><li> <a href="cats.monad.exception.html#var-try-on">try-on</a> </li><li> <a href="cats.monad.exception.html#var-try-or-else">try-or-else</a> </li><li> <a href="cats.monad.exception.html#var-try-or-recover">try-or-recover</a> </li><li> <a href="cats.monad.exception.html#var-wrap">wrap</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.monad.identity.html">cats.monad.identity</a></h3><div class="doc"><div class="markdown"><p>The Identity Monad.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.monad.identity.html#var-identity">identity</a> </li><li> <a href="cats.monad.identity.html#var-identity.3F">identity?</a> </li><li> <a href="cats.monad.identity.html#var-map-.3EIdentity">map-&gt;Identity</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.monad.maybe.html">cats.monad.maybe</a></h3><div class="doc"><div class="markdown"><p>The Maybe monad implementation and helpers functions for working with maybe related types.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.monad.maybe.html#var-cat-maybes">cat-maybes</a> </li><li> <a href="cats.monad.maybe.html#var-from-maybe">from-maybe</a> </li><li> <a href="cats.monad.maybe.html#var-just">just</a> </li><li> <a href="cats.monad.maybe.html#var-just.3F">just?</a> </li><li> <a href="cats.monad.maybe.html#var-map-.3EJust">map-&gt;Just</a> </li><li> <a href="cats.monad.maybe.html#var-map-.3ENothing">map-&gt;Nothing</a> </li><li> <a href="cats.monad.maybe.html#var-map-maybe">map-maybe</a> </li><li> <a href="cats.monad.maybe.html#var-maybe">maybe</a> </li><li> <a href="cats.monad.maybe.html#var-maybe-.3Eseq">maybe-&gt;seq</a> </li><li> <a href="cats.monad.maybe.html#var-maybe.3F">maybe?</a> </li><li> <a href="cats.monad.maybe.html#var-nothing">nothing</a> </li><li> <a href="cats.monad.maybe.html#var-nothing.3F">nothing?</a> </li><li> <a href="cats.monad.maybe.html#var-seq-.3Emaybe">seq-&gt;maybe</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.protocols.html">cats.protocols</a></h3><div class="doc"><div class="markdown"><p>A collection of protocols upon which the cats abstractions are built.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.protocols.html#var-Applicative">Applicative</a> </li><li> <a href="cats.protocols.html#var-Bifunctor">Bifunctor</a> </li><li> <a href="cats.protocols.html#var-Context">Context</a> </li><li> <a href="cats.protocols.html#var-Contextual">Contextual</a> </li><li> <a href="cats.protocols.html#var-Extract">Extract</a> </li><li> <a href="cats.protocols.html#var-Foldable">Foldable</a> </li><li> <a href="cats.protocols.html#var-Functor">Functor</a> </li><li> <a href="cats.protocols.html#var-Monad">Monad</a> </li><li> <a href="cats.protocols.html#var-MonadPlus">MonadPlus</a> </li><li> <a href="cats.protocols.html#var-MonadZero">MonadZero</a> </li><li> <a href="cats.protocols.html#var-Monoid">Monoid</a> </li><li> <a href="cats.protocols.html#var-Printable">Printable</a> </li><li> <a href="cats.protocols.html#var-Semigroup">Semigroup</a> </li><li> <a href="cats.protocols.html#var-Traversable">Traversable</a> </li></ul></div></div><div class="namespace"><h3><a href="cats.util.html">cats.util</a></h3><div class="doc"><div class="markdown"><p>A collection of utils that used around the library.</p></div></div><div class="index"><p>Public variables and functions:</p><ul><li> <a href="cats.util.html#var-make-printable">make-printable</a> </li></ul></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/api/js/jquery.min.js b/latest/api/js/jquery.min.js
new file mode 100644
index 0000000..73f33fb
--- /dev/null
+++ b/latest/api/js/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
+}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="  <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
+},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
diff --git a/latest/api/js/page_effects.js b/latest/api/js/page_effects.js
new file mode 100644
index 0000000..ef8120d
--- /dev/null
+++ b/latest/api/js/page_effects.js
@@ -0,0 +1,99 @@
+function visibleInParent(element) {
+    var position = $(element).position().top
+    return position > -50 && position < ($(element).offsetParent().height() - 50)
+}
+
+function hasFragment(link, fragment) {
+    return $(link).attr("href").indexOf("#" + fragment) != -1
+}
+
+function findLinkByFragment(elements, fragment) {
+    return $(elements).filter(function(i, e) { return hasFragment(e, fragment)}).first()
+}
+
+function scrollToCurrentVarLink(elements) {
+    var elements = $(elements);
+    var parent   = elements.offsetParent();
+
+    if (elements.length == 0) return;
+
+    var top    = elements.first().position().top;
+    var bottom = elements.last().position().top + elements.last().height();
+
+    if (top >= 0 && bottom <= parent.height()) return;
+
+    if (top < 0) {
+        parent.scrollTop(parent.scrollTop() + top);
+    }
+    else if (bottom > parent.height()) {
+        parent.scrollTop(parent.scrollTop() + bottom - parent.height());
+    }
+}
+
+function setCurrentVarLink() {
+    $('#vars a').parent().removeClass('current')
+    $('.anchor').
+        filter(function(index) { return visibleInParent(this) }).
+        each(function(index, element) {
+            findLinkByFragment("#vars a", element.id).
+                parent().
+                addClass('current')
+        });
+    scrollToCurrentVarLink('#vars .current');
+}
+
+var hasStorage = (function() { try { return localStorage.getItem } catch(e) {} }())
+
+function scrollPositionId(element) {
+    var directory = window.location.href.replace(/[^\/]+\.html$/, '')
+    return 'scroll::' + $(element).attr('id') + '::' + directory
+}
+
+function storeScrollPosition(element) {
+    if (!hasStorage) return;
+    localStorage.setItem(scrollPositionId(element) + "::x", $(element).scrollLeft())
+    localStorage.setItem(scrollPositionId(element) + "::y", $(element).scrollTop())
+}
+
+function recallScrollPosition(element) {
+    if (!hasStorage) return;
+    $(element).scrollLeft(localStorage.getItem(scrollPositionId(element) + "::x"))
+    $(element).scrollTop(localStorage.getItem(scrollPositionId(element) + "::y"))
+}
+
+function persistScrollPosition(element) {
+    recallScrollPosition(element)
+    $(element).scroll(function() { storeScrollPosition(element) })
+}
+
+function sidebarContentWidth(element) {
+    var widths = $(element).find('.inner').map(function() { return $(this).innerWidth() })
+    return Math.max.apply(Math, widths)
+}
+
+function resizeSidebars() {
+    var nsWidth  = sidebarContentWidth('#namespaces') + 30
+    var varWidth = 0
+
+    if ($('#vars').length != 0) {
+        varWidth = sidebarContentWidth('#vars') + 30
+    }
+
+    // snap to grid
+    var snap = 30;
+    nsWidth  = Math.ceil(nsWidth / snap) * snap;
+    varWidth = Math.ceil(varWidth / snap) * snap;
+
+    $('#namespaces').css('width', nsWidth)
+    $('#vars').css('width', varWidth)
+    $('#vars, .namespace-index').css('left', nsWidth + 1)
+    $('.namespace-docs').css('left', nsWidth + varWidth + 2)
+}
+
+$(window).ready(resizeSidebars)
+$(window).ready(setCurrentVarLink)
+$(window).ready(function() { persistScrollPosition('#namespaces')})
+$(window).ready(function() {
+    $('#content').scroll(setCurrentVarLink)
+    $(window).resize(setCurrentVarLink)
+})
diff --git a/latest/api/user.html b/latest/api/user.html
new file mode 100644
index 0000000..d1c93a5
--- /dev/null
+++ b/latest/api/user.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><meta charset="UTF-8"><link href="css/default.css" rel="stylesheet" type="text/css"><title>user documentation</title></head><body><header><section class="title"><h1><a href="index.html">Cats Api Documentation</a></h1></section><small>Version: 0.6.0</small></header><section class="container"><div class="sidebar" id="namespaces"><h3><a href="index.html"><span class="inner">Namespaces</span></a></h3><ul><li class="depth-1"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>cats</span></div></div></li><li class="depth-2"><div class="no-link"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>applicative</span></div></div></li><li class="depth-3"><a href="cats.applicative.validation.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>validation</span></div></a></li><li class="depth-2 branch"><a href="cats.builtin.html"><div class="inner"><span class="tree" style="top: -52px;"><span class="top" style="height: 61px;"></span><span class="bottom"></span></span><span>builtin</span></div></a></li><li class="depth-2 branch"><a href="cats.context.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>context</span></div></a></li><li class="depth-2 branch"><a href="cats.core.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>core</span></div></a></li><li class="depth-2 branch"><a href="cats.data.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>data</span></div></a></li><li class="depth-2"><a href="cats.monad.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>monad</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.either.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>either</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.exception.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>exception</span></div></a></li><li class="depth-3 branch"><a href="cats.monad.identity.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>identity</span></div></a></li><li class="depth-3"><a href="cats.monad.maybe.html"><div class="inner"><span class="tree"><span class="top"></span><span class="bottom"></span></span><span>maybe</span></div></a></li><li class="depth-2"><a href="cats.protocols.html"><div class="inner"><span class="tree" style="top: -145px;"><span class="top" style="height: 154px;"></span><span class="bottom"></span></span><span>protocols</span></div></a></li><li class="depth-1 current"><a href="user.html"><div class="inner"><span class="tree" style="top: -393px;"><span class="top" style="height: 402px;"></span><span class="bottom"></span></span><span>user</span></div></a></li></ul></div><section class="namespace-docs" id="content"><h2 class="anchor" id="top">user</h2><div class="doc"><div class="markdown"></div></div></section></section></body></html>
\ No newline at end of file
diff --git a/latest/index.html b/latest/index.html
new file mode 100644
index 0000000..b03e65c
--- /dev/null
+++ b/latest/index.html
@@ -0,0 +1,2105 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 1.5.6.1">
+<meta name="author" content="Andrey Antukh &amp;amp;amp; Alejandro Gómez">
+<title>Cats Documentation</title>
+<style>
+.listingblock .pygments .hll { background-color: #ffffcc }
+.listingblock .pygments, .listingblock .pygments code { background: #f0f0f0; }
+.listingblock .pygments .tok-c { color: #60a0b0; font-style: italic } /* Comment */
+.listingblock .pygments .tok-err { border: 1px solid #FF0000 } /* Error */
+.listingblock .pygments .tok-k { color: #007020; font-weight: bold } /* Keyword */
+.listingblock .pygments .tok-o { color: #666666 } /* Operator */
+.listingblock .pygments .tok-ch { color: #60a0b0; font-style: italic } /* Comment.Hashbang */
+.listingblock .pygments .tok-cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
+.listingblock .pygments .tok-cp { color: #007020 } /* Comment.Preproc */
+.listingblock .pygments .tok-cpf { color: #60a0b0; font-style: italic } /* Comment.PreprocFile */
+.listingblock .pygments .tok-c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
+.listingblock .pygments .tok-cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
+.listingblock .pygments .tok-gd { color: #A00000 } /* Generic.Deleted */
+.listingblock .pygments .tok-ge { font-style: italic } /* Generic.Emph */
+.listingblock .pygments .tok-gr { color: #FF0000 } /* Generic.Error */
+.listingblock .pygments .tok-gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.listingblock .pygments .tok-gi { color: #00A000 } /* Generic.Inserted */
+.listingblock .pygments .tok-go { color: #888888 } /* Generic.Output */
+.listingblock .pygments .tok-gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.listingblock .pygments .tok-gs { font-weight: bold } /* Generic.Strong */
+.listingblock .pygments .tok-gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.listingblock .pygments .tok-gt { color: #0044DD } /* Generic.Traceback */
+.listingblock .pygments .tok-kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.listingblock .pygments .tok-kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.listingblock .pygments .tok-kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.listingblock .pygments .tok-kp { color: #007020 } /* Keyword.Pseudo */
+.listingblock .pygments .tok-kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.listingblock .pygments .tok-kt { color: #902000 } /* Keyword.Type */
+.listingblock .pygments .tok-m { color: #40a070 } /* Literal.Number */
+.listingblock .pygments .tok-s { color: #4070a0 } /* Literal.String */
+.listingblock .pygments .tok-na { color: #4070a0 } /* Name.Attribute */
+.listingblock .pygments .tok-nb { color: #007020 } /* Name.Builtin */
+.listingblock .pygments .tok-nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.listingblock .pygments .tok-no { color: #60add5 } /* Name.Constant */
+.listingblock .pygments .tok-nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.listingblock .pygments .tok-ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.listingblock .pygments .tok-ne { color: #007020 } /* Name.Exception */
+.listingblock .pygments .tok-nf { color: #06287e } /* Name.Function */
+.listingblock .pygments .tok-nl { color: #002070; font-weight: bold } /* Name.Label */
+.listingblock .pygments .tok-nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.listingblock .pygments .tok-nt { color: #062873; font-weight: bold } /* Name.Tag */
+.listingblock .pygments .tok-nv { color: #bb60d5 } /* Name.Variable */
+.listingblock .pygments .tok-ow { color: #007020; font-weight: bold } /* Operator.Word */
+.listingblock .pygments .tok-w { color: #bbbbbb } /* Text.Whitespace */
+.listingblock .pygments .tok-mb { color: #40a070 } /* Literal.Number.Bin */
+.listingblock .pygments .tok-mf { color: #40a070 } /* Literal.Number.Float */
+.listingblock .pygments .tok-mh { color: #40a070 } /* Literal.Number.Hex */
+.listingblock .pygments .tok-mi { color: #40a070 } /* Literal.Number.Integer */
+.listingblock .pygments .tok-mo { color: #40a070 } /* Literal.Number.Oct */
+.listingblock .pygments .tok-sa { color: #4070a0 } /* Literal.String.Affix */
+.listingblock .pygments .tok-sb { color: #4070a0 } /* Literal.String.Backtick */
+.listingblock .pygments .tok-sc { color: #4070a0 } /* Literal.String.Char */
+.listingblock .pygments .tok-dl { color: #4070a0 } /* Literal.String.Delimiter */
+.listingblock .pygments .tok-sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.listingblock .pygments .tok-s2 { color: #4070a0 } /* Literal.String.Double */
+.listingblock .pygments .tok-se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.listingblock .pygments .tok-sh { color: #4070a0 } /* Literal.String.Heredoc */
+.listingblock .pygments .tok-si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.listingblock .pygments .tok-sx { color: #c65d09 } /* Literal.String.Other */
+.listingblock .pygments .tok-sr { color: #235388 } /* Literal.String.Regex */
+.listingblock .pygments .tok-s1 { color: #4070a0 } /* Literal.String.Single */
+.listingblock .pygments .tok-ss { color: #517918 } /* Literal.String.Symbol */
+.listingblock .pygments .tok-bp { color: #007020 } /* Name.Builtin.Pseudo */
+.listingblock .pygments .tok-fm { color: #06287e } /* Name.Function.Magic */
+.listingblock .pygments .tok-vc { color: #bb60d5 } /* Name.Variable.Class */
+.listingblock .pygments .tok-vg { color: #bb60d5 } /* Name.Variable.Global */
+.listingblock .pygments .tok-vi { color: #bb60d5 } /* Name.Variable.Instance */
+.listingblock .pygments .tok-vm { color: #bb60d5 } /* Name.Variable.Magic */
+.listingblock .pygments .tok-il { color: #40a070 } /* Literal.Number.Integer.Long */
+</style>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Liberation+Mono:400|Roboto+Slab:400,700"/>
+<link rel="stylesheet" href="https://www.niwi.nz/_assets/asciidoctor-styles/simple-red-titles/stylesheet.css"/>
+</head>
+<body class="article toc2 toc-left">
+<div id="header">
+<h1>Cats Documentation</h1>
+<div class="details">
+<span id="author" class="author">Andrey Antukh &amp;amp;amp; Alejandro Gómez</span><br>
+<span id="revdate">2.2.0</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#rationale">Rationale</a></li>
+<li><a href="#install">Install</a></li>
+<li><a href="#user-guide">User Guide</a>
+<ul class="sectlevel2">
+<li><a href="#semigroup">Semigroup</a></li>
+<li><a href="#monoid">Monoid</a></li>
+<li><a href="#functor">Functor</a></li>
+<li><a href="#applicative">Applicative</a></li>
+<li><a href="#foldable">Foldable</a></li>
+<li><a href="#traversable">Traversable</a></li>
+<li><a href="#monad">Monad</a></li>
+<li><a href="#monadzero">MonadZero</a></li>
+<li><a href="#monadplus">MonadPlus</a></li>
+</ul>
+</li>
+<li><a href="#types">Types</a>
+<ul class="sectlevel2">
+<li><a href="#maybe">Maybe</a></li>
+<li><a href="#either">Either</a></li>
+<li><a href="#exception">Exception</a></li>
+<li><a href="#built-in-types">Built in types</a></li>
+</ul>
+</li>
+<li><a href="#syntax-sugar">Syntax sugar</a>
+<ul class="sectlevel2">
+<li><a href="#mlet">mlet</a></li>
+<li><a href="#alet">alet</a></li>
+</ul>
+</li>
+<li><a href="#higher-order-functions">Higher-order functions</a>
+<ul class="sectlevel2">
+<li><a href="#curry">curry</a></li>
+<li><a href="#lift-m">lift-m</a></li>
+</ul>
+</li>
+<li><a href="#labs">Labs</a>
+<ul class="sectlevel2">
+<li><a href="#test-check">test.check</a></li>
+<li><a href="#channel">Channel</a></li>
+<li><a href="#manifold-deferred">Manifold Deferred</a></li>
+</ul>
+</li>
+<li><a href="#complementary-libraries">Complementary libraries</a></li>
+<li><a href="#faq">FAQ</a>
+<ul class="sectlevel2">
+<li><a href="#what-clojure-types-implement-some-of-the-category-theory-abstractions">What Clojure types implement some of the Category Theory abstractions?</a></li>
+</ul>
+</li>
+<li><a href="#developers-guide">Developers Guide</a>
+<ul class="sectlevel2">
+<li><a href="#philosophy">Philosophy</a></li>
+<li><a href="#contributing">Contributing</a></li>
+<li><a href="#editor-integration">Editor integration</a></li>
+<li><a href="#source-code">Source Code</a></li>
+<li><a href="#run-tests">Run tests</a></li>
+<li><a href="#license">License</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p><span class="image"><img src="logo.png" alt="cats logo"></span></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="introduction"><a class="link" href="#introduction">Introduction</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Category Theory and algebraic abstractions for Clojure.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="rationale"><a class="link" href="#rationale">Rationale</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The main motivations for writing this library are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The existing libraries do not have support for ClojureScript.</p>
+</li>
+<li>
+<p>We do not intend to write a little Haskell inside Clojure. We have adopted a
+practical and Clojure like pragmatic approach, always with correctness in mind.</p>
+</li>
+<li>
+<p>We do not like viral/copyleft like licenses and in contrast to other libraries
+cats is licensed under the BSD (2 clauses) license.</p>
+</li>
+<li>
+<p>We do not intend to only implement monads. Other category theory and algebraic
+abstractions are also first class in cats.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="install"><a class="link" href="#install">Install</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The simplest way to use <em>cats</em> in a Clojure project is by including
+it as a dependency in your <strong><em>project.clj</em></strong>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">[</span><span class="tok-nv">funcool/cats</span> <span class="tok-s">&quot;2.2.0&quot;</span><span class="tok-p">]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And it works with the following platforms: <strong>jdk7</strong>, <strong>jdk8</strong>, <strong>node</strong>
+(4.2.0, 5.10.1 and 6.2.0).</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="user-guide"><a class="link" href="#user-guide">User Guide</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This section introduces almost all the category theory and algebraic abstractions
+that the <em>cats</em> library supports.</p>
+</div>
+<div class="paragraph">
+<p>We will use <em>Maybe</em> for the example snippets, because it has support for all
+the abstractions and is very easy to understand. You can read more about it in
+the next section of this documentation.</p>
+</div>
+<div class="sect2">
+<h3 id="semigroup"><a class="link" href="#semigroup">Semigroup</a></h3>
+<div class="paragraph">
+<p>A semigroup is an algebraic structure with an associative binary operation
+(<code>mappend</code>). Most of the builtin collections form a semigroup because their
+associative binary operation is analogous to Clojure&#8217;s <code>into</code>.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mappend</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">]</span> <span class="tok-p">[</span><span class="tok-mi">4</span> <span class="tok-mi">5</span> <span class="tok-mi">6</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; [1 2 3 4 5 6]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Given that the values it contains form a Semigroup, we can <code>mappend</code> multiple
+<em>Maybe</em> values.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mappend</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">])</span>
+           <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">[</span><span class="tok-mi">4</span> <span class="tok-mi">5</span> <span class="tok-mi">6</span><span class="tok-p">]))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just [1 2 3 4 5 6]&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="monoid"><a class="link" href="#monoid">Monoid</a></h3>
+<div class="paragraph">
+<p>A Monoid is a Semigroup with an identity element (<code>mempty</code>). For the collection
+types the <code>mempty</code> function is analogous to Clojure&#8217;s <code>empty</code>.</p>
+</div>
+<div class="paragraph">
+<p>Given that the values it contains form a Semigroup, we can <code>mappend</code> multiple
+<em>Maybe</em>, with Nothing being the identity element.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mappend</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">])</span>
+           <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)</span>
+           <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">[</span><span class="tok-mi">4</span> <span class="tok-mi">5</span> <span class="tok-mi">6</span><span class="tok-p">])</span>
+           <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just [1 2 3 4 5 6]&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="functor"><a class="link" href="#functor">Functor</a></h3>
+<div class="paragraph">
+<p>Let&#8217;s dive into the functor. The Functor represents some sort of "computational
+context", and the abstraction consists of one unique function: <strong>fmap</strong>.</p>
+</div>
+<div class="listingblock">
+<div class="title">Signature of <strong>fmap</strong> function</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">fmap</span> <span class="tok-p">[</span><span class="tok-nv">f</span> <span class="tok-nv">fv</span><span class="tok-p">])</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The higher-order function <strong>fmap</strong> takes a plain function as the first parameter and
+a value wrapped in a functor context as the second parameter. It extracts the
+inner value, applies the function to it and returns the result wrapped in same type
+as the second parameter.</p>
+</div>
+<div class="paragraph">
+<p>But what is the <strong>functor context</strong>? It sounds more complex than it is. A Functor
+wrapper is any type that acts as "Box" and implements the <code>Context</code> and <code>Functor</code>
+protocols.</p>
+</div>
+<div class="listingblock">
+<div class="title">One good example of a functor is the <strong>Maybe</strong> type:</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">2</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 2&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>just</code> function is a constructor of the Just type that is part of the
+Maybe monad.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s see one example of using <strong>fmap</strong> over a <strong>just</strong> instance:</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using fmap over <strong>just</strong> instance.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nb">inc </span><span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 2&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>Maybe</strong> type also has another constructor: <code>nothing</code>. It represents the
+absence of a value. It is a safe substitute for <code>nil</code> and may represent failure.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s see what happens if we perform the same operation as the previous example
+over a <strong>nothing</strong> instance:</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using fmap over <strong>nothing</strong>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nb">inc </span><span class="tok-p">(</span><span class="tok-nf">nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Oh, awesome, instead of raising a <code>NullPointerException</code>, it just returns
+<strong>nothing</strong>. Another advantage of using the functor abstraction, is that it
+always returns a result of the same type as its second argument.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s see an example of applying fmap over a Clojure vector:</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using fmap over <strong>vector</strong>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nb">inc </span><span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; [2 3 4]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The main difference compared to the previous example with Clojure&#8217;s map function,
+is that map returns lazy seqs no matter what collection we pass to it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">type</span> <span class="tok-p">(</span><span class="tok-nb">map inc </span><span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">]))</span>
+<span class="tok-c1">;; =&gt; clojure.lang.LazySeq (cljs.core/LazySeq in ClojureScript)</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>But why can we pass vectors to the <code>fmap</code> function? Because some Clojure container
+types like vectors, lists and sets, also implement the functor abstraction. See
+the section on built-in types for more information.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="applicative"><a class="link" href="#applicative">Applicative</a></h3>
+<div class="paragraph">
+<p>Let&#8217;s continue with applicative functors. The Applicative Functor represents
+some sort of "computational context" like a plain Functor, but with the ability to
+execute a function wrapped in the same context.</p>
+</div>
+<div class="paragraph">
+<p>The Applicative Functor abstraction consists of two functions: <strong>fapply</strong> and
+<strong>pure</strong>.</p>
+</div>
+<div class="listingblock">
+<div class="title">Signature of <strong>fapply</strong> function</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">fapply</span> <span class="tok-p">[</span><span class="tok-nv">af</span> <span class="tok-nv">av</span><span class="tok-p">])</span></code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+the <strong>pure</strong> function will be explained later.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The use case for Applicative Functors is roughly the same as for plain Functors:
+safe evaluation of some computation in a context.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s see an example to better understand the differences between functor and
+applicative functor:</p>
+</div>
+<div class="paragraph">
+<p>Imagine you have some factory function that, depending on the language, returns a
+greeter function, and you only support a few languages.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">make-greeter</span>
+  <span class="tok-p">[</span><span class="tok-o">^</span><span class="tok-nv">String</span> <span class="tok-nv">lang</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">condp</span> <span class="tok-nb">= </span><span class="tok-nv">lang</span>
+    <span class="tok-s">&quot;es&quot;</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">name</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">str </span><span class="tok-s">&quot;Hola &quot;</span> <span class="tok-nv">name</span><span class="tok-p">))</span>
+    <span class="tok-s">&quot;en&quot;</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">name</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">str </span><span class="tok-s">&quot;Hello &quot;</span> <span class="tok-nv">name</span><span class="tok-p">))</span>
+    <span class="tok-nv">nil</span><span class="tok-p">))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, before using the resulting greeter you should always defensively check if
+the returned greeter is a valid function or a nil value.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s convert this factory to use the Maybe type:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">make-greeter</span>
+  <span class="tok-p">[</span><span class="tok-o">^</span><span class="tok-nv">String</span> <span class="tok-nv">lang</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">condp</span> <span class="tok-nb">= </span><span class="tok-nv">lang</span>
+    <span class="tok-s">&quot;es&quot;</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">name</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">str </span><span class="tok-s">&quot;Hola &quot;</span> <span class="tok-nv">name</span><span class="tok-p">)))</span>
+    <span class="tok-s">&quot;en&quot;</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">name</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">str </span><span class="tok-s">&quot;Hello &quot;</span> <span class="tok-nv">name</span><span class="tok-p">)))</span>
+    <span class="tok-p">(</span><span class="tok-nf">nothing</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, this version of the factory differs only slightly from the
+original implementation. And this tiny change gives you a new superpower: you
+can apply the returned greeter to any value without a defensive nil check:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">fapply</span> <span class="tok-p">(</span><span class="tok-nf">make-greeter</span> <span class="tok-s">&quot;es&quot;</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-s">&quot;Alex&quot;</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just &quot;Hola Alex&quot;&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">fapply</span> <span class="tok-p">(</span><span class="tok-nf">make-greeter</span> <span class="tok-s">&quot;en&quot;</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-s">&quot;Alex&quot;</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just &quot;Hello Alex&quot;&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">fapply</span> <span class="tok-p">(</span><span class="tok-nf">make-greeter</span> <span class="tok-s">&quot;it&quot;</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-s">&quot;Alex&quot;</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Moreover, the applicative functor comes with the <strong>pure</strong> function, which allows
+you to put some value in side-effect-free context of the current type.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">pure</span> <span class="tok-nv">maybe/maybe-monad</span> <span class="tok-mi">5</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 5&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you do not understand the purpose of the <strong>pure</strong> function, the next sections
+should clarify its purpose.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="foldable"><a class="link" href="#foldable">Foldable</a></h3>
+<div class="paragraph">
+<p>The <strong>Foldable</strong> is a generic abstraction for data structures that can be folded. It
+consists mainly on two functions: <code>foldl</code> and <code>foldr</code>. <code>foldl</code> is also known as
+<code>reduce</code> or <code>inject</code> in other mainstream programming languages.</p>
+</div>
+<div class="paragraph">
+<p>Both function have an identical signature and differ in how they traverse the
+data structure. Let&#8217;s look at a little example using <code>foldl</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">foldl</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">acc</span> <span class="tok-nv">v</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">acc</span> <span class="tok-nv">v</span><span class="tok-p">))</span> <span class="tok-mi">0</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; 15</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You can observe that <code>foldl</code> is identical to the clojure <code>reduce</code> function:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nb">reduce </span><span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">acc</span> <span class="tok-nv">v</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">acc</span> <span class="tok-nv">v</span><span class="tok-p">))</span> <span class="tok-mi">0</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; 15</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And the same operation can be done using <code>foldr</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">foldr</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">v</span> <span class="tok-nv">wc</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">v</span> <span class="tok-nv">wc</span><span class="tok-p">))</span> <span class="tok-mi">0</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; 15</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The main difference between <code>foldl</code> and <code>reduce</code> is that <code>foldl</code> has a fixed
+arity so all parameters are mandatory and <code>foldl</code> is a generic abstraction that
+can work with other types apart from collections.</p>
+</div>
+<div class="paragraph">
+<p>As we said previously, the <code>foldl</code> and <code>foldr</code> differ mainly on how they traverse
+the data structure. Then, for understanding better how they work internally,
+let&#8217;s see a graphical representation of the <code>foldl</code> execution model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>((((acc⊕1)⊕2)⊕3)⊕4)⊕5</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In contrast to the <code>foldr</code> internal execution model that looks like that:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>1⊕(2⊕(3⊕(4⊕(5⊕(wc)))))</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In languages with strict argument evaluation, <code>foldr</code> does not have many
+applications because when the data structure to fold grows it tends to consume
+all the stack (causing the well known stack overflow). In case of Clojure,
+the unique obvious case of using foldr is for small datastructures.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/foldr</span> <span class="tok-o">#</span><span class="tok-p">(</span><span class="tok-nb">cons </span><span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">%1</span><span class="tok-p">)</span> <span class="tok-nv">%2</span><span class="tok-p">)</span> <span class="tok-o">&#39;</span><span class="tok-p">()</span> <span class="tok-p">(</span><span class="tok-nb">range </span><span class="tok-mi">100000</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; StackOverflowError</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>Foldable</strong> abstraction is already implemented for Clojure vectors, lazy seqs
+and ranges plus the cats maybe, either and validation types. Let see an example
+how it behaves with maybe:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/foldl</span> <span class="tok-o">#</span><span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">%1</span> <span class="tok-nv">%2</span><span class="tok-p">))</span> <span class="tok-mi">1</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 2&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/foldl</span> <span class="tok-o">#</span><span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">%1</span> <span class="tok-nv">%2</span><span class="tok-p">))</span> <span class="tok-mi">1</span> <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; 1</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It there also other fold functions that are implemented in terms of the basic
+<code>foldl</code> or <code>foldr</code> that can be <strong>foldm</strong> and <strong>foldmap</strong>. At this moment, cats comes
+only with <strong>foldm</strong>.</p>
+</div>
+<div class="paragraph">
+<p>The <strong>foldm</strong> function in analgous to the <code>foldl</code> in terms of how it does the
+fold operation, with the difference that is aware of the monad context. Or in
+other terms, it works with reducing function that return monad types.</p>
+</div>
+<div class="paragraph">
+<p>Let see an example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">m-div</span>
+  <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-k">if </span><span class="tok-p">(</span><span class="tok-nb">zero? </span><span class="tok-nv">y</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">/ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">))))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/foldm</span> <span class="tok-nv">m-div</span> <span class="tok-mi">1</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 1/6&gt;</span>
+
+
+<span class="tok-p">(</span><span class="tok-nf">m/foldm</span> <span class="tok-nv">m-div</span> <span class="tok-mi">1</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">0</span> <span class="tok-mi">3</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="traversable"><a class="link" href="#traversable">Traversable</a></h3>
+<div class="paragraph">
+<p>The <strong>Traversable</strong> is a generic abstraction for data structures that can be
+traversed from left to right, running an Applicative action for each element.
+Traversables must also be Functors and Foldables.</p>
+</div>
+<div class="paragraph">
+<p>Note that, since Traversables use the Applicative&#8217;s <code>pure</code> operation, the context
+of the applicative must be set when using the <code>traverse</code> function.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s look at an example: we have a vector with numbers that we want to map to
+a Maybe value, and we want to aggregate the result in a Maybe. If any of the
+actions fails (is Nothing) the resulting aggregate will be Nothing, but if all
+succeed we preserve the vector&#8217;s structure inside a Just value.</p>
+</div>
+<div class="paragraph">
+<p>First of all, we define the function that will transform a number to a Maybe.
+Our function will wrap the value in a Just if it&#8217;s even and in a Nothing if it&#8217;s
+not:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">just-if-even</span>
+  <span class="tok-p">[</span><span class="tok-nv">n</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-k">if </span><span class="tok-p">(</span><span class="tok-nf">even?</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now that we have a function that maps a value to the Maybe Applicative, we can
+traverse a vector of numbers and aggregate a Maybe value. The applicatives will
+be evaluated from left to right using the applicative&#8217;s <code>fapply</code>.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.context</span> <span class="tok-ss">:as</span> <span class="tok-nv">ctx</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">ctx/with-context</span> <span class="tok-nv">maybe/context</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/traverse</span> <span class="tok-nv">just-if-even</span> <span class="tok-p">[]))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just []&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">ctx/with-context</span> <span class="tok-nv">maybe/context</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/traverse</span> <span class="tok-nv">just-if-even</span> <span class="tok-p">[</span><span class="tok-mi">2</span> <span class="tok-mi">4</span><span class="tok-p">]))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just [2 4]&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">ctx/with-context</span> <span class="tok-nv">maybe/context</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/traverse</span> <span class="tok-nv">just-if-even</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">]))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">ctx/with-context</span> <span class="tok-nv">maybe/context</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/traverse</span> <span class="tok-nv">just-if-even</span> <span class="tok-p">[</span><span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">]))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="monad"><a class="link" href="#monad">Monad</a></h3>
+<div class="paragraph">
+<p>Monads are the most discussed programming concept to come from category theory.
+Like functors and applicatives, monads deal with data in contexts.</p>
+</div>
+<div class="paragraph">
+<p>Additionally, monads can also transform contexts by unwrapping data, applying
+functions to it and putting new values in a completely different context.</p>
+</div>
+<div class="paragraph">
+<p>The monad abstraction consists of two functions: <strong>bind</strong> and <strong>return</strong></p>
+</div>
+<div class="listingblock">
+<div class="title">Bind function signature.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">bind</span> <span class="tok-p">[</span><span class="tok-nv">mv</span> <span class="tok-nv">f</span><span class="tok-p">])</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, bind works much like a Functor but with inverted arguments. The
+main difference is that in a monad, the function is responsible for wrapping a
+returned value in a context.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example usage of the bind higher-order function.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">v</span><span class="tok-p">]</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">v</span><span class="tok-p">))))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 2&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>One of the key features of the bind function is that any computation executed
+within the context of bind (monad) knows the context type implicitly. With this,
+if you apply some computation over some monadic value and you want to return
+the result in the same container context but don&#8217;t know what that container is,
+you can use <code>return</code> or <code>pure</code> functions:</p>
+</div>
+<div class="listingblock">
+<div class="title">Usage of return function in bind context.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">v</span><span class="tok-p">]</span>
+          <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">v</span><span class="tok-p">))))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 2&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>return</code> or <code>pure</code> functions, when called with one argument, try to use
+the dynamic scope context value that&#8217;s set internally by the <code>bind</code> function.
+Therefore, you can&#8217;t use them with one argument outside of a <code>bind</code> context.</p>
+</div>
+<div class="paragraph">
+<p>We now can compose any number of computations using monad <strong>bind</strong>
+functions. But observe what happens when the number of computations increases:</p>
+</div>
+<div class="listingblock">
+<div class="title">Composability example of bind function.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+          <span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">a</span><span class="tok-p">))</span>
+                  <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">b</span><span class="tok-p">]</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">b</span> <span class="tok-mi">2</span><span class="tok-p">))))))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This can quickly lead to callback hell. To solve this, <em>cats</em> comes with a powerful
+macro: <strong>mlet</strong></p>
+</div>
+<div class="listingblock">
+<div class="title">Previous example but using <strong>mlet</strong> macro.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-nv">b</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">a</span><span class="tok-p">))]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">b</span> <span class="tok-mi">2</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="monadzero"><a class="link" href="#monadzero">MonadZero</a></h3>
+<div class="paragraph">
+<p>Some monads also have the notion of an identity element analogous to that of
+Monoid. When calling <code>bind</code> on a identity element for a monad, the same value is
+returned. This means that whenever we encounter the identity element in a monadic
+composition it will short-circuit.</p>
+</div>
+<div class="paragraph">
+<p>For the already familiar Maybe type the identity element is Nothing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mzero</span> <span class="tok-nv">maybe/maybe-monad</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Having an identity element we can make a monadic composition short-circuit using
+a predicate:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+          <span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-k">if </span><span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-nv">nil</span><span class="tok-p">)</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/mzero</span><span class="tok-p">))</span>
+                  <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">_</span><span class="tok-p">]</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">))))))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see in the above example the predicate <code>(= a 2)</code> returns either a
+monadic value <code>(m/return nil)</code> or the identity value for the maybe monad. This
+can be captured in a function, which is available in <code>cats.core</code> namespace:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">guard</span>
+  <span class="tok-p">[</span><span class="tok-nv">b</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-k">if </span><span class="tok-nv">b</span>
+    <span class="tok-p">(</span><span class="tok-nf">return</span> <span class="tok-nv">nil</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">mzero</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The above example could be rewritten as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+          <span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">m/guard</span> <span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">))</span>
+                  <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">_</span><span class="tok-p">]</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">))))))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Or, using mlet:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-ss">:when</span> <span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)]</span>
+   <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="monadplus"><a class="link" href="#monadplus">MonadPlus</a></h3>
+<div class="paragraph">
+<p>MonadPlus is a complementary abstraction for Monads that support an associative
+binary operation, analogous to that of a Semigroup. If the monad implements the
+MonadZero and MonadPlus protocols it forms a monoid.</p>
+</div>
+<div class="paragraph">
+<p>For the Maybe type, <code>mplus</code> acts similarly to a logical OR that treats <code>Nothing</code>
+values as falsey.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mplus</span> <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mplus</span> <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 1&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mplus</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">2</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 1&gt;</span></code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="types"><a class="link" href="#types">Types</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This section will take a tour over the types exposed in cats library and explain
+how they can be used in the previously explained abstractions.</p>
+</div>
+<div class="sect2">
+<h3 id="maybe"><a class="link" href="#maybe">Maybe</a></h3>
+<div class="paragraph">
+<p>This is one of the two most used monad types (also known as Optional in other
+programming languages).</p>
+</div>
+<div class="paragraph">
+<p>The Maybe monad represents encapsulation of an optional value; e.g. it is used
+as the return type of functions which may or may not return a meaningful value
+when they are applied. It consists of either an empty constructor (called None
+or Nothing), or a constructor encapsulating the original data type A (e.g.
+Just A or Some A).</p>
+</div>
+<div class="paragraph">
+<p><em>cats</em>, implements two types:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>Just</code> that represents a value in a context.</p>
+</li>
+<li>
+<p><code>Nothing</code> that represents the abscense of value.</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="title">Example creating instances of <code>Just</code> and <code>Nothing</code> types:</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 1&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are other useful functions for working with maybe monad types in the same
+namespace. See the API documentation for a full list of them. But here we will
+explain a little relevant subset of them.</p>
+</div>
+<div class="paragraph">
+<p>We mentioned above that <strong>fmap</strong> extracts the value from a functor context. You
+will also want to extract values wrapped by <strong>just</strong> and you can do that with
+<strong>from-maybe</strong>.</p>
+</div>
+<div class="paragraph">
+<p>As we said previously, the Just or Nothing instances act like wrappers and
+in some circumstances you will want extract the plain value from them. cats offers
+the <code>from-maybe</code> function for that.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using <strong>from-maybe</strong> to extract values wrapped by <strong>just</strong>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">maybe/from-maybe</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; 1</span>
+
+<span class="tok-p">(</span><span class="tok-nf">maybe/from-maybe</span> <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; nil</span>
+
+<span class="tok-p">(</span><span class="tok-nf">maybe/from-maybe</span> <span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">)</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; 42</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>from-maybe</code> function is a specialized version of a more generic one:
+<code>cats.core/extract</code>. The generic version is a polymorphic function and will
+also work with different types of different monads.</p>
+</div>
+<div class="paragraph">
+<p>For interoperability with Clojure and ClojureScript&#8217;s <code>IDeref</code> abstraction,
+maybe values are derrefable.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using <strong>deref</strong> to extract values wrapped by <strong>just</strong>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nb">deref </span><span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; 1</span>
+
+<span class="tok-p">(</span><span class="tok-nb">deref </span><span class="tok-p">(</span><span class="tok-nf">maybe/nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; nil</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="either"><a class="link" href="#either">Either</a></h3>
+<div class="paragraph">
+<p>Either is another type that represents a result of a computation, but (in
+contrast with maybe) it can return some data with a failed computation result.</p>
+</div>
+<div class="paragraph">
+<p>In <em>cats</em> it has two constructors:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>(left v)</code>: represents a failure.</p>
+</li>
+<li>
+<p><code>(right v)</code>: represents a successful result.</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="title">Usage example of <strong>Either</strong> constructors.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.either</span> <span class="tok-ss">:refer</span> <span class="tok-ss">:all</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nb">right </span><span class="tok-ss">:valid-value</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Right [:valid-value :right]&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nb">left </span><span class="tok-s">&quot;Error message&quot;</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Either [Error message :left]&gt;</span></code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+Either is also (like Maybe) a Functor, Applicative Functor and Monad.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Like Maybe, Either values can be dereferenced returning the value they contain.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="exception"><a class="link" href="#exception">Exception</a></h3>
+<div class="paragraph">
+<p>Also known as the Try monad, as popularized by Scala.</p>
+</div>
+<div class="paragraph">
+<p>It represents a computation that may either result in an exception or return
+a successfully computed value. Is very similar to the Either monad, but is
+semantically different.</p>
+</div>
+<div class="paragraph">
+<p>It consists of two types: Success and Failure. The Success type is a simple
+wrapper, like Right of the Either monad. But the Failure type is slightly different
+from Left, because it always wraps an instance of Throwable (or any value in
+cljs since you can throw arbitrary values in the JavaScript host).</p>
+</div>
+<div class="paragraph">
+<p>The most common use case of this monad is to wrap third party libraries that
+use standard Exception based error handling. Under normal circumstances,
+however, you should use Either instead.</p>
+</div>
+<div class="paragraph">
+<p>It is an analogue of the try-catch block: it replaces try-catch&#8217;s stack-based
+error handling with heap-based error handling. Instead of having an exception
+thrown and having to deal with it immediately in the same thread, it disconnects
+the error handling and recovery.</p>
+</div>
+<div class="listingblock">
+<div class="title">Usage example of <strong>try-on</strong> macro.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.exception</span> <span class="tok-ss">:as</span> <span class="tok-nv">exc</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">exc/try-on</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Success [1]&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">exc/try-on</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-mi">1</span> <span class="tok-nv">nil</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Failure [#&lt;NullPointerException java.lang.NullPointerException&gt;]&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>cats</em> comes with other syntactic sugar macros: <code>try-or-else</code> that returns a
+default value if a computation fails, and <code>try-or-recover</code> that lets you handle
+the return value when executing a function with the exception as first parameter.</p>
+</div>
+<div class="listingblock">
+<div class="title">Usage example of <code>try-or-else</code> macro.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">exc/try-or-else</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-mi">1</span> <span class="tok-nv">nil</span><span class="tok-p">)</span> <span class="tok-mi">2</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #&lt;Success [2]&gt;</span></code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="title">Usage example of <code>try-or-recover</code> macro.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">exc/try-or-recover</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-mi">1</span> <span class="tok-nv">nil</span><span class="tok-p">)</span>
+                    <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">e</span><span class="tok-p">]</span>
+                      <span class="tok-p">(</span><span class="tok-nf">cond</span>
+                        <span class="tok-p">(</span><span class="tok-nb">instance? </span><span class="tok-nv">NullPointerException</span> <span class="tok-nv">e</span><span class="tok-p">)</span> <span class="tok-mi">0</span>
+                        <span class="tok-ss">:else</span> <span class="tok-mi">100</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; #&lt;Success [0]&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The types defined for the Exception monad (Success and Failure) also implement
+the Clojure IDeref interface, which allows library development using monadic
+composition without forcing a user of that library to use or understand monads.</p>
+</div>
+<div class="paragraph">
+<p>That is because when you dereference the failure instance, it will reraise the
+enclosed exception.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example dereferencing a failure instance</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">f</span> <span class="tok-p">(</span><span class="tok-nf">exc/try-on</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-mi">1</span> <span class="tok-nv">nil</span><span class="tok-p">)))</span>
+
+<span class="tok-o">@</span><span class="tok-nv">f</span>
+<span class="tok-c1">;; =&gt; NullPointerException   clojure.lang.Numbers.ops (Numbers.java:961)</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="built-in-types"><a class="link" href="#built-in-types">Built in types</a></h3>
+<div class="paragraph">
+<p>Some of the abstractions in <em>cats</em> are implemented for built-in types but you
+can&#8217;t use them directly. First, you must load the <code>cats.builtin</code> namespace:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nb">inc </span><span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span><span class="tok-p">])</span>
+<span class="tok-c1">;; =&gt; [2 3 4 5]</span></code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="nil"><a class="link" href="#nil">nil</a></h4>
+<div class="paragraph">
+<p>Given the fact that <code>nil</code> is both a value and a type, we have extended the <code>nil</code>
+type to be equivalent to Maybe monad&#8217;s <code>Nothing</code>. This means that you can use
+<code>nil</code> as if were a <code>Just</code> instance like in the following example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">use</span> <span class="tok-ss">&#39;cats.builtin</span><span class="tok-p">)</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+         <span class="tok-nv">y</span> <span class="tok-nv">nil</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; nil</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, the <code>mlet</code> short-circuits when encountering a <code>nil</code> value.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="vector"><a class="link" href="#vector">Vector</a></h4>
+<div class="paragraph">
+<p>Clojure vectors also participate in several of the abstractions implemented
+in <em>cats</em>, most notably as a monad. Compare the following <code>for</code> comprehension:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nb">for </span><span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">]</span>
+      <span class="tok-nv">y</span> <span class="tok-p">[</span><span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">]]</span>
+   <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; (4 5 6 5 6 7)</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>with the equivalent using <em>mlet</em>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">use</span> <span class="tok-ss">&#39;cats.builtin</span><span class="tok-p">)</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">]</span>
+         <span class="tok-nv">y</span> <span class="tok-p">[</span><span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">]]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; [4 5 6 5 6 7]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note the symmetry between <code>for</code> and <code>mlet</code>. This is not accidental, both are
+what is called a monad comprehension, the difference is that <code>for</code> is limited to
+sequences and <code>mlet</code> can work with arbitrary monads.</p>
+</div>
+<div class="paragraph">
+<p>Also, since <code>mlet</code> desugars into calls to the Monad&#8217;s <code>bind</code> function, its result
+keeps the type of the monadic values.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lazy-sequences"><a class="link" href="#lazy-sequences">Lazy sequences</a></h4>
+<div class="paragraph">
+<p>Lazy sequences implement the same abstractions as vectors with practically an
+identical implementation. If you don&#8217;t need the results right away or are
+interested in a subset of the final results, you can use lazy sequence
+comprehensions.</p>
+</div>
+<div class="paragraph">
+<p>Using <code>mlet</code> with lazy sequences yields exactly the same result as using <code>for</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">use</span> <span class="tok-ss">&#39;cats.builtin</span><span class="tok-p">)</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">lazy-seq</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">])</span>
+         <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">lazy-seq</span> <span class="tok-p">[</span><span class="tok-mi">3</span> <span class="tok-mi">4</span> <span class="tok-mi">5</span><span class="tok-p">])]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; (4 5 6 5 6 7)</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="set"><a class="link" href="#set">Set</a></h4>
+<div class="paragraph">
+<p>Sets implement almost every abstraction in <em>cats</em>, from Semigroup to Monad.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">use</span> <span class="tok-ss">&#39;cats.builtin</span><span class="tok-p">)</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/pure</span> <span class="tok-nv">set-context</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; #{42}</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nb">inc </span><span class="tok-o">#</span><span class="tok-p">{</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span><span class="tok-p">})</span>
+<span class="tok-c1">;; =&gt; #{4 3 2 5}</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-o">#</span><span class="tok-p">{</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">}</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">v</span><span class="tok-p">]</span> <span class="tok-o">#</span><span class="tok-p">{</span><span class="tok-nv">v</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">v</span><span class="tok-p">)}))</span>
+<span class="tok-c1">;; =&gt; #{1 4 3 2}</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="map"><a class="link" href="#map">Map</a></h4>
+<div class="paragraph">
+<p>Maps implement the <em>Semigroup</em> protocol, since we can use <code>merge</code> as their
+associative binary operation. Using <code>mappend</code> on maps is a way to merge them
+together:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">use</span> <span class="tok-ss">&#39;cats.builtin</span><span class="tok-p">)</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mappend</span> <span class="tok-p">{</span><span class="tok-ss">:a</span> <span class="tok-s">&quot;A&quot;</span><span class="tok-p">}</span> <span class="tok-p">{</span><span class="tok-ss">:b</span> <span class="tok-s">&quot;B&quot;</span><span class="tok-p">})</span>
+<span class="tok-c1">;; =&gt; {:a &quot;A&quot;, :b &quot;B&quot;}</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Since we can consider the empty map an identity element for the <code>mappend</code>
+associative binary operation maps also implement <em>Monoid</em> and the <code>mempty</code>
+function gives an empty map.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="syntax-sugar"><a class="link" href="#syntax-sugar">Syntax sugar</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Additionally to the abstractions and types, <strong>cats</strong> exposes some powerful
+syntax abstractions that surelly will make the usage of that abstractions
+in a more familiar way.</p>
+</div>
+<div class="sect2">
+<h3 id="mlet"><a class="link" href="#mlet">mlet</a></h3>
+<div class="paragraph">
+<p>The <code>mlet</code> syntactic abstraction intends to facilitate the composition
+of monadic operations.</p>
+</div>
+<div class="paragraph">
+<p>If you&#8217;ve followed along with the documentation you&#8217;ve seen many examples
+of its usage already, let&#8217;s see what can <code>mlet</code> do. First of all, mlet turns
+this let-like bindings:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-nv">b</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">a</span><span class="tok-p">))]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>into a chain of calls to bind:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+        <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+          <span class="tok-p">(</span><span class="tok-nf">m/bind</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">a</span><span class="tok-p">))</span>
+                  <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">b</span><span class="tok-p">]</span>
+                    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">))))))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That makes a lot more natural to write code that uses monads and gives a very
+familiar <code>let</code> like syntax abstraction that makes the clojure code that uses
+monads less "strange".</p>
+</div>
+<div class="paragraph">
+<p>If you are coming from Haskell, mlet is mostly analogous to the <strong>do notation</strong>.</p>
+</div>
+<div class="paragraph">
+<p>Since the bindings in the mlet macro run the monadic effects of the right-hand
+values we cannot just put any value in there and expect to be bound to its
+left symbol. For cases where we want the regular behavior of let we can inline
+a <code>:let</code> clause, just like with Clojure&#8217;s <code>for</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-nv">b</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">a</span><span class="tok-p">))</span>
+         <span class="tok-ss">:let</span> <span class="tok-p">[</span><span class="tok-nv">z</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">)]]</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">z</span> <span class="tok-mi">2</span><span class="tok-p">)))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>mlet</code> has support for using guards using a <code>:when</code> clause, analogous to the
+one used in <code>for</code>. We can filter out values using <code>bind</code> with <code>mlet</code> and
+<code>:when</code> like the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:as</span> <span class="tok-nv">maybe</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">maybe/just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-ss">:when</span> <span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)]</span>
+   <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Any monadic type that implements <code>MonadZero</code> can be combined with guards
+inside <code>mlet</code> bindings. Here is an example with vectors:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.builtin</span><span class="tok-p">]</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">[</span><span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span> <span class="tok-mi">4</span><span class="tok-p">]</span>
+         <span class="tok-ss">:when</span> <span class="tok-p">(</span><span class="tok-nf">odd?</span> <span class="tok-nv">a</span><span class="tok-p">)]</span>
+   <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">* </span><span class="tok-nv">a</span> <span class="tok-mi">2</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; [2 6]</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="alet"><a class="link" href="#alet">alet</a></h3>
+<div class="paragraph">
+<p>One limitation of monadic bind is that all the steps are strictly sequential and
+happen one at a time. This piece of code illustrates the usage of monadic bind:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">bind</span> <span class="tok-nv">return</span><span class="tok-p">]])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">just</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">bind</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+      <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+        <span class="tok-p">(</span><span class="tok-nf">bind</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">41</span><span class="tok-p">)</span>
+              <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">b</span><span class="tok-p">]</span>
+                <span class="tok-p">(</span><span class="tok-nf">return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">))))))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 42&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the first call to <code>bind</code>, <code>(just 1)</code> and the anonymous function will be
+evaluated. The call of the anonymous function performed by the first <code>bind</code>
+will cause the evaluation of the <code>(just 41)</code> and the next anonymous function,
+which will be also called to create the final result. Note that <code>(just 1)</code>
+and <code>(just 41)</code> are independent and thus could be evaluated at the same time.</p>
+</div>
+<div class="paragraph">
+<p>Here is the <code>mlet</code> version for reference and clarity:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">mlet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+       <span class="tok-nv">b</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">41</span><span class="tok-p">)]</span>
+  <span class="tok-p">(</span><span class="tok-nf">return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 42&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now let&#8217;s see the equivalent using <code>alet</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">alet</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-nf">alet</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+       <span class="tok-nv">b</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">41</span><span class="tok-p">)]</span>
+  <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 42&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that no <code>return</code> is used, this is because the <code>alet</code> body runs inside
+the applicative context with <code>fapply</code>. This is roughly what <code>alet</code> desugars to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">fapply</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">a</span><span class="tok-p">]</span>
+           <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nv">b</span><span class="tok-p">]</span>
+             <span class="tok-p">(</span><span class="tok-nf">do</span>
+               <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span><span class="tok-p">))))</span>
+         <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+         <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">41</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 42&gt;</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that now <code>(just 1)</code> and <code>(just 41)</code> are evaluated at the same time. This
+use of <code>fapply</code> can be called "applicative bind" and in some cases is more
+efficient than monadic bind. Furthermore, the <code>alet</code> macro splits the bindings
+into batches that have dependencies only in previous values and evaluates all
+applicative values in the batch at the same time.</p>
+</div>
+<div class="paragraph">
+<p>This makes no difference at all for Maybe, but applicatives that have latency
+in their calculations (for example promises that do an async computation) get
+a pretty good evaluation strategy, which can minimize overall latency. In the
+next examples we use the <a href="https://github.com/funcool/promesa">promesa</a>
+clj/cljs library for emulate asynchronous behavior:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.labs.promise</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">promesa.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">p</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">sleep-promise</span>
+  <span class="tok-s">&quot;A simple function that emulates an</span>
+<span class="tok-s">  asynchronous operation.&quot;</span>
+  <span class="tok-p">[</span><span class="tok-nv">wait</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">p/promise</span> <span class="tok-p">(</span><span class="tok-k">fn </span><span class="tok-p">[</span><span class="tok-nb">resolve </span><span class="tok-nv">reject</span><span class="tok-p">]</span>
+               <span class="tok-p">(</span><span class="tok-nf">future</span>
+                 <span class="tok-p">(</span><span class="tok-nf">Thread/sleep</span> <span class="tok-nv">wait</span><span class="tok-p">)</span>
+                 <span class="tok-p">(</span><span class="tok-nb">resolve </span><span class="tok-nv">wait</span><span class="tok-p">)))))</span>
+
+<span class="tok-c1">;; note: deref-ing for blocking the current thread</span>
+<span class="tok-c1">;; waiting for the promise being delivered</span>
+
+<span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+           <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">41</span><span class="tok-p">)]</span>
+    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">))))</span>
+<span class="tok-c1">;; &quot;Elapsed time: 84.328182 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 83</span>
+
+<span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+           <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">41</span><span class="tok-p">)]</span>
+    <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; &quot;Elapsed time: 44.246427 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 83</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Another example for illustrating dependencies between batches:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+           <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">41</span><span class="tok-p">)</span>
+           <span class="tok-nv">z</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">x</span><span class="tok-p">))</span>
+           <span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">y</span><span class="tok-p">))]</span>
+   <span class="tok-p">(</span><span class="tok-nf">m/return</span>  <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">z</span> <span class="tok-nv">a</span><span class="tok-p">))))</span>
+<span class="tok-c1">;; &quot;Elapsed time: 194.253182 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 85</span>
+
+<span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">42</span><span class="tok-p">)</span>
+           <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-mi">41</span><span class="tok-p">)</span>
+           <span class="tok-nv">z</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">x</span><span class="tok-p">))</span>
+           <span class="tok-nv">a</span> <span class="tok-p">(</span><span class="tok-nf">sleep-promise</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">y</span><span class="tok-p">))]</span>
+    <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">z</span> <span class="tok-nv">a</span><span class="tok-p">)))</span>
+<span class="tok-c1">;; &quot;Elapsed time: 86.20699 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 85</span></code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="higher-order-functions"><a class="link" href="#higher-order-functions">Higher-order functions</a></h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="curry"><a class="link" href="#curry">curry</a></h3>
+<div class="paragraph">
+<p>The first combinator that <em>cats</em> provides is a <code>curry</code> macro. Given a function,
+it can convert it to a curried versions of itself. The generated function will
+accept parameters until all the expected parameters are given.</p>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s see some examples of a curried function in action:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">add</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-nv">b</span> <span class="tok-nv">c</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span> <span class="tok-nv">c</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">curried-add</span> <span class="tok-p">(</span><span class="tok-nf">m/curry</span> <span class="tok-nv">add</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">curried-add</span> <span class="tok-p">(</span><span class="tok-nf">curried-add</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">(</span><span class="tok-nf">curried-add</span> <span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">((</span><span class="tok-nf">curried-add</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">((</span><span class="tok-nf">curried-add</span> <span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see above, since the original <code>add</code> has a single arity (3) and is
+fixed (i.e. it doesn&#8217;t accept a variable number of arguments), the <code>curry</code> macro
+was able to generate a curried function with the correct number of parameters.</p>
+</div>
+<div class="paragraph">
+<p>This doesn&#8217;t mean that functions with multiple arities or variadic arguments
+can&#8217;t be curried but an arity for the curried function must be given:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">curried+</span> <span class="tok-p">(</span><span class="tok-nf">m/curry</span> <span class="tok-mi">3</span> <span class="tok-nv">+</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-nv">curried+</span> <span class="tok-p">(</span><span class="tok-nf">curried+</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">(</span><span class="tok-nf">curried+</span> <span class="tok-mi">1</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">((</span><span class="tok-nf">curried+</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-mi">2</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span>
+
+<span class="tok-p">(</span><span class="tok-nb">= </span><span class="tok-p">((</span><span class="tok-nf">curried+</span> <span class="tok-mi">1</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-mi">3</span><span class="tok-p">)</span> <span class="tok-mi">6</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; true</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Curried functions are very useful in combination with the applicative&#8217;s
+<code>fapply</code> operation, since we can curry a function and use applicatives for
+building up results with context-specific effects.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">just</span> <span class="tok-nv">nothing</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">curried+</span> <span class="tok-p">(</span><span class="tok-nf">m/curry</span> <span class="tok-mi">3</span> <span class="tok-nv">+</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fapply</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-nv">curried+</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fapply</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-nv">curried+</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">nothing</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Nothing&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fapply</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-nv">curried+</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-nv">nil</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; nil</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/fapply</span> <span class="tok-p">(</span><span class="tok-nf">m/fmap</span> <span class="tok-nv">curried+</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">))</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">m/&lt;*&gt;</span> <span class="tok-p">(</span><span class="tok-nf">m/&lt;$&gt;</span> <span class="tok-nv">curried+</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">))</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="lift-m"><a class="link" href="#lift-m">lift-m</a></h3>
+<div class="paragraph">
+<p>The <code>lift-m</code> macro is a combinator for promoting functions that work on
+regular values to work on monadic values instead. It uses the monad&#8217;s bind
+operation under the hood and, like <code>curry</code>, can be used without specifying arity
+if the function we are lifting has a fixed and a single arity:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">just</span> <span class="tok-nv">nothing</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">add</span> <span class="tok-p">[</span><span class="tok-nv">a</span> <span class="tok-nv">b</span> <span class="tok-nv">c</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">a</span> <span class="tok-nv">b</span> <span class="tok-nv">c</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">add-m</span> <span class="tok-p">(</span><span class="tok-nf">m/lift-m</span> <span class="tok-nv">add</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">nothing</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">; =&gt; #&lt;Nothing&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-nv">nil</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; nil</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Like with <code>curry</code>, we must provide an arity in case we are lifting a function
+that has multiple arities or is variadic:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">just</span> <span class="tok-nv">nothing</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">add-m</span> <span class="tok-p">(</span><span class="tok-nf">m/lift-m</span> <span class="tok-mi">3</span> <span class="tok-nv">+</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">nothing</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">; =&gt; #&lt;Nothing&gt;</span>
+
+<span class="tok-p">(</span><span class="tok-nf">add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-nv">nil</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; nil</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that you can combine both <code>curry</code> and <code>lift-m</code> to get curried functions
+that work on monadic types using the <code>curry-lift-m</code> macro. The arity is
+mandatory when using this macro:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.monad.maybe</span> <span class="tok-ss">:refer</span> <span class="tok-p">[</span><span class="tok-nv">just</span> <span class="tok-nv">nothing</span><span class="tok-p">]])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">curried-add-m</span> <span class="tok-p">(</span><span class="tok-nf">m/curry-lift-m</span> <span class="tok-mi">3</span> <span class="tok-nv">+</span><span class="tok-p">))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">curried-add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">((</span><span class="tok-nf">curried-add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">))</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span>
+
+<span class="tok-p">((</span><span class="tok-nf">curried-add-m</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">1</span><span class="tok-p">)</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">2</span><span class="tok-p">))</span> <span class="tok-p">(</span><span class="tok-nf">just</span> <span class="tok-mi">3</span><span class="tok-p">))</span>
+<span class="tok-c1">;; =&gt; #&lt;Just 6&gt;</span></code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="labs"><a class="link" href="#labs">Labs</a></h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This section intends to explain different kind of extra features that can be
+found under <strong>cats.labs</strong> namespace. The fact that they are here because they
+are experimental, requires external dependencies or simply does not have much
+application in clojure(script).</p>
+</div>
+<div class="paragraph">
+<p>In any case the state of each module will be notified on the start of the
+each section.</p>
+</div>
+<div class="sect2">
+<h3 id="test-check"><a class="link" href="#test-check">test.check</a></h3>
+<div class="paragraph">
+<p><strong>Status:</strong> Experimental</p>
+</div>
+<div class="paragraph">
+<p>The <code>cats.labs.test</code> namespace implements monad and applicative instances for
+generators, which lets you use the <code>cats.core/alet</code> and <code>cats.core/mlet</code> macros
+for writing generators:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.core</span> <span class="tok-ss">:as</span> <span class="tok-nv">m</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.labs.test</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">clojure.test.check.generators</span> <span class="tok-ss">:as</span> <span class="tok-nv">gen</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">color</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">r</span> <span class="tok-nv">gen/int</span>
+           <span class="tok-nv">g</span> <span class="tok-nv">gen/int</span>
+           <span class="tok-nv">b</span> <span class="tok-nv">gen/int</span><span class="tok-p">]</span>
+    <span class="tok-p">[</span><span class="tok-nv">r</span> <span class="tok-nv">g</span> <span class="tok-nv">b</span><span class="tok-p">]))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">gen/sample</span> <span class="tok-nv">color</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; ([0 0 0])</span>
+
+<span class="tok-p">(</span><span class="tok-k">def </span><span class="tok-nv">mcolor</span>
+  <span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">r</span> <span class="tok-nv">gen/int</span>
+           <span class="tok-nv">g</span> <span class="tok-nv">gen/int</span>
+           <span class="tok-nv">b</span> <span class="tok-nv">gen/int</span><span class="tok-p">]</span>
+    <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">[</span><span class="tok-nv">r</span> <span class="tok-nv">g</span> <span class="tok-nv">b</span><span class="tok-p">])))</span>
+
+<span class="tok-p">(</span><span class="tok-nf">gen/sample</span> <span class="tok-nv">mcolor</span> <span class="tok-mi">1</span><span class="tok-p">)</span>
+<span class="tok-c1">;; =&gt; ([0 0 0])</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Apart from that, the namespace contains multiple functions for generating test.check
+properties that verify the laws of Semigroup, Monoid, Functor, Applicative, Monad,
+MonadZero and MonadPlus.</p>
+</div>
+<div class="paragraph">
+<p>The implementation of cats' abstractions are tested using generative testing and
+the <code>cats.labs.test</code> property generation functions.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="channel"><a class="link" href="#channel">Channel</a></h3>
+<div class="paragraph">
+<p><strong>Status:</strong> Experimental</p>
+</div>
+<div class="paragraph">
+<p>This namespace exposes the ability to use the <strong>core.async</strong> channel as monadic
+type and in consequence use it in <code>mlet</code> or <code>alet</code> macros.</p>
+</div>
+<div class="paragraph">
+<p>Before use it, you should add core.async to your dependencies:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">[</span><span class="tok-nv">org.clojure/core.async</span> <span class="tok-s">&quot;0.2.385&quot;</span><span class="tok-p">]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, let see some code. This will allow you understand how it can be used and
+why this integration between cats and core.async matters. At first step we will
+go to define a function that emulates whatever asynchronous task, that for
+our case it&#8217;s consist in a just sleep operation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">clojure.core.async</span> <span class="tok-ss">:as</span> <span class="tok-nv">a</span><span class="tok-p">])</span>
+<span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.labs.channel</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">async-call</span>
+  <span class="tok-s">&quot;A function that emulates some asynchronous call.&quot;</span>
+  <span class="tok-p">[</span><span class="tok-nv">n</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">a/go</span>
+    <span class="tok-p">(</span><span class="tok-nb">println </span><span class="tok-s">&quot;---&gt; sending request&quot;</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">a/&lt;!</span> <span class="tok-p">(</span><span class="tok-nf">a/timeout</span> <span class="tok-nv">n</span><span class="tok-p">))</span>
+    <span class="tok-p">(</span><span class="tok-nb">println </span><span class="tok-s">&quot;&lt;--- receiving request&quot;</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-nv">n</span><span class="tok-p">))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, instead of using the <code>go</code> macro, just use a <code>let</code> like bindings with the
+help of the <strong>mlet</strong> macro for bind values to asyncrhonous calls:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-p">(</span><span class="tok-nf">&lt;!!</span> <span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">200</span><span class="tok-p">)</span>
+               <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)]</span>
+        <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))))</span>
+<span class="tok-c1">;; ---&gt; sending request 200</span>
+<span class="tok-c1">;; &lt;--- receiving request 200</span>
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &quot;Elapsed time: 302.236804 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 300</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here we can observe few things:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The asynchronous calls are made serially.</p>
+</li>
+<li>
+<p>We are calling a function that return a channel and bind its value to a symbol.</p>
+</li>
+<li>
+<p>At the end, an operation is performed with the <code>mlet</code> bindings.</p>
+</li>
+<li>
+<p>The <code>mlet</code> macro also returns a channel.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The main difference with the default clojure <code>let</code>, is that the bindings
+are already plain values (not channels). The take! operation is already
+performed automatically by the <code>mlet</code>. This kind of behavior will make you
+fully asynchronous code looks like synchronous code.</p>
+</div>
+<div class="paragraph">
+<p>But, cats also comes with <code>alet</code> that has identical aspect to the previously
+used <code>mlet</code> macro, but it has some advantages over it. Let see an example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+  <span class="tok-p">(</span><span class="tok-nf">a/&lt;!!</span> <span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)</span>
+                  <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)]</span>
+            <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))))</span>
+
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &quot;Elapsed time: 101.06644 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 200</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And here we can observe few things:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The asynchronous calls are made in parallel.</p>
+</li>
+<li>
+<p>The total time of processing is half less of if we use <code>mlet</code>.</p>
+</li>
+<li>
+<p>The <code>return</code> function is not used because <code>alet</code> evaluates the body in the context
+of the applicative.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The alet is a powerful macro that analyzes the dependencies between bindings
+and executes the expressions in batches resultin in a very atractive feature
+for asynchronous calls.</p>
+</div>
+<div class="paragraph">
+<p>Here an other examples that shows in a clearly way how the batches are executed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+ <span class="tok-p">(</span><span class="tok-nf">a/&lt;!!</span> <span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">120</span><span class="tok-p">)</span>
+                 <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">130</span><span class="tok-p">)</span>
+                 <span class="tok-nv">z</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-p">(</span><span class="tok-nb">- </span><span class="tok-nv">x</span> <span class="tok-mi">100</span><span class="tok-p">))</span>
+                 <span class="tok-nv">u</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-p">(</span><span class="tok-nb">- </span><span class="tok-nv">y</span> <span class="tok-mi">100</span><span class="tok-p">))</span>
+                 <span class="tok-nv">t</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-p">(</span><span class="tok-nb">inc </span><span class="tok-nv">u</span><span class="tok-p">))]</span>
+          <span class="tok-nv">z</span><span class="tok-p">))))</span>
+<span class="tok-c1">;; ---&gt; sending request  130</span>
+<span class="tok-c1">;; ---&gt; sending request  120</span>
+<span class="tok-c1">;; &lt;--- receiving request  120</span>
+<span class="tok-c1">;; &lt;--- receiving request  130</span>
+<span class="tok-c1">;; ---&gt; sending request  20</span>
+<span class="tok-c1">;; ---&gt; sending request  30</span>
+<span class="tok-c1">;; &lt;--- receiving request  20</span>
+<span class="tok-c1">;; &lt;--- receiving request  30</span>
+<span class="tok-c1">;; ---&gt; sending request  31</span>
+<span class="tok-c1">;; &lt;--- receiving request  31</span>
+<span class="tok-c1">;; &quot;Elapsed time: 194.536235 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 20</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="manifold-deferred"><a class="link" href="#manifold-deferred">Manifold Deferred</a></h3>
+<div class="paragraph">
+<p><strong>Status:</strong> Experimental</p>
+</div>
+<div class="paragraph">
+<p>This namespace exposes the ability to use the <strong>manifold</strong> deferred as monadic
+type and in consequence use it in <code>mlet</code> or <code>alet</code> macros.</p>
+</div>
+<div class="paragraph">
+<p>Before use it, you should add manifold to your dependencies:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">[</span><span class="tok-nv">manifold</span> <span class="tok-s">&quot;0.1.1&quot;</span><span class="tok-p">]</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, let see some code. This will allow you understand how it can be used
+and why this integration between cats and manifold matters. At first step we
+will go to define a function that emulates whatever asynchronous task, that for
+our case it&#8217;s consist in a just sleep operation:</p>
+</div>
+<div class="paragraph">
+<p>For demostration purposes, let&#8217;s define a function that emulates the asyncrhonous
+call:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">require</span> <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">cats.labs.manifold</span> <span class="tok-ss">:as</span> <span class="tok-nv">mf</span><span class="tok-p">]</span>
+         <span class="tok-o">&#39;</span><span class="tok-p">[</span><span class="tok-nv">manifold.deferred</span> <span class="tok-ss">:as</span> <span class="tok-nv">d</span><span class="tok-p">])</span>
+
+<span class="tok-p">(</span><span class="tok-kd">defn </span><span class="tok-nv">async-call</span>
+  <span class="tok-s">&quot;A function that emulates some asynchronous call.&quot;</span>
+  <span class="tok-p">[</span><span class="tok-nv">n</span><span class="tok-p">]</span>
+  <span class="tok-p">(</span><span class="tok-nf">d/future</span>
+    <span class="tok-p">(</span><span class="tok-nb">println </span><span class="tok-s">&quot;---&gt; sending request&quot;</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nf">Thread/sleep</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-p">(</span><span class="tok-nb">println </span><span class="tok-s">&quot;&lt;--- receiving request&quot;</span> <span class="tok-nv">n</span><span class="tok-p">)</span>
+    <span class="tok-nv">n</span><span class="tok-p">))</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now, the manifold deferreds can participate in the monad/applicative abstractions
+using <code>mlet</code> and <code>alet</code> respectivelly.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using manifold deferred with <code>mlet</code>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+  <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/mlet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">200</span><span class="tok-p">)</span>
+            <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)]</span>
+     <span class="tok-p">(</span><span class="tok-nf">m/return</span> <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))))</span>
+<span class="tok-c1">;; ---&gt; sending request 200</span>
+<span class="tok-c1">;; &lt;--- receiving request 200</span>
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &quot;Elapsed time: 302.236804 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 200</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you are familiar with manifold&#8217;s <code>let-flow</code> macro, the cats <code>alet</code> serves
+for almost identical purpose, with difference that <code>alet</code> is defined as
+generic abstraction instread of a specific purpose macro.</p>
+</div>
+<div class="listingblock">
+<div class="title">Example using manifold deferred with <code>alet</code>.</div>
+<div class="content">
+<pre class="pygments highlight"><code data-lang="clojure"><span></span><span class="tok-p">(</span><span class="tok-nf">time</span>
+  <span class="tok-o">@</span><span class="tok-p">(</span><span class="tok-nf">m/alet</span> <span class="tok-p">[</span><span class="tok-nv">x</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)</span>
+            <span class="tok-nv">y</span> <span class="tok-p">(</span><span class="tok-nf">async-call</span> <span class="tok-mi">100</span><span class="tok-p">)]</span>
+     <span class="tok-p">(</span><span class="tok-nb">+ </span><span class="tok-nv">x</span> <span class="tok-nv">y</span><span class="tok-p">)))))</span>
+
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; ---&gt; sending request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &lt;--- receiving request 100</span>
+<span class="tok-c1">;; &quot;Elapsed time: 101.06644 msecs&quot;</span>
+<span class="tok-c1">;; =&gt; 200</span></code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="complementary-libraries"><a class="link" href="#complementary-libraries">Complementary libraries</a></h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p>Promise monad: <a href="https://github.com/funcool/promesa" class="bare">https://github.com/funcool/promesa</a></p>
+</li>
+<li>
+<p>Concurrent data fetching: <a href="https://github.com/funcool/urania" class="bare">https://github.com/funcool/urania</a></p>
+</li>
+<li>
+<p>Pattern matching for the Cats' types: <a href="https://github.com/zalando/cats.match" class="bare">https://github.com/zalando/cats.match</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="faq"><a class="link" href="#faq">FAQ</a></h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="what-clojure-types-implement-some-of-the-category-theory-abstractions"><a class="link" href="#what-clojure-types-implement-some-of-the-category-theory-abstractions">What Clojure types implement some of the Category Theory abstractions?</a></h3>
+<div class="paragraph">
+<p>In contrast to other similar libraries in Clojure, <em>cats</em> doesn&#8217;t intend to
+extend Clojure types that don&#8217;t act like containers. For example, Clojure
+keywords are values but can not be containers so they should not extend any of
+the previously explained protocols.</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<caption class="title">Table 1. Summary of Clojure types and implemented protocols</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Name</th>
+<th class="tableblock halign-left valign-top">Implemented protocols</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sequence</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus, Foldable</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">vector</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus, Foldable</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">hash-set</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Semigroup, Monoid, Functor, Applicative, Monad, MonadZero, MonadPlus</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">hash-map</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Semigroup, Monoid</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">function</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Semigroup, Monoid, Functor, Applicative, Monad</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="developers-guide"><a class="link" href="#developers-guide">Developers Guide</a></h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="philosophy"><a class="link" href="#philosophy">Philosophy</a></h3>
+<div class="paragraph">
+<p>Five most important rules:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Beautiful is better than ugly.</p>
+</li>
+<li>
+<p>Explicit is better than implicit.</p>
+</li>
+<li>
+<p>Simple is better than complex.</p>
+</li>
+<li>
+<p>Complex is better than complicated.</p>
+</li>
+<li>
+<p>Readability counts.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>All contributions to <em>cats</em> should keep these important rules in mind.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="contributing"><a class="link" href="#contributing">Contributing</a></h3>
+<div class="paragraph">
+<p>Unlike Clojure and other Clojure contributed libraries, <em>cats</em> does not have many
+restrictions for contributions. Just open an issue or pull request.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="editor-integration"><a class="link" href="#editor-integration">Editor integration</a></h3>
+<div class="paragraph">
+<p>For making Emacs' clojure-mode treat <code>alet</code>, <code>mlet</code> et al like a <code>let</code> and indent
+them correctly, you can use <code>define-clojure-indent</code> like in the following example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="elisp"><span></span><span class="tok-p">(</span><span class="tok-nb">require</span> <span class="tok-ss">&#39;clojure-mode</span><span class="tok-p">)</span>
+
+<span class="tok-p">(</span><span class="tok-nv">define-clojure-indent</span>
+  <span class="tok-p">(</span><span class="tok-nv">alet</span> <span class="tok-ss">&#39;defun</span><span class="tok-p">)</span>
+  <span class="tok-p">(</span><span class="tok-nv">mlet</span> <span class="tok-ss">&#39;defun</span><span class="tok-p">))</span></code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="source-code"><a class="link" href="#source-code">Source Code</a></h3>
+<div class="paragraph">
+<p><em>cats</em> is open source and can be found on
+<a href="https://github.com/funcool/cats">github</a>.</p>
+</div>
+<div class="paragraph">
+<p>You can clone the public repository with this command:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>git clone https://github.com/funcool/cats</code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="run-tests"><a class="link" href="#run-tests">Run tests</a></h3>
+<div class="paragraph">
+<p>For running tests just execute this for clojure:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>lein test</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And this for clojurescript:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>./scripts/build
+node ./out/tests.js</code></pre>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="license"><a class="link" href="#license">License</a></h3>
+<div class="listingblock">
+<div class="content">
+<pre class="pygments highlight"><code data-lang="text"><span></span>Copyright (c) 2014-2016 Andrey Antukh &lt;niwi@niwi.nz&gt;
+Copyright (c) 2014-2016 Alejandro Gómez &lt;alejandro@dialelo.com&gt;
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2018-01-11 09:53:43 CET
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/logo/logo.png b/latest/logo.png
similarity index 100%
rename from logo/logo.png
rename to latest/logo.png
diff --git a/logo/LICENSE.original.txt b/logo/LICENSE.original.txt
deleted file mode 100644
index 7cb547c..0000000
--- a/logo/LICENSE.original.txt
+++ /dev/null
@@ -1,322 +0,0 @@
-Original Icon made by Freepik.com from http://www.flaticon.com/free-icon/maneki-neko_13166
-(CC BY 3.0)
-
-Creative Commons Legal Code
-
-Attribution 3.0 Unported
-
-    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
-    LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
-    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
-    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
-    REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
-    DAMAGES RESULTING FROM ITS USE.
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-CONDITIONS.
-
-1. Definitions
-
- a. "Adaptation" means a work based upon the Work, or upon the Work and
-    other pre-existing works, such as a translation, adaptation,
-    derivative work, arrangement of music or other alterations of a
-    literary or artistic work, or phonogram or performance and includes
-    cinematographic adaptations or any other form in which the Work may be
-    recast, transformed, or adapted including in any form recognizably
-    derived from the original, except that a work that constitutes a
-    Collection will not be considered an Adaptation for the purpose of
-    this License. For the avoidance of doubt, where the Work is a musical
-    work, performance or phonogram, the synchronization of the Work in
-    timed-relation with a moving image ("synching") will be considered an
-    Adaptation for the purpose of this License.
- b. "Collection" means a collection of literary or artistic works, such as
-    encyclopedias and anthologies, or performances, phonograms or
-    broadcasts, or other works or subject matter other than works listed
-    in Section 1(f) below, which, by reason of the selection and
-    arrangement of their contents, constitute intellectual creations, in
-    which the Work is included in its entirety in unmodified form along
-    with one or more other contributions, each constituting separate and
-    independent works in themselves, which together are assembled into a
-    collective whole. A work that constitutes a Collection will not be
-    considered an Adaptation (as defined above) for the purposes of this
-    License.
- c. "Distribute" means to make available to the public the original and
-    copies of the Work or Adaptation, as appropriate, through sale or
-    other transfer of ownership.
- d. "Licensor" means the individual, individuals, entity or entities that
-    offer(s) the Work under the terms of this License.
- e. "Original Author" means, in the case of a literary or artistic work,
-    the individual, individuals, entity or entities who created the Work
-    or if no individual or entity can be identified, the publisher; and in
-    addition (i) in the case of a performance the actors, singers,
-    musicians, dancers, and other persons who act, sing, deliver, declaim,
-    play in, interpret or otherwise perform literary or artistic works or
-    expressions of folklore; (ii) in the case of a phonogram the producer
-    being the person or legal entity who first fixes the sounds of a
-    performance or other sounds; and, (iii) in the case of broadcasts, the
-    organization that transmits the broadcast.
- f. "Work" means the literary and/or artistic work offered under the terms
-    of this License including without limitation any production in the
-    literary, scientific and artistic domain, whatever may be the mode or
-    form of its expression including digital form, such as a book,
-    pamphlet and other writing; a lecture, address, sermon or other work
-    of the same nature; a dramatic or dramatico-musical work; a
-    choreographic work or entertainment in dumb show; a musical
-    composition with or without words; a cinematographic work to which are
-    assimilated works expressed by a process analogous to cinematography;
-    a work of drawing, painting, architecture, sculpture, engraving or
-    lithography; a photographic work to which are assimilated works
-    expressed by a process analogous to photography; a work of applied
-    art; an illustration, map, plan, sketch or three-dimensional work
-    relative to geography, topography, architecture or science; a
-    performance; a broadcast; a phonogram; a compilation of data to the
-    extent it is protected as a copyrightable work; or a work performed by
-    a variety or circus performer to the extent it is not otherwise
-    considered a literary or artistic work.
- g. "You" means an individual or entity exercising rights under this
-    License who has not previously violated the terms of this License with
-    respect to the Work, or who has received express permission from the
-    Licensor to exercise rights under this License despite a previous
-    violation.
- h. "Publicly Perform" means to perform public recitations of the Work and
-    to communicate to the public those public recitations, by any means or
-    process, including by wire or wireless means or public digital
-    performances; to make available to the public Works in such a way that
-    members of the public may access these Works from a place and at a
-    place individually chosen by them; to perform the Work to the public
-    by any means or process and the communication to the public of the
-    performances of the Work, including by public digital performance; to
-    broadcast and rebroadcast the Work by any means including signs,
-    sounds or images.
- i. "Reproduce" means to make copies of the Work by any means including
-    without limitation by sound or visual recordings and the right of
-    fixation and reproducing fixations of the Work, including storage of a
-    protected performance or phonogram in digital form or other electronic
-    medium.
-
-2. Fair Dealing Rights. Nothing in this License is intended to reduce,
-limit, or restrict any uses free from copyright or rights arising from
-limitations or exceptions that are provided for in connection with the
-copyright protection under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License,
-Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-perpetual (for the duration of the applicable copyright) license to
-exercise the rights in the Work as stated below:
-
- a. to Reproduce the Work, to incorporate the Work into one or more
-    Collections, and to Reproduce the Work as incorporated in the
-    Collections;
- b. to create and Reproduce Adaptations provided that any such Adaptation,
-    including any translation in any medium, takes reasonable steps to
-    clearly label, demarcate or otherwise identify that changes were made
-    to the original Work. For example, a translation could be marked "The
-    original work was translated from English to Spanish," or a
-    modification could indicate "The original work has been modified.";
- c. to Distribute and Publicly Perform the Work including as incorporated
-    in Collections; and,
- d. to Distribute and Publicly Perform Adaptations.
- e. For the avoidance of doubt:
-
-     i. Non-waivable Compulsory License Schemes. In those jurisdictions in
-        which the right to collect royalties through any statutory or
-        compulsory licensing scheme cannot be waived, the Licensor
-        reserves the exclusive right to collect such royalties for any
-        exercise by You of the rights granted under this License;
-    ii. Waivable Compulsory License Schemes. In those jurisdictions in
-        which the right to collect royalties through any statutory or
-        compulsory licensing scheme can be waived, the Licensor waives the
-        exclusive right to collect such royalties for any exercise by You
-        of the rights granted under this License; and,
-   iii. Voluntary License Schemes. The Licensor waives the right to
-        collect royalties, whether individually or, in the event that the
-        Licensor is a member of a collecting society that administers
-        voluntary licensing schemes, via that society, from any exercise
-        by You of the rights granted under this License.
-
-The above rights may be exercised in all media and formats whether now
-known or hereafter devised. The above rights include the right to make
-such modifications as are technically necessary to exercise the rights in
-other media and formats. Subject to Section 8(f), all rights not expressly
-granted by Licensor are hereby reserved.
-
-4. Restrictions. The license granted in Section 3 above is expressly made
-subject to and limited by the following restrictions:
-
- a. You may Distribute or Publicly Perform the Work only under the terms
-    of this License. You must include a copy of, or the Uniform Resource
-    Identifier (URI) for, this License with every copy of the Work You
-    Distribute or Publicly Perform. You may not offer or impose any terms
-    on the Work that restrict the terms of this License or the ability of
-    the recipient of the Work to exercise the rights granted to that
-    recipient under the terms of the License. You may not sublicense the
-    Work. You must keep intact all notices that refer to this License and
-    to the disclaimer of warranties with every copy of the Work You
-    Distribute or Publicly Perform. When You Distribute or Publicly
-    Perform the Work, You may not impose any effective technological
-    measures on the Work that restrict the ability of a recipient of the
-    Work from You to exercise the rights granted to that recipient under
-    the terms of the License. This Section 4(a) applies to the Work as
-    incorporated in a Collection, but this does not require the Collection
-    apart from the Work itself to be made subject to the terms of this
-    License. If You create a Collection, upon notice from any Licensor You
-    must, to the extent practicable, remove from the Collection any credit
-    as required by Section 4(b), as requested. If You create an
-    Adaptation, upon notice from any Licensor You must, to the extent
-    practicable, remove from the Adaptation any credit as required by
-    Section 4(b), as requested.
- b. If You Distribute, or Publicly Perform the Work or any Adaptations or
-    Collections, You must, unless a request has been made pursuant to
-    Section 4(a), keep intact all copyright notices for the Work and
-    provide, reasonable to the medium or means You are utilizing: (i) the
-    name of the Original Author (or pseudonym, if applicable) if supplied,
-    and/or if the Original Author and/or Licensor designate another party
-    or parties (e.g., a sponsor institute, publishing entity, journal) for
-    attribution ("Attribution Parties") in Licensor's copyright notice,
-    terms of service or by other reasonable means, the name of such party
-    or parties; (ii) the title of the Work if supplied; (iii) to the
-    extent reasonably practicable, the URI, if any, that Licensor
-    specifies to be associated with the Work, unless such URI does not
-    refer to the copyright notice or licensing information for the Work;
-    and (iv) , consistent with Section 3(b), in the case of an Adaptation,
-    a credit identifying the use of the Work in the Adaptation (e.g.,
-    "French translation of the Work by Original Author," or "Screenplay
-    based on original Work by Original Author"). The credit required by
-    this Section 4 (b) may be implemented in any reasonable manner;
-    provided, however, that in the case of a Adaptation or Collection, at
-    a minimum such credit will appear, if a credit for all contributing
-    authors of the Adaptation or Collection appears, then as part of these
-    credits and in a manner at least as prominent as the credits for the
-    other contributing authors. For the avoidance of doubt, You may only
-    use the credit required by this Section for the purpose of attribution
-    in the manner set out above and, by exercising Your rights under this
-    License, You may not implicitly or explicitly assert or imply any
-    connection with, sponsorship or endorsement by the Original Author,
-    Licensor and/or Attribution Parties, as appropriate, of You or Your
-    use of the Work, without the separate, express prior written
-    permission of the Original Author, Licensor and/or Attribution
-    Parties.
- c. Except as otherwise agreed in writing by the Licensor or as may be
-    otherwise permitted by applicable law, if You Reproduce, Distribute or
-    Publicly Perform the Work either by itself or as part of any
-    Adaptations or Collections, You must not distort, mutilate, modify or
-    take other derogatory action in relation to the Work which would be
-    prejudicial to the Original Author's honor or reputation. Licensor
-    agrees that in those jurisdictions (e.g. Japan), in which any exercise
-    of the right granted in Section 3(b) of this License (the right to
-    make Adaptations) would be deemed to be a distortion, mutilation,
-    modification or other derogatory action prejudicial to the Original
-    Author's honor and reputation, the Licensor will waive or not assert,
-    as appropriate, this Section, to the fullest extent permitted by the
-    applicable national law, to enable You to reasonably exercise Your
-    right under Section 3(b) of this License (right to make Adaptations)
-    but not otherwise.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
-OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
-LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
-ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
-ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
-BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
- a. This License and the rights granted hereunder will terminate
-    automatically upon any breach by You of the terms of this License.
-    Individuals or entities who have received Adaptations or Collections
-    from You under this License, however, will not have their licenses
-    terminated provided such individuals or entities remain in full
-    compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-    survive any termination of this License.
- b. Subject to the above terms and conditions, the license granted here is
-    perpetual (for the duration of the applicable copyright in the Work).
-    Notwithstanding the above, Licensor reserves the right to release the
-    Work under different license terms or to stop distributing the Work at
-    any time; provided, however that any such election will not serve to
-    withdraw this License (or any other license that has been, or is
-    required to be, granted under the terms of this License), and this
-    License will continue in full force and effect unless terminated as
-    stated above.
-
-8. Miscellaneous
-
- a. Each time You Distribute or Publicly Perform the Work or a Collection,
-    the Licensor offers to the recipient a license to the Work on the same
-    terms and conditions as the license granted to You under this License.
- b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-    offers to the recipient a license to the original Work on the same
-    terms and conditions as the license granted to You under this License.
- c. If any provision of this License is invalid or unenforceable under
-    applicable law, it shall not affect the validity or enforceability of
-    the remainder of the terms of this License, and without further action
-    by the parties to this agreement, such provision shall be reformed to
-    the minimum extent necessary to make such provision valid and
-    enforceable.
- d. No term or provision of this License shall be deemed waived and no
-    breach consented to unless such waiver or consent shall be in writing
-    and signed by the party to be charged with such waiver or consent.
- e. This License constitutes the entire agreement between the parties with
-    respect to the Work licensed here. There are no understandings,
-    agreements or representations with respect to the Work not specified
-    here. Licensor shall not be bound by any additional provisions that
-    may appear in any communication from You. This License may not be
-    modified without the mutual written agreement of the Licensor and You.
- f. The rights granted under, and the subject matter referenced, in this
-    License were drafted utilizing the terminology of the Berne Convention
-    for the Protection of Literary and Artistic Works (as amended on
-    September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
-    Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
-    and the Universal Copyright Convention (as revised on July 24, 1971).
-    These rights and subject matter take effect in the relevant
-    jurisdiction in which the License terms are sought to be enforced
-    according to the corresponding provisions of the implementation of
-    those treaty provisions in the applicable national law. If the
-    standard suite of rights granted under applicable copyright law
-    includes additional rights not granted under this License, such
-    additional rights are deemed to be included in the License; this
-    License is not intended to restrict the license of any rights under
-    applicable law.
-
-
-Creative Commons Notice
-
-    Creative Commons is not a party to this License, and makes no warranty
-    whatsoever in connection with the Work. Creative Commons will not be
-    liable to You or any party on any legal theory for any damages
-    whatsoever, including without limitation any general, special,
-    incidental or consequential damages arising in connection to this
-    license. Notwithstanding the foregoing two (2) sentences, if Creative
-    Commons has expressly identified itself as the Licensor hereunder, it
-    shall have all rights and obligations of Licensor.
-
-    Except for the limited purpose of indicating to the public that the
-    Work is licensed under the CCPL, Creative Commons does not authorize
-    the use by either party of the trademark "Creative Commons" or any
-    related trademark or logo of Creative Commons without the prior
-    written consent of Creative Commons. Any permitted use will be in
-    compliance with Creative Commons' then-current trademark usage
-    guidelines, as may be published on its website or otherwise made
-    available upon request from time to time. For the avoidance of doubt,
-    this trademark restriction does not form part of this License.
-
-    Creative Commons may be contacted at http://creativecommons.org/.
diff --git a/logo/LICENSE.txt b/logo/LICENSE.txt
deleted file mode 100644
index 96074b8..0000000
--- a/logo/LICENSE.txt
+++ /dev/null
@@ -1 +0,0 @@
-The adaptation of icon is made by Andrey Antukh and Alejandro Gómez with same license as the original.
diff --git a/logo/logo.svg b/logo/logo.svg
deleted file mode 100644
index 58dddea..0000000
--- a/logo/logo.svg
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   id="Capa_1"
-   x="0px"
-   y="0px"
-   width="64px"
-   height="64px"
-   viewBox="0 0 64 64"
-   enable-background="new 0 0 64 64"
-   xml:space="preserve"
-   inkscape:version="0.48.5 r10040"
-   sodipodi:docname="maneki.svg"><metadata
-     id="metadata3071"><rdf:RDF><cc:Work
-         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
-     id="defs3069" /><sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1918"
-     inkscape:window-height="1064"
-     id="namedview3067"
-     showgrid="false"
-     inkscape:zoom="7.660845"
-     inkscape:cx="44.814801"
-     inkscape:cy="23.685754"
-     inkscape:window-x="0"
-     inkscape:window-y="14"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="layer1" /><g
-     id="g3049" /><g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="Cat"
-     style="display:inline"><path
-       inkscape:connector-curvature="0"
-       d="m 49.551334,23.074752 c -0.260285,-0.411908 -0.528152,-0.817499 -0.818763,-1.205401 -0.116244,0.141515 -0.238806,0.291874 -0.386638,0.464977 -0.174366,0.203427 -0.366421,0.42707 -0.574903,0.672194 -3.014766,3.521439 -7.401719,5.201925 -11.818996,6.07502 -0.109927,0.02148 -0.22238,0.03411 -0.33357,0.0518 0.281765,0.53447 0.456132,1.132117 0.456132,1.776514 0,2.117665 -1.722183,3.839847 -3.839848,3.839847 -2.117664,0 -3.839847,-1.722182 -3.839847,-3.839847 0,-0.644397 0.174367,-1.243307 0.457396,-1.777777 -0.11119,-0.01895 -0.223644,-0.03032 -0.33357,-0.0518 C 24.388269,28.636781 20.461239,26.496373 17.450263,23.70146 17.177342,23.448755 16.92211,23.211213 16.687095,22.992623 16.481141,22.75129 16.292876,22.530174 16.1223,22.330537 c -0.03538,-0.0417 -0.05938,-0.07202 -0.0935,-0.112454 -0.08592,0.590066 -0.24765,1.214246 -0.296927,1.555398 -0.401801,2.748163 -0.827608,5.515278 -0.712628,8.301347 0.05307,1.300166 0.216063,2.605385 0.63808,3.841111 0.113717,0.332306 0.242596,0.659559 0.374003,0.986811 0.392955,0.974177 0.812445,1.940772 0.921108,2.997078 0.317144,3.108267 -2.403221,5.891808 -5.483691,5.891808 -1.300165,0 -2.5080931,-0.531943 -3.5315469,-1.339334 -0.5028823,5.827369 0.657032,11.410878 5.3257499,14.920946 0.0025,0 1.297638,0.82129 3.789306,0.82129 1.776514,0 3.723603,-0.429598 5.78441,-1.235726 0.411908,-0.160467 -0.422017,-2.401958 -0.543315,-2.644554 -0.633025,-1.247098 -1.79673,-2.324883 -3.094369,-2.860617 -0.262813,-0.108663 -0.510463,-0.209745 -0.739161,-0.305772 -0.228698,-0.113717 -0.458659,-0.127616 -0.655768,-0.178157 -0.200901,-0.0417 -0.37653,-0.07834 -0.520572,-0.109927 -0.293137,-0.06065 -0.459922,-0.09603 -0.459922,-0.09603 0,0 0.169312,-0.0051 0.46624,-0.01264 0.150359,-0.0038 0.33357,-0.0088 0.543315,-0.0139 0.209745,0.0051 0.456132,-0.03664 0.708836,0.02401 2.907367,0.689883 5.838741,2.24149 6.579166,5.401561 0.04675,0.200901 0.08718,0.377794 0.121298,0.523099 0.01011,0.04296 0.0139,0.06191 0.02274,0.09729 1.896549,0.165522 5.184236,0.424544 6.967067,0.424544 1.202875,0 2.405749,-0.08087 3.604832,-0.162994 0.760641,-0.05181 2.519466,0.18321 3.168916,-0.238806 0.370213,-0.241333 0.338625,-0.7101 0.481403,-1.137171 0.319671,-0.959014 0.875621,-1.871278 1.571823,-2.605385 1.429045,-1.499802 3.505013,-2.377951 5.572137,-2.326146 0.209745,0.0051 0.391692,0.01011 0.543315,0.0139 0.295665,0.0076 0.46624,0.01264 0.46624,0.01264 0,0 -0.168048,0.03538 -0.459922,0.09603 -0.144042,0.03032 -0.319672,0.06823 -0.520572,0.109927 -0.197109,0.0518 -0.427071,0.06444 -0.655768,0.178157 -0.229962,0.09603 -0.478876,0.197109 -0.740425,0.305772 -0.266603,0.08718 -0.518044,0.247651 -0.768222,0.41949 -0.247651,0.17563 -0.526889,0.310827 -0.759378,0.521835 -0.224907,0.213536 -0.449814,0.430862 -0.678511,0.648188 -0.228698,0.207217 -0.367686,0.496564 -0.55216,0.727789 l -0.252705,0.35505 -0.166785,0.392956 c -0.09855,0.256495 -0.240069,0.494037 -0.291874,0.717681 -0.03411,0.224907 -0.07202,0.42328 -0.11119,0.6027 -0.02274,0.08845 -0.0417,0.17184 -0.06191,0.251442 0,0.116244 0,0.227434 0.0025,0.331043 0,0.207217 0,0.387901 0.0025,0.536997 2.060806,0.806128 4.007895,1.235726 5.784409,1.235726 2.508094,0 3.805732,-0.833926 3.817104,-0.844034 11.451311,-8.600802 1.7285,-29.730701 -1.676696,-36.275752 z M 32.230958,53.205991 c -4.510778,0 -8.18005,-3.668008 -8.18005,-8.18005 0,-4.509514 3.670535,-8.180049 8.18005,-8.180049 4.509514,0 8.180049,3.669271 8.180049,8.180049 0,4.512042 -3.670535,8.18005 -8.180049,8.18005 z"
-       id="path3051" /><path
-       inkscape:connector-curvature="0"
-       d="m 16.45208,21.959061 c 0.216062,0.149096 0.456132,0.313354 0.717681,0.492774 0.270394,0.152887 0.562268,0.318408 0.874358,0.495301 5.209506,2.954118 10.980017,4.418541 16.980489,3.799415 1.723445,-0.178157 3.434256,-0.549633 5.08189,-1.087894 2.798704,-0.913527 5.459684,-2.048171 7.904602,-3.703386 0.189528,-0.12888 0.35505,-0.238806 0.510463,-0.341152 -0.707573,-0.902155 -1.485903,-1.747452 -2.415856,-2.481559 -0.86425,-0.681039 -1.748717,-1.341862 -2.394377,-2.244018 -1.782831,-2.491667 -0.972913,-6.086391 1.435362,-7.8490061 -0.02274,-0.04928 -0.04296,-0.09729 -0.0657,-0.146569 -1.545289,-3.432992 -3.41783,-5.431886 -5.051566,-5.431886 -0.630498,0 -1.274895,0.2855563 -1.915501,0.8478241 -1.666587,1.4618959 -3.757718,2.2680239 -5.884228,2.2680239 -2.126509,0 -4.216377,-0.806128 -5.882964,-2.2680239 -0.640609,-0.5622678 -1.285006,-0.8478241 -1.915504,-0.8478241 -1.657742,0 -3.486061,1.948353 -5.014924,5.344703 -1.743662,3.8764901 -3.348336,7.4459431 -3.348336,11.9832551 0,0.104872 -0.03159,0.20469 -0.08087,0.296928 0.06823,0.160467 0.09097,0.371475 0.08213,0.616599 0.123826,0.08213 0.24007,0.160467 0.382848,0.256495 z m 7.507855,-1.460633 c -0.290611,0.137724 -0.68483,0.289347 -1.094211,0.371476 -0.406855,0.08971 -0.828872,0.11119 -1.15107,0.101082 -0.322198,-0.01011 -0.547106,-0.06697 -0.547106,-0.06697 0,0 0.183211,-0.142778 0.473822,-0.281765 0.29061,-0.138988 0.684829,-0.289347 1.094211,-0.371476 0.406854,-0.08971 0.828871,-0.108663 1.151069,-0.101082 0.322199,0.01011 0.547106,0.0657 0.547106,0.0657 0,0 -0.184474,0.144042 -0.473821,0.283029 z m 18.787327,0.472558 c -0.320935,0.01011 -0.742952,-0.01137 -1.149806,-0.101082 -0.409382,-0.08213 -0.804865,-0.235015 -1.094211,-0.371476 -0.289347,-0.138987 -0.473822,-0.280502 -0.473822,-0.280502 0,0 0.226171,-0.0556 0.547106,-0.0657 0.320935,-0.0088 0.745479,0.01137 1.152333,0.101082 0.408118,0.08213 0.802337,0.232488 1.092948,0.371476 0.29061,0.138987 0.473821,0.281765 0.473821,0.281765 0,0 -0.226171,0.05433 -0.548369,0.06444 z m 1.301429,-2.10882 c 0.49151,0.07581 0.817499,0.176893 0.817499,0.176893 0,0 -0.327252,0.101082 -0.817499,0.176893 -0.490247,0.07455 -1.142225,0.142778 -1.797994,0.138988 -0.653241,0.0038 -1.306483,-0.06191 -1.797993,-0.137724 -0.490247,-0.07581 -0.816236,-0.178157 -0.816236,-0.178157 0,0 0.327252,-0.102345 0.816236,-0.178157 0.49151,-0.07581 1.143488,-0.141514 1.797993,-0.137724 0.654505,-0.0038 1.307747,0.06444 1.797994,0.138988 z m -4.413487,-0.977967 c 0,0 0.199637,-0.09982 0.488984,-0.189529 0.289346,-0.08845 0.665876,-0.183211 1.038616,-0.241333 0.372739,-0.06318 0.748005,-0.09224 1.017136,-0.142778 0.131406,-0.02906 0.246387,-0.0518 0.305772,-0.09097 0.07202,-0.02906 0.0935,-0.108663 0.09603,-0.09729 -0.01264,0.0051 0.0417,0.04296 0.01011,0.156677 -0.03411,0.104873 -0.113717,0.250178 -0.251441,0.347469 -0.264076,0.216062 -0.663349,0.387902 -1.073994,0.449814 -0.408118,0.07076 -0.822554,0.03664 -1.128327,-0.02653 -0.304509,-0.06065 -0.502882,-0.165521 -0.502882,-0.165521 z M 37.782879,7.3021919 c 0.395483,-0.702519 1.024717,-1.556661 1.880123,-1.671642 0.814972,-0.108663 1.584458,0.392956 2.079759,0.999447 0.202164,0.246387 0.862986,1.272368 1.095474,1.900339 0.495302,1.3267 -0.772012,0.82129 -1.458105,0.48772 -0.883203,-0.429598 -1.693121,-0.569849 -2.640764,-0.770749 -0.68483,-0.144042 -1.260996,-0.403064 -0.956487,-0.945115 z M 35.945716,14.94019 c 0.523099,-0.746743 1.303956,-1.244571 2.202321,-1.402511 0.895838,-0.162995 1.799257,0.0417 2.547263,0.563531 0.214799,0.150359 0.266603,0.446024 0.117508,0.659559 -0.151623,0.214799 -0.447288,0.266604 -0.659559,0.117508 -1.110637,-0.780857 -2.650872,-0.506673 -3.427939,0.605228 -0.09097,0.131406 -0.238806,0.202163 -0.389165,0.202163 -0.0935,0 -0.188265,-0.02653 -0.271658,-0.08466 -0.217326,-0.151623 -0.26913,-0.447287 -0.118771,-0.660822 z m -6.167257,6.005526 c 0.627971,-0.233752 1.2193,-0.57364 1.704493,-1.037353 0.515518,-0.492774 0.763168,-1.052515 1.028508,-1.696912 0.01516,-0.0417 0.02653,-0.06697 0.03791,-0.09603 -0.576167,-0.02527 -1.038616,-0.521835 -1.038616,-0.818763 0,-0.304509 0.483929,-0.552159 1.081576,-0.552159 0.597646,0 1.081575,0.24765 1.081575,0.552159 0,0.296928 -0.462449,0.793493 -1.038616,0.818763 0.01137,0.02906 0.02274,0.05433 0.03791,0.09603 0.04928,0.118771 0.09476,0.319672 0.192056,0.504146 0.622917,1.178867 1.576877,1.755034 2.738054,2.310984 0,0 -0.07328,0.02022 -0.205954,0.04043 -0.130143,0.0013 -0.336097,0.08086 -0.566058,0.03285 -0.228698,-0.04422 -0.523099,-0.05686 -0.789702,-0.20469 -0.645661,-0.358841 -1.286267,-0.951433 -1.449261,-1.700703 0.06823,0.310827 -0.422017,0.900892 -0.610282,1.106847 -0.457396,0.500355 -0.985548,0.675985 -1.628682,0.798546 -0.231224,0.04801 -0.437179,-0.03159 -0.566058,-0.03285 -0.133933,-0.02022 -0.205954,-0.04043 -0.205954,-0.04043 0,0 0.07328,-0.03411 0.197109,-0.08086 z M 28.497247,14.94019 c 0.149095,0.213535 0.09729,0.509199 -0.117508,0.659559 -0.08213,0.05686 -0.178157,0.08466 -0.271657,0.08466 -0.149096,0 -0.295665,-0.07076 -0.389166,-0.202164 -0.777066,-1.1119 -2.313511,-1.386085 -3.427938,-0.605228 -0.214799,0.146569 -0.507936,0.09855 -0.659559,-0.117507 -0.149096,-0.214799 -0.09729,-0.5092 0.117507,-0.659559 0.745479,-0.523099 1.648898,-0.726526 2.547263,-0.563532 0.897102,0.157941 1.677959,0.657032 2.201058,1.403775 z m -3.671799,2.944009 c 0,0 -0.197109,0.104872 -0.502882,0.165521 -0.304509,0.06191 -0.718945,0.09729 -1.127063,0.02653 -0.408118,-0.06191 -0.809918,-0.233752 -1.073994,-0.449814 -0.137725,-0.09729 -0.217326,-0.242596 -0.252705,-0.347469 -0.03285,-0.113717 0.02274,-0.151623 0.01011,-0.156677 0.0038,-0.01011 0.02527,0.06823 0.09729,0.09729 0.05939,0.03917 0.174367,0.06191 0.305773,0.09097 0.267867,0.05054 0.643133,0.0796 1.015873,0.142778 0.374003,0.05812 0.750532,0.152887 1.039879,0.241333 0.289347,0.09097 0.48772,0.189529 0.48772,0.189529 z M 21.62368,8.5303359 c 0.235016,-0.627971 0.893311,-1.653952 1.095475,-1.900339 0.496565,-0.606491 1.267314,-1.10811 2.081023,-0.999447 0.856669,0.114981 1.48464,0.967859 1.880122,1.671642 0.304509,0.542051 -0.270394,0.79981 -0.95775,0.945115 -0.947643,0.2009 -1.757561,0.341151 -2.642027,0.770749 -0.68483,0.334834 -1.952144,0.83898 -1.456843,-0.48772 z M 20.413225,18.862166 c 0.490247,-0.07455 1.143489,-0.141515 1.797994,-0.138988 0.653241,-0.0038 1.307746,0.06191 1.797993,0.137724 0.490247,0.07581 0.8175,0.178157 0.8175,0.178157 0,0 -0.327253,0.101082 -0.8175,0.178157 -0.490247,0.07581 -1.143488,0.141514 -1.797993,0.137724 -0.653242,0.0038 -1.307747,-0.06444 -1.797994,-0.138988 -0.490247,-0.07581 -0.817499,-0.176893 -0.817499,-0.176893 0,0 0.327252,-0.101082 0.817499,-0.176893 z"
-       id="path3059" /><path
-       inkscape:connector-curvature="0"
-       d="m 44.691824,16.186023 c 1.423991,1.991313 3.741292,3.19166 5.196871,5.195608 1.97615,2.724156 3.310431,6.015634 4.445075,9.168125 0.07834,0.216062 0.155413,0.430861 0.231225,0.651978 0.02148,0.05938 0.0417,0.130143 0.07076,0.221116 0.03917,0.121298 0.131406,0.184475 0.170576,0.109927 0.02274,-0.03917 0.04422,-0.08718 0.06444,-0.138988 0.03411,-0.08845 0.06949,-0.181947 0.106136,-0.283029 0.03664,-0.102345 0.06949,-0.193319 0.09729,-0.266603 0.413173,-1.075259 0.716418,-2.347627 0.952697,-4.002842 0.13646,-0.961541 0.223644,-1.930664 0.289347,-2.751954 0.193319,-2.413329 0.343678,-5.965093 -0.596383,-8.930582 -0.529416,-1.672905 -1.619837,-3.368553 -2.777224,-4.317459 -2.016583,-1.6552151 -5.095789,-2.3779511 -7.203346,-0.615336 -1.747453,1.473268 -2.46387,3.982626 -1.047461,5.960039 z"
-       id="path3061" /><path
-       inkscape:connector-curvature="0"
-       d="m 32.230958,28.333536 c -0.808655,0 -1.521282,0.381584 -1.995103,0.966595 -0.357577,0.442233 -0.582484,0.998183 -0.582484,1.609729 0,1.4202 1.156123,2.576324 2.576323,2.576324 1.420201,0 2.576324,-1.156124 2.576324,-2.576324 0,-0.611546 -0.223643,-1.166232 -0.58122,-1.608465 -0.471295,-0.585012 -1.185185,-0.967859 -1.99384,-0.967859 z"
-       id="path3063" /><path
-       inkscape:connector-curvature="0"
-       d="m 11.46369,44.52685 c 1.175077,0 2.328673,-0.533207 3.167653,-1.461897 0.793492,-0.876885 1.168759,-1.957197 1.058832,-3.038773 -0.08086,-0.793493 -0.4018,-1.584458 -0.742951,-2.422174 l -0.0935,-0.229961 c -0.140251,-0.348733 -0.277975,-0.697465 -0.39801,-1.051252 -0.411909,-1.210455 -0.636816,-2.543472 -0.703782,-4.197424 -0.112454,-2.740582 0.272921,-5.441994 0.655768,-8.058751 0.0076,-0.05307 0.01516,-0.106136 0.02274,-0.159204 l 0.04675,-0.318408 c 0.02401,-0.168048 0.07202,-0.396746 0.128879,-0.657032 0.0088,-0.03791 0.01769,-0.08213 0.0278,-0.130143 0.01516,-0.07202 -0.07329,-0.05812 -0.193319,0.03917 -0.07202,0.05812 -0.144042,0.118772 -0.216063,0.178157 -0.463713,0.381584 -0.914791,0.814973 -1.350706,1.285003 -1.070204,1.153597 -2.049434,2.500513 -2.874515,3.705914 -1.3001654,1.901602 -3.1019496,4.763483 -3.7248665,7.650633 -0.3499959,1.619837 -0.2514411,3.516385 0.2514411,4.832976 0.1301429,0.339888 0.3032456,0.675985 0.4965646,1.007028 0.1528864,0.262813 0.3247255,0.516781 0.5129905,0.763169 0.1756297,0.229961 0.3638947,0.446023 0.5660584,0.653241 0.9198449,0.940061 2.0898679,1.609729 3.3622349,1.609729 z"
-       id="path3065" /></g><g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Lambda"
-     style="display:inline"><g
-       transform="matrix(0.01899666,0,0,0.01435939,25.385925,37.314762)"
-       inkscape:label="Layer 1"
-       id="layer1-2"
-       style="fill:#000000"><path
-         id="flowRoot1306"
-         d="m 354.22852,625.15545 0.21093,0 c 0,0.61719 -0.10157,1.06641 -0.30468,1.34766 -0.19923,0.28125 -0.44923,0.42187 -0.75,0.42188 -0.2461,-10e-6 -0.48243,-0.0918 -0.70899,-0.2754 -0.22657,-0.1875 -0.42969,-0.68554 -0.60937,-1.49414 l -0.50391,-2.27343 -1.74609,3.96093 -1.10743,0 2.50782,-5.40234 c -0.13282,-0.69921 -0.29297,-1.21679 -0.48047,-1.55273 -0.1875,-0.33593 -0.41993,-0.5039 -0.69727,-0.50391 -0.22266,10e-6 -0.41797,0.0859 -0.58594,0.25781 -0.16406,0.16798 -0.25586,0.4297 -0.27539,0.78516 l -0.21093,0 c 0.0117,-0.57421 0.12695,-1.0332 0.3457,-1.37695 0.21875,-0.34765 0.49219,-0.52148 0.82031,-0.52149 0.21094,10e-6 0.41016,0.0879 0.59766,0.26367 0.1914,0.17189 0.35546,0.46876 0.49219,0.89063 0.14062,0.41797 0.35742,1.28711 0.65039,2.60742 l 0.41601,1.85742 c 0.16797,0.76953 0.34375,1.28516 0.52735,1.54688 0.18749,0.25781 0.41015,0.38672 0.66797,0.38672 0.43749,0 0.68554,-0.3086 0.74414,-0.92579"
-         transform="matrix(104.6563,0,0,104.6563,-36414.11,-64667.67)"
-         inkscape:connector-curvature="0"
-         style="fill:#000000" /></g></g><g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="Cats" /></svg>
\ No newline at end of file
diff --git a/logo/original.svg b/logo/original.svg
deleted file mode 100644
index c74fb15..0000000
--- a/logo/original.svg
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
-<g>
-	<path d="M42.787,24.803c-0.206-0.326-0.418-0.647-0.648-0.954c-0.092,0.112-0.189,0.231-0.306,0.368
-		c-0.138,0.161-0.29,0.338-0.455,0.532c-2.386,2.787-5.858,4.117-9.354,4.808c-0.087,0.017-0.176,0.027-0.264,0.041
-		c0.223,0.423,0.361,0.896,0.361,1.406c0,1.676-1.363,3.039-3.039,3.039s-3.039-1.363-3.039-3.039c0-0.51,0.138-0.984,0.362-1.407
-		c-0.088-0.015-0.177-0.024-0.264-0.041c-3.269-0.351-6.377-2.045-8.76-4.257c-0.216-0.2-0.418-0.388-0.604-0.561
-		c-0.163-0.191-0.312-0.366-0.447-0.524c-0.028-0.033-0.047-0.057-0.074-0.089c-0.068,0.467-0.196,0.961-0.235,1.231
-		c-0.318,2.175-0.655,4.365-0.564,6.57c0.042,1.029,0.171,2.062,0.505,3.04c0.09,0.263,0.192,0.522,0.296,0.781
-		c0.311,0.771,0.643,1.536,0.729,2.372c0.251,2.46-1.902,4.663-4.34,4.663c-1.029,0-1.985-0.421-2.795-1.06
-		c-0.398,4.612,0.52,9.031,4.215,11.809c0.002,0,1.027,0.65,2.999,0.65c1.406,0,2.947-0.34,4.578-0.978
-		c0.326-0.127-0.334-1.901-0.43-2.093c-0.501-0.987-1.422-1.84-2.449-2.264c-0.208-0.086-0.404-0.166-0.585-0.242
-		c-0.181-0.09-0.363-0.101-0.519-0.141c-0.159-0.033-0.298-0.062-0.412-0.087c-0.232-0.048-0.364-0.076-0.364-0.076
-		s0.134-0.004,0.369-0.01c0.119-0.003,0.264-0.007,0.43-0.011c0.166,0.004,0.361-0.029,0.561,0.019
-		c2.301,0.546,4.621,1.774,5.207,4.275c0.037,0.159,0.069,0.299,0.096,0.414c0.008,0.034,0.011,0.049,0.018,0.077
-		c1.501,0.131,4.103,0.336,5.514,0.336c0.952,0,1.904-0.064,2.853-0.129c0.602-0.041,1.994,0.145,2.508-0.189
-		c0.293-0.191,0.268-0.562,0.381-0.9c0.253-0.759,0.693-1.481,1.244-2.062c1.131-1.187,2.774-1.882,4.41-1.841
-		c0.166,0.004,0.31,0.008,0.43,0.011c0.234,0.006,0.369,0.01,0.369,0.01s-0.133,0.028-0.364,0.076
-		c-0.114,0.024-0.253,0.054-0.412,0.087c-0.156,0.041-0.338,0.051-0.519,0.141c-0.182,0.076-0.379,0.156-0.586,0.242
-		c-0.211,0.069-0.41,0.196-0.608,0.332c-0.196,0.139-0.417,0.246-0.601,0.413c-0.178,0.169-0.356,0.341-0.537,0.513
-		c-0.181,0.164-0.291,0.393-0.437,0.576l-0.2,0.281l-0.132,0.311c-0.078,0.203-0.19,0.391-0.231,0.568
-		c-0.027,0.178-0.057,0.335-0.088,0.477c-0.018,0.07-0.033,0.136-0.049,0.199c0,0.092,0,0.18,0.002,0.262
-		c0,0.164,0,0.307,0.002,0.425c1.631,0.638,3.172,0.978,4.578,0.978c1.985,0,3.012-0.66,3.021-0.668
-		C53.177,46.706,45.482,29.983,42.787,24.803z M29.079,48.65c-3.57,0-6.474-2.903-6.474-6.474c0-3.569,2.905-6.474,6.474-6.474
-		s6.474,2.904,6.474,6.474C35.553,45.747,32.648,48.65,29.079,48.65z"/>
-	<path d="M29.079,36.703c-3.019,0-5.474,2.455-5.474,5.474s2.456,5.474,5.474,5.474c3.019,0,5.474-2.455,5.474-5.474
-		S32.098,36.703,29.079,36.703z M29.109,39.314c0.774,0.166,1.352-0.157,1.861-0.697c0.208-0.221,0.627-0.266,0.901-0.133
-		c0.26,0.125,0.322,0.527,0.083,0.777c-0.136,0.143-0.331,0.273-0.52,0.312c-0.52,0.109-0.97,0.351-1.415,0.619
-		c-0.062,0.037-0.129,0.066-0.197,0.095c-0.112,0.045-0.496,0.063-0.737-0.159c-0.145-0.134-0.237-0.314-0.252-0.523
-		C28.819,39.416,28.897,39.27,29.109,39.314z M27.393,38.43c0.309,0.109,0.62,0.232,0.897,0.403c0.075,0.046,0.13,0.123,0.181,0.207
-		c0.079,0.131,0.138,0.446-0.019,0.61c-0.091,0.095-0.215,0.137-0.377,0.127c-0.594-0.037-1.018-0.484-1.02-1.076
-		C27.054,38.464,27.172,38.352,27.393,38.43z M32.777,44.782c-0.545,0.698-2.208,1.333-3.293,0.796
-		c-0.824-0.407-1.132-1.487-0.609-2.244c0.023-0.034,0.034-0.076,0.043-0.12c0.013-0.069-0.032-0.138-0.1-0.151
-		c-0.041-0.008-0.082-0.018-0.122-0.029c-0.162-0.049-0.324-0.098-0.481-0.161c-0.099-0.039-0.196-0.081-0.293-0.124
-		c-0.161-0.071-0.294-0.133-0.297-0.137c-0.004-0.004,0.118-0.117,0.138-0.299c0.019-0.18-0.328-0.242-0.378-0.088
-		c-0.02,0.063,0.027,0.133,0.134,0.248c0.019,0.02,0.036,0.043,0.052,0.065c0.026,0.039,0.048,0.073,0.053,0.076
-		c0.005,0.002,0.246,0.176,0.37,0.489c0.072,0.183,0.097,0.385,0.084,0.602c-0.005,0.085-0.009,0.171-0.028,0.253
-		c-0.097,0.421-0.066,0.838,0.011,1.259c0.051,0.279-0.071,0.504-0.32,0.639c-0.201,0.11-0.415,0.148-0.611-0.015
-		c-0.227-0.188-0.321-0.655-0.215-0.942c0.087-0.235,0.213-0.479,0.214-0.719c0.001-0.428-0.075-0.857-0.138-1.283
-		c-0.006-0.041-0.173-0.107-0.228-0.082c-0.143,0.065-0.263,0.182-0.397,0.27c-0.276,0.18-0.555,0.357-0.836,0.531
-		c-0.054,0.033-0.126,0.061-0.187,0.056c-0.095-0.008-0.252-0.026-0.267-0.075c-0.03-0.088-0.001-0.238,0.064-0.294
-		c0.394-0.338,0.83-0.63,1.202-0.989c0.214-0.205,0.415-0.426,0.613-0.649c0.327-0.37,0.577-0.685,0.561-0.702
-		s-0.178,0.033-0.361,0.111c-0.111,0.047-0.222,0.093-0.335,0.133c-0.584,0.21-1.032,0.014-1.241-0.533
-		c-0.109-0.285-0.018-0.591,0.231-0.75c0.239-0.152,0.418-0.038,0.604,0.128c0.297,0.265,0.647,0.282,1.007,0.146
-		c0.203-0.077,0.397-0.176,0.598-0.258c0.288-0.119,0.465-0.074,0.633,0.187c0.1,0.155,0.152,0.343,0.244,0.505
-		c0.056,0.1,0.133,0.208,0.229,0.252c0.048,0.021,0.158-0.092,0.24-0.142c0.173-0.106,0.337-0.246,0.525-0.302
-		c0.098-0.029,0.32,0.07,0.344,0.153c0.04,0.136,0.004,0.33-0.074,0.452c-0.151,0.236-0.128,0.439,0.133,0.5
-		c0.196,0.046,0.407,0.072,0.605,0.05c0.383-0.042,0.539-0.354,0.372-0.702c-0.061-0.127-0.147-0.242-0.217-0.365
-		c-0.133-0.23-0.06-0.385,0.203-0.36c0.658,0.062,1.264,0.478,1.006,1.319c-0.134,0.439-0.463,0.703-0.898,0.828
-		c-0.163,0.049-0.332,0.076-0.5,0.104c-0.337,0.058-0.588,0.334-0.654,0.672c-0.017,0.086-0.049,0.17-0.086,0.253
-		c-0.06,0.135,0.019,0.406,0.184,0.344c0.064-0.023,0.097-0.113,0.128-0.281c0.034-0.182,0.085-0.368,0.166-0.534
-		c0.034-0.07,0.168-0.127,0.253-0.124c0.067,0.003,0.158,0.097,0.188,0.171c0.048,0.12,0.079,0.257,0.072,0.385
-		c-0.013,0.255,0.117,0.312,0.332,0.298c0.112-0.009,0.23-0.022,0.337,0.002c0.081,0.02,0.209,0.096,0.209,0.146
-		c0,0.082-0.071,0.189-0.143,0.238c-0.114,0.08-0.25,0.15-0.385,0.171c-0.201,0.028-0.245,0.14-0.294,0.313
-		c-0.048,0.17-0.146,0.354-0.278,0.465c-0.215,0.182-0.436,0.098-0.487-0.217c-0.052-0.326-0.205-0.395-0.488-0.367
-		c-0.049,0.006-0.099-0.002-0.15-0.011c-0.082-0.016-0.21,0.207-0.055,0.413c0.085,0.114,0.219,0.201,0.39,0.239
-		c0.742,0.165,1.429,0.05,1.983-0.517c0.465-0.475,0.282-1.215-0.352-1.447c-0.142-0.051-0.299-0.066-0.431-0.135
-		c-0.077-0.039-0.155-0.146-0.16-0.229c-0.004-0.057,0.111-0.127,0.18-0.182c0.026-0.021,0.071-0.023,0.108-0.028
-		c0.44-0.067,1.29,0.325,1.51,0.694C33.206,43.598,33.129,44.333,32.777,44.782z"/>
-	<path d="M29.916,42.617c0.028-0.001,0.055-0.006,0.083-0.012c0.045-0.008,0.08-0.035,0.077-0.058s-0.164-0.099-0.36-0.17
-		c-0.196-0.071-0.281-0.004-0.368,0.093c-0.044,0.049-0.122,0.075-0.206,0.105c-0.076,0.027-0.128,0.145-0.168,0.23
-		c-0.013,0.029,0.055,0.133,0.064,0.129c0.079-0.021,0.185-0.043,0.218-0.101C29.415,42.555,29.675,42.625,29.916,42.617z"/>
-	<path d="M28.297,41.455c-0.212,0.168-0.18,0.345,0.049,0.262c0.151-0.055,0.285-0.146,0.342-0.263
-		c0.021-0.043,0.02-0.097,0.014-0.151C28.692,41.219,28.509,41.287,28.297,41.455z"/>
-	<path d="M16.591,23.92c0.171,0.118,0.361,0.248,0.568,0.39c0.214,0.121,0.445,0.252,0.692,0.392
-		c4.123,2.338,8.69,3.497,13.439,3.007c1.364-0.141,2.718-0.435,4.022-0.861c2.215-0.723,4.321-1.621,6.256-2.931
-		c0.15-0.102,0.281-0.189,0.404-0.27c-0.56-0.714-1.176-1.383-1.912-1.964c-0.684-0.539-1.384-1.062-1.895-1.776
-		c-1.411-1.972-0.77-4.817,1.136-6.212c-0.018-0.039-0.034-0.077-0.052-0.116c-1.223-2.717-2.705-4.299-3.998-4.299
-		c-0.499,0-1.009,0.226-1.516,0.671c-1.319,1.157-2.974,1.795-4.657,1.795s-3.337-0.638-4.656-1.795
-		c-0.507-0.445-1.017-0.671-1.516-0.671c-1.312,0-2.759,1.542-3.969,4.23c-1.38,3.068-2.65,5.893-2.65,9.484
-		c0,0.083-0.025,0.162-0.064,0.235c0.054,0.127,0.072,0.294,0.065,0.488C16.386,23.782,16.478,23.844,16.591,23.92z M22.533,22.764
-		c-0.23,0.109-0.542,0.229-0.866,0.294c-0.322,0.071-0.656,0.088-0.911,0.08c-0.255-0.008-0.433-0.053-0.433-0.053
-		s0.145-0.113,0.375-0.223c0.23-0.11,0.542-0.229,0.866-0.294c0.322-0.071,0.656-0.086,0.911-0.08
-		c0.255,0.008,0.433,0.052,0.433,0.052S22.762,22.654,22.533,22.764z M37.402,23.138c-0.254,0.008-0.588-0.009-0.91-0.08
-		c-0.324-0.065-0.637-0.186-0.866-0.294c-0.229-0.11-0.375-0.222-0.375-0.222s0.179-0.044,0.433-0.052
-		c0.254-0.007,0.59,0.009,0.912,0.08c0.323,0.065,0.635,0.184,0.865,0.294c0.23,0.11,0.375,0.223,0.375,0.223
-		S37.657,23.13,37.402,23.138z M38.432,21.469c0.389,0.06,0.647,0.14,0.647,0.14s-0.259,0.08-0.647,0.14
-		c-0.388,0.059-0.904,0.113-1.423,0.11c-0.517,0.003-1.034-0.049-1.423-0.109c-0.388-0.06-0.646-0.141-0.646-0.141
-		s0.259-0.081,0.646-0.141c0.389-0.06,0.905-0.112,1.423-0.109C37.527,21.356,38.044,21.41,38.432,21.469z M34.939,20.695
-		c0,0,0.158-0.079,0.387-0.15c0.229-0.07,0.527-0.145,0.822-0.191c0.295-0.05,0.592-0.073,0.805-0.113
-		c0.104-0.023,0.195-0.041,0.242-0.072c0.057-0.023,0.074-0.086,0.076-0.077c-0.01,0.004,0.033,0.034,0.008,0.124
-		c-0.027,0.083-0.09,0.198-0.199,0.275c-0.209,0.171-0.525,0.307-0.85,0.356c-0.323,0.056-0.651,0.029-0.893-0.021
-		C35.096,20.778,34.939,20.695,34.939,20.695z M33.473,12.32c0.313-0.556,0.811-1.232,1.488-1.323
-		c0.645-0.086,1.254,0.311,1.646,0.791c0.16,0.195,0.683,1.007,0.867,1.504c0.392,1.05-0.611,0.65-1.154,0.386
-		c-0.699-0.34-1.34-0.451-2.09-0.61C33.688,12.954,33.232,12.749,33.473,12.32z M32.019,18.365c0.414-0.591,1.032-0.985,1.743-1.11
-		c0.709-0.129,1.424,0.033,2.016,0.446c0.17,0.119,0.211,0.353,0.093,0.522c-0.12,0.17-0.354,0.211-0.522,0.093
-		c-0.879-0.618-2.098-0.401-2.713,0.479c-0.072,0.104-0.189,0.16-0.308,0.16c-0.074,0-0.149-0.021-0.215-0.067
-		C31.941,18.768,31.9,18.534,32.019,18.365z M27.138,23.118c0.497-0.185,0.965-0.454,1.349-0.821
-		c0.408-0.39,0.604-0.833,0.814-1.343c0.012-0.033,0.021-0.053,0.03-0.076c-0.456-0.02-0.822-0.413-0.822-0.648
-		c0-0.241,0.383-0.437,0.856-0.437c0.473,0,0.856,0.196,0.856,0.437c0,0.235-0.366,0.628-0.822,0.648
-		c0.009,0.023,0.018,0.043,0.03,0.076c0.039,0.094,0.075,0.253,0.152,0.399c0.493,0.933,1.248,1.389,2.167,1.829
-		c0,0-0.058,0.016-0.163,0.032c-0.103,0.001-0.266,0.064-0.448,0.026c-0.181-0.035-0.414-0.045-0.625-0.162
-		c-0.511-0.284-1.018-0.753-1.147-1.346c0.054,0.246-0.334,0.713-0.483,0.876c-0.362,0.396-0.78,0.535-1.289,0.632
-		c-0.183,0.038-0.346-0.025-0.448-0.026c-0.106-0.016-0.163-0.032-0.163-0.032S27.04,23.155,27.138,23.118z M26.124,18.365
-		c0.118,0.169,0.077,0.403-0.093,0.522c-0.065,0.045-0.141,0.067-0.215,0.067c-0.118,0-0.234-0.056-0.308-0.16
-		c-0.615-0.88-1.831-1.097-2.713-0.479c-0.17,0.116-0.402,0.078-0.522-0.093c-0.118-0.17-0.077-0.403,0.093-0.522
-		c0.59-0.414,1.305-0.575,2.016-0.446C25.092,17.379,25.71,17.774,26.124,18.365z M23.218,20.695c0,0-0.156,0.083-0.398,0.131
-		c-0.241,0.049-0.569,0.077-0.892,0.021c-0.323-0.049-0.641-0.185-0.85-0.356c-0.109-0.077-0.172-0.192-0.2-0.275
-		c-0.026-0.09,0.018-0.12,0.008-0.124c0.003-0.008,0.02,0.054,0.077,0.077c0.047,0.031,0.138,0.049,0.242,0.072
-		c0.212,0.04,0.509,0.063,0.804,0.113c0.296,0.046,0.594,0.121,0.823,0.191C23.061,20.617,23.218,20.695,23.218,20.695z
-		 M20.684,13.292c0.186-0.497,0.707-1.309,0.867-1.504c0.393-0.48,1.003-0.877,1.647-0.791c0.678,0.091,1.175,0.766,1.488,1.323
-		c0.241,0.429-0.214,0.633-0.758,0.748c-0.75,0.159-1.391,0.27-2.091,0.61C21.295,13.943,20.292,14.342,20.684,13.292z
-		 M19.726,21.469c0.388-0.059,0.905-0.112,1.423-0.11c0.517-0.003,1.035,0.049,1.423,0.109c0.388,0.06,0.647,0.141,0.647,0.141
-		s-0.259,0.08-0.647,0.141c-0.388,0.06-0.905,0.112-1.423,0.109c-0.517,0.003-1.035-0.051-1.423-0.11
-		c-0.388-0.06-0.647-0.14-0.647-0.14S19.338,21.529,19.726,21.469z"/>
-	<path d="M38.941,19.351c1.127,1.576,2.961,2.526,4.113,4.112c1.564,2.156,2.62,4.761,3.518,7.256
-		c0.062,0.171,0.123,0.341,0.183,0.516c0.017,0.047,0.033,0.103,0.056,0.175c0.031,0.096,0.104,0.146,0.135,0.087
-		c0.018-0.031,0.035-0.069,0.051-0.11c0.027-0.07,0.055-0.144,0.084-0.224c0.029-0.081,0.055-0.153,0.077-0.211
-		c0.327-0.851,0.567-1.858,0.754-3.168c0.108-0.761,0.177-1.528,0.229-2.178c0.153-1.91,0.272-4.721-0.472-7.068
-		c-0.419-1.324-1.282-2.666-2.198-3.417c-1.596-1.31-4.033-1.882-5.701-0.487C38.387,15.8,37.82,17.786,38.941,19.351z"/>
-	<path d="M29.079,28.965c-0.64,0-1.204,0.302-1.579,0.765c-0.283,0.35-0.461,0.79-0.461,1.274c0,1.124,0.915,2.039,2.039,2.039
-		s2.039-0.915,2.039-2.039c0-0.484-0.177-0.923-0.46-1.273C30.284,29.268,29.719,28.965,29.079,28.965z"/>
-	<path d="M12.643,41.781c0.93,0,1.843-0.422,2.507-1.157c0.628-0.694,0.925-1.549,0.838-2.405c-0.064-0.628-0.318-1.254-0.588-1.917
-		l-0.074-0.182c-0.111-0.276-0.22-0.552-0.315-0.832c-0.326-0.958-0.504-2.013-0.557-3.322c-0.089-2.169,0.216-4.307,0.519-6.378
-		c0.006-0.042,0.012-0.084,0.018-0.126l0.037-0.252c0.019-0.133,0.057-0.314,0.102-0.52c0.007-0.03,0.014-0.065,0.022-0.103
-		c0.012-0.057-0.058-0.046-0.153,0.031c-0.057,0.046-0.114,0.094-0.171,0.141c-0.367,0.302-0.724,0.645-1.069,1.017
-		c-0.847,0.913-1.622,1.979-2.275,2.933c-1.029,1.505-2.455,3.77-2.948,6.055c-0.277,1.282-0.199,2.783,0.199,3.825
-		c0.103,0.269,0.24,0.535,0.393,0.797c0.121,0.208,0.257,0.409,0.406,0.604c0.139,0.182,0.288,0.353,0.448,0.517
-		C10.71,41.251,11.636,41.781,12.643,41.781z"/>
-</g>
-</svg>
diff --git a/profiles.clj b/profiles.clj
deleted file mode 100644
index f3aaee8..0000000
--- a/profiles.clj
+++ /dev/null
@@ -1,17 +0,0 @@
-{:dev
- {:aliases {"test-all" ["with-profile" "dev,1.8:dev" "test"]}
-  :dependencies [[org.clojure/tools.namespace "0.2.11"]
-                 [criterium "0.4.3"]]
-  :source-paths ["dev"]
-  :codeina {:sources ["src"]
-            :reader :clojure
-            :target "doc/dist/latest/api"
-            :src-uri "http://github.com/funcool/cats/blob/master/"
-            :src-uri-prefix "#L"}
-  :plugins [[funcool/codeina "0.5.0"]
-            [lein-ancient "0.6.15" :exclusions [org.clojure/tools.reader]]]}
- :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]}
- :bench
- [:dev
-  {:main ^:skip-aot benchmarks
-   :jvm-opts ^:replace []}]}
diff --git a/project.clj b/project.clj
deleted file mode 100644
index 49832a0..0000000
--- a/project.clj
+++ /dev/null
@@ -1,17 +0,0 @@
-(defproject funcool/cats "2.4.3-beta.2"
-  :description "Category Theory abstractions for Clojure"
-  :url         "https://github.com/funcool/cats"
-  :license {:name "BSD (2 Clause)"
-            :url  "http://opensource.org/licenses/BSD-2-Clause"}
-  :dependencies [[org.clojure/clojure "1.10.0" :scope "provided"]
-                 [org.clojure/clojurescript "1.10.439" :scope "provided"]
-                 [org.clojure/core.async "0.4.474" :scope "provided"]
-                 [org.clojure/test.check "0.9.0" :scope "provided"]
-                 [org.clojure/core.match "0.3.0-alpha4" :scope "provided"]
-                 [manifold "0.1.6" :scope "provided"]
-                 [funcool/promesa "5.1.0" :scope "provided"]]
-  :deploy-repositories {"releases"  :clojars
-                        "snapshots" :clojars}
-  :source-paths   ["src"]
-  :test-paths     ["test"]
-  :jar-exclusions [#"\.swp|\.swo|user\.clj"])
diff --git a/resources/clj-kondo.exports/funcool/cats/config.edn b/resources/clj-kondo.exports/funcool/cats/config.edn
deleted file mode 100644
index a1fab11..0000000
--- a/resources/clj-kondo.exports/funcool/cats/config.edn
+++ /dev/null
@@ -1,9 +0,0 @@
-{:lint-as {cats.core/mlet clojure.core/let
-           cats.core/alet clojure.core/let
-           cats.core/ap-> clojure.core/->
-           cats.core/ap->> clojure.core/->>
-           cats.core/as-ap-> clojure.core/as->
-           cats.core/->= clojure.core/->
-           cats.core/->>= clojure.core/->>
-           cats.core/as->= clojure.core/as->
-           cats.core/for clojure.core/for}}
diff --git a/scripts/build b/scripts/build
deleted file mode 100755
index 0b894a2..0000000
--- a/scripts/build
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-lein trampoline run -m clojure.main scripts/build.clj
diff --git a/scripts/build.clj b/scripts/build.clj
deleted file mode 100644
index a4dd1eb..0000000
--- a/scripts/build.clj
+++ /dev/null
@@ -1,14 +0,0 @@
-(require '[cljs.build.api :as b])
-
-(println "Building ...")
-
-(let [start (System/nanoTime)]
-  (b/build
-   (b/inputs "test" "src")
-   {:main 'cats.runner
-    :output-to "out/tests.js"
-    :output-dir "out"
-    :optimizations :none
-    :target :nodejs
-    :verbose true})
-  (println "... done. Elapsed" (/ (- (System/nanoTime) start) 1e9) "seconds"))
diff --git a/scripts/repl b/scripts/repl
deleted file mode 100755
index 27afc98..0000000
--- a/scripts/repl
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-rlwrap lein trampoline run -m clojure.main scripts/repl.clj
diff --git a/scripts/repl.clj b/scripts/repl.clj
deleted file mode 100644
index 2cab794..0000000
--- a/scripts/repl.clj
+++ /dev/null
@@ -1,8 +0,0 @@
-(require
-  '[cljs.repl]
-  '[cljs.repl.node])
-
-(cljs.repl/repl
- (cljs.repl.node/repl-env)
- :output-dir "out"
- :cache-analysis true)
diff --git a/scripts/watch b/scripts/watch
deleted file mode 100755
index 6958be4..0000000
--- a/scripts/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-lein trampoline run -m clojure.main scripts/watch.clj
diff --git a/scripts/watch.clj b/scripts/watch.clj
deleted file mode 100644
index 1805f67..0000000
--- a/scripts/watch.clj
+++ /dev/null
@@ -1,8 +0,0 @@
-(require '[cljs.build.api :as b])
-
-(b/watch (b/inputs "test" "src")
-  {:main 'cats.runner
-   :target :nodejs
-   :output-to "out/tests.js"
-   :output-dir "out"
-   :verbose true})
diff --git a/src/cats/builtin.cljc b/src/cats/builtin.cljc
deleted file mode 100644
index 01b5f8d..0000000
--- a/src/cats/builtin.cljc
+++ /dev/null
@@ -1,572 +0,0 @@
-;; Copyright (c) 2014-2015 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2015 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.builtin
-  "Clojure(Script) built-in types extensions."
-  (:require [clojure.set :as s]
-            [cats.monad.maybe :as maybe]
-            [cats.protocols :as p]
-            [cats.context :as ctx]
-            [cats.core :as m]
-            [cats.util :as util]))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Nil as Nothing of Maybe monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(extend-type nil
-  p/Contextual
-  (-get-context [_] maybe/context)
-
-  p/Extract
-  (-extract [_] nil))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Sequence Monad i.e. PersistentList
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def sequence-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (into sv' (reverse sv)))
-
-    p/Monoid
-    (-mempty [_] ())
-
-    p/Functor
-    (-fmap [_ f v]
-      (loop [[h & t :as c] v
-             result ()]
-        (if (empty? c)
-          (reverse result)
-          (recur t (cons (f h) result)))))
-
-    p/Applicative
-    (-pure [_ v] (list v))
-
-    (-fapply [_ self av]
-      ;; Each function (outer loop) applied to each value (inner loop).
-      (->> (loop [[h & t :as c] self
-                  result ()]
-             (if (empty? c)
-               result
-               (recur t
-                      (cons (loop [[h' & t' :as c'] av
-                                   result' ()]
-                              (if (empty? c')
-                                result'
-                                (recur t' (cons (h h') result'))))
-                            result))))
-           ;; Note that both `result` & `result'` above are
-           ;; in reverse order.
-           ;; Conjing elements of %2 into %1 below is done in
-           ;; in reverse order, so final result is correctly
-           ;; ordered.
-           (reduce #(into %1 %2) ())))
-
-
-    p/Monad
-    (-mreturn [_ v]
-      (list v))
-
-    (-mbind [_ self f]
-      (->> (loop [[h & t :as c] self
-                  result ()]
-             (if (empty? c)
-               result
-               (recur t (cons (f h) result))))
-           ;; Note that `result` above is in reverse order.
-           ;; Conjing elements of %2 into %1 below is done in
-           ;; in reverse order, so final result is correctly
-           ;; ordered.
-           (reduce #(into %1 %2) ())))
-
-    p/MonadZero
-    (-mzero [_] ())
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (into mv' (reverse mv)))
-
-    p/Foldable
-    (-foldr [ctx f z xs]
-      (let [x (first xs)]
-        (if (nil? x)
-          z
-          (let [xs (rest xs)]
-            (f x (p/-foldr ctx f z xs))))))
-
-    (-foldl [ctx f z xs]
-      (reduce f z xs))
-
-    p/Traversable
-    (-traverse [ctx f tv]
-      (let [as (p/-fmap ctx f tv)]
-        (p/-foldr ctx
-                  (fn [a acc]
-                    (m/alet [x a
-                             xs acc]
-                      (cons x xs)))
-                  (m/pure ())
-                  as)))
-
-    p/Printable
-    (-repr [_]
-      "#<List>")))
-
-(util/make-printable (type sequence-context))
-
-(extend-type #?(:clj  clojure.lang.PersistentList
-                :cljs cljs.core.List)
-  p/Contextual
-  (-get-context [_] sequence-context))
-
-(extend-type #?(:clj  clojure.lang.PersistentList$EmptyList
-                :cljs cljs.core.EmptyList)
-  p/Contextual
-  (-get-context [_] sequence-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Lazy Sequence Monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def lazy-sequence-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (concat sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      (lazy-seq []))
-
-    p/Functor
-    (-fmap [_ f v]
-      (map f v))
-
-    p/Applicative
-    (-pure [_ v]
-      (lazy-seq [v]))
-
-    (-fapply [_ self av]
-      (for [f self
-            v av]
-           (f v)))
-
-    p/Monad
-    (-mreturn [_ v]
-      (lazy-seq [v]))
-
-    (-mbind [_ self f]
-      (apply concat (map f self)))
-
-    p/MonadZero
-    (-mzero [_]
-      (lazy-seq []))
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (concat mv mv'))
-
-    p/Foldable
-    (-foldr [ctx f z xs]
-      (let [x (first xs)]
-        (if (nil? x)
-          z
-          (let [xs (rest xs)]
-            (f x (p/-foldr ctx f z xs))))))
-
-    (-foldl [ctx f z xs]
-      (reduce f z xs))
-
-    p/Traversable
-    (-traverse [ctx f tv]
-      (let [as (p/-fmap ctx f tv)]
-        (p/-foldr ctx
-                  (fn [a acc]
-                    (m/alet [x a
-                             xs acc]
-                      (cons x xs)))
-                  (m/pure (lazy-seq []))
-                  as)))
-
-    p/Printable
-    (-repr [_]
-      "#<LazySequence>")))
-
-(util/make-printable (type lazy-sequence-context))
-
-(extend-type #?(:clj  clojure.lang.LazySeq
-                :cljs cljs.core.LazySeq)
-  p/Contextual
-  (-get-context [_] lazy-sequence-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Range
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def range-context
-  (reify
-    p/Context
-    p/Foldable
-    (-foldr [ctx f z xs]
-      (let [x (first xs)]
-        (if (nil? x)
-          z
-          (let [xs (rest xs)]
-            (f x (p/-foldr ctx f z xs))))))
-
-    (-foldl [ctx f z xs]
-      (reduce f z xs))
-
-    p/Printable
-    (-repr [_]
-      "#<Range>")))
-
-(util/make-printable (type range-context))
-
-(extend-type #?(:clj  clojure.lang.LongRange
-                :cljs cljs.core.Range)
-  p/Contextual
-  (-get-context [_] range-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Vector Monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def vector-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (into sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      [])
-
-    p/Functor
-    (-fmap [_ f v]
-      (vec (map f v)))
-
-    p/Applicative
-    (-pure [_ v]
-      [v])
-
-    (-fapply [_ self av]
-      (vec (for [f self
-                 v av]
-             (f v))))
-
-    p/Monad
-    (-mreturn [_ v]
-      [v])
-
-    (-mbind [_ self f]
-      (vec (mapcat f self)))
-
-    p/MonadZero
-    (-mzero [_]
-      [])
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (into mv mv'))
-
-    p/Foldable
-    (-foldr [ctx f z xs]
-      (letfn [(rf [acc v] (f v acc))]
-        (reduce rf z (reverse xs))))
-
-    (-foldl [ctx f z xs]
-      (reduce f z xs))
-
-    p/Traversable
-    (-traverse [ctx f tv]
-      (let [as (p/-fmap ctx f tv)]
-        (p/-foldl ctx
-                  (fn [acc a]
-                    (m/alet [x a
-                             xs acc]
-                       (conj xs x)))
-                  (m/pure [])
-                  as)))
-
-    p/Printable
-    (-repr [_]
-      "#<Vector>")))
-
-(util/make-printable (type vector-context))
-
-(extend-type #?(:clj clojure.lang.PersistentVector
-                :cljs cljs.core.PersistentVector)
-  p/Contextual
-  (-get-context [_] vector-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Map Monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def map-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (merge sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      {})
-
-    p/Functor
-    (-fmap [_ f v]
-      (into {} (map (fn [[key value]] [key (f value)]) v)))
-
-    p/Foldable
-    (-foldr [ctx f z xs]
-      (letfn [(rf [acc v] (f v acc))]
-        (reduce rf z xs)))
-
-    (-foldl [ctx f z xs]
-      (reduce f z xs))
-
-    p/Printable
-    (-repr [_]
-      "#<Map>")))
-
-(util/make-printable (type map-context))
-
-(extend-type #?(:clj clojure.lang.PersistentArrayMap
-                :cljs cljs.core.PersistentArrayMap)
-  p/Contextual
-  (-get-context [_] map-context))
-
-(extend-type #?(:clj clojure.lang.PersistentHashMap
-                :cljs cljs.core.PersistentHashMap)
-  p/Contextual
-  (-get-context [_] map-context))
-
-(extend-type #?(:clj clojure.lang.PersistentTreeMap
-                :cljs cljs.core.PersistentTreeMap)
-  p/Contextual
-  (-get-context [_] map-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Set Monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def set-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (s/union sv (set sv')))
-
-    p/Monoid
-    (-mempty [_]
-      #{})
-
-    p/Functor
-    (-fmap [_ f self]
-      (set (map f self)))
-
-    p/Applicative
-    (-pure [_ v]
-      #{v})
-
-    (-fapply [_ self av]
-      (set (for [f self
-                 v av]
-             (f v))))
-
-    p/Monad
-    (-mreturn [_ v]
-      #{v})
-
-    (-mbind [_ self f]
-      (apply s/union (map f self)))
-
-    p/MonadZero
-    (-mzero [_]
-      #{})
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (s/union mv mv'))
-
-    p/Printable
-    (-repr [_]
-      "#<Set>")))
-
-(util/make-printable (type set-context))
-
-(extend-type #?(:clj clojure.lang.PersistentHashSet
-                :cljs cljs.core.PersistentHashSet)
-  p/Contextual
-  (-get-context [_] set-context))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Function Monad
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def function-context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [ctx f g] (comp f g))
-
-    p/Monoid
-    (-mempty [_] identity)
-
-    p/Functor
-    (-fmap [_ f self]
-      (comp f self))
-
-    p/Applicative
-    (-pure [_ v]
-      (constantly v))
-
-    (-fapply [_ self av]
-      (fn [x] ((self x) (av x))))
-
-    p/Monad
-    (-mreturn [_ v]
-      (constantly v))
-
-    (-mbind [_ self f]
-      (fn [r] ((f (self r)) r)))
-
-    p/Printable
-    (-repr [_]
-      "#<Function>")))
-
-(util/make-printable (type function-context))
-
-(extend-type #?(:clj clojure.lang.IFn
-                :cljs cljs.core.IFn)
-  p/Contextual
-  (-get-context [_] function-context))
-
-#?(:cljs
-   (extend-type function
-     p/Contextual
-     (-get-context [_] function-context)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monoids
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def any-monoid
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (or sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      false)
-
-    p/Printable
-    (-repr [_]
-      "#<Any>")))
-
-(util/make-printable (type any-monoid))
-
-(def all-monoid
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (and sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      true)
-
-    p/Printable
-    (-repr [_]
-      "#<All>")))
-
-(util/make-printable (type all-monoid))
-
-(def sum-monoid
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (+ sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      0)
-
-    p/Printable
-    (-repr [_]
-      "#<Sum>")))
-
-(util/make-printable (type sum-monoid))
-
-(def prod-monoid
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (* sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      1)
-
-    p/Printable
-    (-repr [_]
-      "#<Product>")))
-
-(util/make-printable (type prod-monoid))
-
-(def string-monoid
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (str sv sv'))
-
-    p/Monoid
-    (-mempty [_]
-      "")
-
-    p/Printable
-    (-repr [_]
-      "#<String>")))
-
-(util/make-printable (type string-monoid))
-
-(extend-type #?(:clj java.lang.String
-                :cljs string)
-  p/Contextual
-  (-get-context [_] string-monoid))
diff --git a/src/cats/context.cljc b/src/cats/context.cljc
deleted file mode 100644
index 3e8a3f3..0000000
--- a/src/cats/context.cljc
+++ /dev/null
@@ -1,105 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.context
-  "A cats context management."
-  (:require [cats.protocols :as p]))
-
-(def ^:dynamic *context* nil)
-(def ^:dynamic *override* nil)
-
-(defn throw-illegal-argument
-  {:no-doc true :internal true}
-  [^String text]
-  #?(:cljs (throw (ex-info text {}))
-     :clj  (throw (IllegalArgumentException. text))))
-
-(defn context?
-  "Return `true` if the provided value satisfies
-  the Context protocol."
-  [v]
-  (satisfies? p/Context v))
-
-#?(:clj
-   (defmacro with-context
-     "Set current context to specific monad."
-     [ctx & body]
-     `(do
-        (when-not (context? ~ctx)
-          (throw-illegal-argument
-           "The provided context does not implements Context."))
-        (binding [*context* ~ctx]
-          ~@body))))
-
-#?(:clj
-(defmacro with-context-override
-  "Set current context to specific monad."
-  [ctx & body]
-  `(do
-     (when-not (context? ~ctx)
-       (throw-illegal-argument
-        "The provided context does not implements Context."))
-     (binding [*context* ~ctx
-               *override* true]
-       ~@body))))
-
-#?(:clj
-   (defmacro with-monad
-     "Semantic alias for `with-context`."
-     [ctx & body]
-     `(with-context ~ctx
-        ~@body)))
-
-(defn infer
-  "Given an optional value infer its context. If context is already set, it
-  is returned as is without any inference operation."
-  {:no-doc true}
-  ([]
-   (when (nil? *context*)
-     (throw-illegal-argument "No context is set."))
-   *context*)
-  ([v]
-   (cond
-     (not (nil? *override*))
-     *context*
-
-     (satisfies? p/Contextual v)
-     (p/-get-context v)
-
-     (not (nil? *context*))
-     *context*
-
-     :else
-     (throw-illegal-argument
-      (str "No context is set and it can not be automatically "
-           "resolved from provided value")))))
-
-(defn get-current
-  "Deprecated alias to `infer`."
-  {:deprecated true}
-  [& args]
-  (apply infer args))
-
-
diff --git a/src/cats/core.cljc b/src/cats/core.cljc
deleted file mode 100644
index eb3df50..0000000
--- a/src/cats/core.cljc
+++ /dev/null
@@ -1,1093 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.core
-  "Category Theory abstractions for Clojure"
-  #?(:cljs
-     (:require-macros [cats.core :refer (mlet alet)]))
-  #?(:cljs
-     (:require [cats.protocols :as p]
-               [clojure.set]
-               [cats.context :as ctx :include-macros true])
-     :clj
-     (:require [cats.protocols :as p]
-               [clojure.set]
-               [clojure.walk :as walk]
-               [cats.context :as ctx]))
-  (:refer-clojure :exclude [filter sequence unless when for]))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Context-aware functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn mempty
-  ([] (p/-mempty (ctx/infer)))
-  ([ctx] (p/-mempty ctx)))
-
-(defn mappend
-  [& svs]
-  {:pre [(seq svs)]}
-  (let [ctx (ctx/infer (first svs))]
-    (reduce (partial p/-mappend ctx) svs)))
-
-(defn pure
-  "Given any value `v`, return it wrapped in
-  the default/effect-free context.
-
-  This is a multi-arity function that with arity `pure/1`
-  uses the dynamic scope to resolve the current
-  context. With `pure/2`, you can force a specific context
-  value.
-
-  Example:
-
-      (with-context either/context
-        (pure 1))
-      ;; => #<Right [1]>
-
-      (pure either/context 1)
-      ;; => #<Right [1]>
-  "
-  ([v] (pure (ctx/infer) v))
-  ([ctx v] (p/-pure ctx v)))
-
-(defn return
-  "This is a monad version of `pure` and works
-  identically to it."
-  ([v] (return (ctx/infer) v))
-  ([ctx v] (p/-mreturn ctx v)))
-
-(defn bind
-  "Given a monadic value `mv` and a function `f`,
-  apply `f` to the unwrapped value of `mv`.
-
-      (bind (either/right 1) (fn [v]
-                               (return (inc v))))
-      ;; => #<Right [2]>
-
-  For convenience, you may prefer to use the `mlet` macro,
-  which provides a beautiful, `let`-like syntax for
-  composing operations with the `bind` function."
-  [mv f]
-  (let [ctx (ctx/infer mv)]
-    (p/-mbind ctx mv (fn [v]
-                       (ctx/with-context ctx
-                         (f v))))))
-
-(defn mzero
-  ([]
-   (p/-mzero (ctx/infer)))
-  ([ctx]
-   (p/-mzero ctx)))
-
-(defn mplus
-  [& mvs]
-  {:pre [(seq mvs)]}
-  (let [ctx (ctx/infer (first mvs))]
-    (reduce (partial p/-mplus ctx) mvs)))
-
-(defn guard
-  [b]
-  (if b
-    (return true)
-    (mzero)))
-
-(defn join
-  "Remove one level of monadic structure.
-  This is the same as `(bind mv identity)`."
-  [mv]
-  (bind mv identity))
-
-(defn fmap
-  "Apply a function `f` to the value wrapped in functor `fv`,
-  preserving the context type."
-  ([f]
-   (fn [fv]
-     (fmap f fv)))
-  ([f fv]
-   (let [ctx (ctx/infer fv)]
-     (ctx/with-context ctx
-       (p/-fmap ctx f fv)))))
-
-(defn bimap
-  "Map over both arguments at the same time.
-
-  Given functions `f` and `g` and a value wrapped in a bifunctor `bv`,
-  apply `f` to a first argument or `g` to a second argument.
-
-      (bimap dec inc (either/right 1)
-      ;; => #<Right 2>
-
-      (bimap dec inc (either/left 1)
-      ;; => #<Left 0>"
-  ([f g]
-   (fn [bv]
-     (bimap f g bv)))
-  ([f g bv]
-   (let [ctx (ctx/infer bv)]
-     (ctx/with-context ctx
-       (p/-bimap ctx f g bv)))))
-
-(defn left-map
-  "Map covariantly over the first argument.
-
-  Given a function `f` and a value wrapped in a bifunctor `bv`,
-  apply `f` to the first argument, if present, otherwise leave `bv` unchanged.
-
-      (left-map dec (either/right 1)
-      ;; => #<Right 1>
-
-      (left-map dec (either/left 1)
-      ;; => #<Left 0>"
-  ([f]
-   (fn [bv]
-     (left-map f bv)))
-  ([f bv]
-   (bimap f identity bv)))
-
-(defn right-map
-  "Map covariantly over the second argument.
-
-  Given a function `g` and a value wrapped in a bifunctor `bv`,
-  apply `g` to the second argument, if present, otherwise leave `bv` unchanged.
-
-      (right-map inc (either/right 1)
-      ;; => #<Right 2>
-
-      (right-map inc (either/left 1)
-      ;; => #<Left 1>"
-  ([g]
-   (fn [bv]
-     (right-map g bv)))
-  ([g bv]
-   (bimap identity g bv)))
-
-(defn fapply
-  "Given a function wrapped in a monadic context `af`,
-  and a value wrapped in a monadic context `av`,
-  apply the unwrapped function to the unwrapped value
-  and return the result, wrapped in the same context as `av`.
-
-  This function is variadic, so it can be used like
-  a Haskell-style left-associative fapply."
-  [af & avs]
-  {:pre [(seq avs)]}
-  (let [ctx (ctx/infer af)]
-    (reduce (partial p/-fapply ctx) af avs)))
-
-#?(:clj
-   (defmacro when
-     "Given an expression and a monadic value, if the expression is logical
-     true, return the monadic value.  Otherwise, return nil in a monadic
-     context."
-     ([b mv]
-      `(if ~b
-         (do ~mv)
-         (cats.core/pure nil)))
-     ([ctx b mv]
-      `(if ~b
-         (do ~mv)
-         (cats.core/pure ~ctx nil)))))
-
-#?(:clj
-   (defmacro unless
-     "Given an expression and a monadic value, if the expression is not logical
-     true, return the monadic value.  Otherwise, return nil in a monadic
-     context."
-     ([b mv]
-      `(if (not ~b)
-         (do ~mv)
-         (cats.core/pure nil)))
-     ([ctx b mv]
-      `(if (not ~b)
-         (do ~mv)
-         (cats.core/pure ~ctx nil)))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monadic Let Macro
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-#?(:clj
-   (defn- extract-bound-symbols
-     [bindings]
-     (->> bindings
-          (walk/prewalk #(if (map? %) (dissoc (update % :keys (partial map (comp symbol name))) :or) %))
-          (tree-seq coll? seq)
-          (filterv #(and (symbol? %) (not= '& %))))))
-
-#?(:clj
-   (defn- parse-step
-     [[l r] fn-bindings fn-sym]
-     (case l
-       :let
-       (let [normalized-bindings (extract-bound-symbols (conj fn-bindings (take-nth 2 r)))]
-         [`(let ~r (~fn-sym ~@normalized-bindings)) normalized-bindings])
-       :when
-       (let [normalized-bindings (extract-bound-symbols fn-bindings)]
-         [`(bind (guard ~r) (partial ~fn-sym ~@normalized-bindings)) (conj normalized-bindings '_)])
-       (let [normalized-bindings (extract-bound-symbols fn-bindings)]
-         [`(bind ~r (partial ~fn-sym ~@normalized-bindings)) (conj normalized-bindings l)]))))
-
-#?(:clj
-   (defmacro mlet
-     "Monad composition macro that works like Clojure's
-     `let`. This facilitates much easier composition of
-     monadic computations.
-
-     Let's see an example to understand how it works.
-     This code uses bind to compose a few operations:
-
-         (bind (just 1)
-               (fn [a]
-                 (bind (just (inc a))
-                         (fn [b]
-                           (return (* b 2))))))
-         ;=> #<Just [4]>
-
-     Now see how this code can be made clearer
-     by using the mlet macro:
-
-         (mlet [a (just 1)
-                b (just (inc a))]
-           (return (* b 2)))
-         ;=> #<Just [4]>
-     "
-     [bindings & body]
-     (when-not (and (vector? bindings)
-                    (not-empty bindings)
-                    (even? (count bindings)))
-       (throw (IllegalArgumentException. "bindings has to be a vector with even number of elements.")))
-     (let [first-sym (gensym)
-           [let-body new-fn-bindings] (parse-step (take 2 bindings) [] first-sym)]
-       (loop [rem-bindings (next (partition 2 bindings))
-              current-sym first-sym
-              fn-bindings new-fn-bindings
-              new-bindings []]
-         (if (empty? rem-bindings)
-           (list 'let (into [] cat [[current-sym `(fn ~'_ ~(conj ['&] fn-bindings) ~@body)] new-bindings]) let-body)
-           (let [new-sym (gensym)
-                 [expr new-fn-bindings] (parse-step (first rem-bindings) fn-bindings new-sym)]
-             (recur (next rem-bindings)
-                    new-sym
-                    new-fn-bindings
-                    (into [] cat [[current-sym `(fn ~'_ ~(conj ['&] fn-bindings) ~expr)] new-bindings]))))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Applicative Let Macro
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn- deps
-  [expr syms]
-  (cond
-    (and (symbol? expr)
-         (contains? syms expr))
-    (list expr)
-
-    (seq? expr)
-    (mapcat #(deps % syms) expr)
-
-    :else
-    '()))
-
-(defn- rename-sym
-  [expr renames]
-  (get renames expr expr))
-
-(defn- rename
-  [expr renames]
-  (cond
-    (symbol? expr)
-    (rename-sym expr renames)
-    (seq? expr)
-    (map #(rename % renames) expr)
-    :else
-    expr))
-
-(defn- dedupe-symbols*
-  [sym->ap body]
-  (letfn [(renamer [{:keys [body syms aps seen renames] :as summ} [s ap]]
-           (let [ap' (rename ap renames)
-                 new-aps (conj aps ap')]
-             (if (seen s)
-               (let [s' (gensym)
-                     new-syms (conj syms s')
-                     new-seen (conj seen s')
-                     new-renames (assoc renames s s')
-                     new-body (rename body new-renames)]
-                 {:syms new-syms
-                  :aps new-aps
-                  :seen new-seen
-                  :renames new-renames
-                  :body new-body})
-               (let [new-syms (conj syms s)
-                     new-seen (conj seen s)]
-                 {:syms new-syms
-                  :aps new-aps
-                  :seen new-seen
-                  :renames renames
-                  :body body}))))]
-    (let [summ
-          (reduce renamer
-                  {:syms []
-                   :aps []
-                   :seen #{}
-                   :renames {}
-                   :body body}
-                  sym->ap)]
-      [(mapv vector (:syms summ) (:aps summ)) (:body summ)])))
-
-(defn- dedupe-symbols
-  [bindings body]
-  (let [syms (map first bindings)
-        aps (map second bindings)
-        sym->ap (mapv vector syms aps)]
-    (dedupe-symbols* sym->ap body)))
-
-(defn- dependency-map
-  [sym->ap]
-  (let [syms (map first sym->ap)
-        symset (set syms)]
-    (into []
-          (clojure.core/for [[s ap] sym->ap
-                :let [ds (set (deps ap symset))]]
-            [s ds]))))
-
-(defn- remove-deps
-  [deps symset]
-  (let [removed (clojure.core/for [[s depset] deps]
-                  [s (clojure.set/difference depset symset)])]
-    (into (empty deps) removed)))
-
-(defn- topo-sort*
-  [deps seen batches current]
-  (if (empty? deps)
-    (conj batches current)
-    (let [dep (first deps)
-          [s dependencies] dep
-          dependant? (some dependencies seen)]
-      (if (nil? dependant?)
-        (recur (subvec deps 1)
-               (conj seen s)
-               batches
-               (conj current s))
-        (recur (remove-deps (subvec deps 1) (set current))
-               (conj seen s)
-               (conj batches current)
-               [s])))))
-
-(defn- topo-sort
-  [deps]
-  (let [syms (into #{} (map first deps))]
-    (topo-sort* deps #{} [] [])))
-
-(defn- bindings->batches
-  [bindings]
-  (let [syms (map first bindings)
-        aps (map second bindings)
-        sym->ap (mapv vector syms aps)
-        sorted-deps (topo-sort (dependency-map sym->ap))]
-    sorted-deps))
-
-(defn- alet*
-  [batches env body]
-  (let [fb (first batches)
-        rb (rest batches)
-        fs (first fb)
-        fa (get env fs)
-        code
-        (reduce (fn [acc syms]
-                  (let [fs (first syms)
-                        fa (get env fs)
-                        rs (rest syms)
-                        faps (map #(get env %) rs)]
-                    (if (= (count syms) 1)
-                      `(fmap (fn [~fs] ~acc) ~fa)
-                      (let [cf (reduce (fn [f sym] `(fn [~sym] ~f))
-                                       acc
-                                       (reverse syms))]
-                        `(fapply (fmap ~cf ~fa) ~@faps)))))
-                `(do ~@body)
-                (reverse batches))
-        join-count (dec (count batches))]
-    (reduce (fn [acc _]
-            `(join ~acc))
-        code
-        (range join-count))))
-
-#?(:clj
-   (defmacro alet
-     "Applicative composition macro similar to Clojure's
-     `let`. This macro facilitates composition of applicative
-     computations using `fmap` and `fapply` and evaluating
-     applicative values in parallel.
-
-     Let's see an example to understand how it works.
-     This code uses fmap for executing computations inside
-     an applicative context:
-
-       (fmap (fn [a] (inc a)) (just 1))
-       ;=> #<Just [2]>
-
-     Now see how this code can be made clearer
-     by using the alet macro:
-
-       (alet [a (just 1)]
-         (inc a))
-       ;=> #<Just [2]>
-
-     Let's look at a more complex example, imagine we have
-     dependencies between applicative values:
-
-       (join
-         (fapply
-          (fmap
-            (fn [a]
-              (fn [b]
-                (fmap (fn [c] (inc c))
-                      (just (+ a b)))))
-            (just 1))
-          (just 2)))
-       ;=> #<Just [4]>
-
-     This is greatly simplified using `alet`:
-
-       (alet [a (just 1)
-              b (just 2)
-              c (just (+ a b))]
-         (inc c))
-      ;=> #<Just [4]>
-
-     The intent of the code is much clearer and evaluates `a` and `b`
-     at the same time, then proceeds to evaluate `c` when all the values
-     it depends on are available. This evaluation strategy is specially
-     helpful for asynchronous applicatives."
-     [bindings & body]
-     (when-not (and (vector? bindings)
-                    (not-empty bindings)
-                    (even? (count bindings)))
-       (throw (IllegalArgumentException. "bindings has to be a vector with even number of elements.")))
-     (let [bindings (partition 2 bindings)
-           [bindings body] (dedupe-symbols bindings body)
-           batches (bindings->batches bindings)
-           env (into {} bindings)]
-       (if (and (= (count batches) 1)
-                (= (count (map first bindings)) 1))
-         `(fmap (fn [~@(map first bindings)]
-                  ~@body)
-                ~@(map second bindings))
-         (alet* batches env body)))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; applicative "idiomatic apply"
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defmacro ap
-  "Apply a pure function to applicative arguments, e.g.
-
-   (ap + (just 1) (just 2) (just 3))
-   ;; => #<Just [6]>
-   (ap str [\"hi\" \"lo\"] [\"bye\" \"woah\" \"hey\"])
-   ;; => [\"hibye\" \"hiwoah\" \"hihey\"
-          \"lobye\" \"lowoah\" \"lohey\"]
-
-   `ap` is essentially sugar for `(apply fapply (pure f) args)`,
-   but for the common case where you have a pure, uncurried,
-   possibly variadic function.
-
-   `ap` actually desugars in `alet` form:
-
-   (macroexpand-1 `(ap + (just 1) (just2)))
-   ;; => (alet [a1 (just 1) a2 (just 2)] (+ a1 a2))
-
-   That way, variadic functions Just Work, without needing to specify
-   an arity separately.
-
-   If you're familiar with Haskell, this is closest to writing
-   \"in Applicative style\": you can straightforwardly convert
-   pure function application to effectful application by with
-   some light syntax (<$> and <*> in case of Haskell, and `ap` here).
-
-   See the original Applicative paper for more inspiration:
-   http://staff.city.ac.uk/~ross/papers/Applicative.pdf"
-  [f & args]
-  (let [syms (repeatedly (count args) (partial gensym "arg"))]
-    `(alet [~@(interleave syms args)]
-        (~f ~@syms))))
-
-(defmacro ap->
-  "Thread like `->`, within an applicative idiom.
-
-  Compare:
-
-  (macroexpand-1 `(-> a b c (d e f)))
-  => (d (c (b a) e f)
-
-  with:
-
-  (macroexpand-1 `(ap-> a b c (d e f))
-  => (ap d (ap c (ap b a) e f))
-  "
-  [x & forms]
-  (loop [x x, forms forms]
-    (if forms
-      (let [form (first forms)
-            threaded (if (seq? form)
-                       (with-meta `(ap ~(first form) ~x ~@(next form)) (meta form))
-                       `(ap ~form ~x))]
-        (recur threaded (next forms)))
-      x)))
-
-(defmacro ap->>
-  "Thread like `->>`, within an applicative idiom.
-   See `cats.labs.sugar/ap->` for more in-depth discussion."
-  [x & forms]
-  (loop [x x, forms forms]
-    (if forms
-      (let [form (first forms)
-            threaded (if (seq? form)
-                       (with-meta `(ap ~(first form) ~@(next form)  ~x) (meta form))
-                       `(ap ~form ~x))]
-        (recur threaded (next forms)))
-      x)))
-
-(defmacro as-ap->
-  "Thread like `as->`, within an applicative idiom.
-   See `cats.labs.sugar/ap->` for more in-depth discussion."
-  [expr name & forms]
-  `(let [~name ~expr
-         ~@(interleave (repeat name) (clojure.core/for [form forms] `(ap ~@form)))]
-     ~name))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monadic arrow macros.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defmacro ->=
-  "Like `->`, but with monadic binding instead of pure application.
-   A mnemonic for the name is a pun on `>>=`, the monadic bind operator,
-   and clojure's regular arrow macros.
-
-   You can think of it as generalizing the `some->` thread macro
-   to all Monads instead of just Maybe.
-
-   Alternatively, if you think of the regular thread macro as
-   sugar for `let`:
-
-   (-> :a b (c (other args)) d)
-   =>
-   (let [res (b :a)
-         res (c res (other args))
-         res (d res)]
-     res)
-
-   Then `->=` is sugar for cats.core/mlet:
-
-   (->= m-a b (c (other args)) d)
-   (mlet [res m-a
-          res (c res (other args))
-          res (d res)]
-     (return res))
-
-   Note that extra args in this context are assumed pure, and will
-   be evaluated along with the function itself; this also matches
-   the behavior of `some->` wrt extra args.
-
-   Threading through pure functions is somewhat awkward, but can be done:
-
-   (->= m-a
-        monadic-fn
-        (-> pure-fn
-            other-pure-fn
-            m/return)
-        other-monadic-fn)"
-  [expr & forms]
-  (let [g (gensym)
-        pstep (fn [step] `(-> ~g ~step))]
-    `(mlet [~g ~expr
-              ~@(interleave (repeat g) (map pstep forms))]
-           (return ~g))))
-
-(defmacro ->>=
-  "Like ->>, but with monadic binding instead of pure application.
-   See `cats.labs.sugar/->=` for more in-depth discussion."
-  [expr & forms]
-  (let [g (gensym)
-        pstep (fn [step] `(->> ~g ~step))]
-    `(mlet [~g ~expr
-              ~@(interleave (repeat g) (map pstep forms))]
-           (return ~g))))
-
-(defmacro as->=
-  "Like `as->`, but with monadic binding instead of pure application.
-   See `cats.labs.sugar/->=` for more in-depth discussion."
-  [expr name & forms]
-  `(mlet [~name ~expr
-            ~@(interleave (repeat name) forms)]
-     (return ~name)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Curry Facilities
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn- arglists
-  [var]
-  (get (meta var) :arglists))
-
-(defn- single-arity?
-  [var]
-  (let [args (arglists var)]
-    (and (= (count args) 1)
-         (not (some #{'&} (first args))))))
-
-(defn- arity
-  [var]
-  {:pre [(single-arity? var)]}
-  (count (first (arglists var))))
-
-#?(:clj
-   (defmacro curry*
-     [args body]
-     (let [argcount (count args)]
-       (cond
-         (= argcount 0) `(fn f# [] ~body)
-         (= argcount 1) `(fn f#
-                           ([] f#)
-                           ([~@args] ~body))
-         :else
-         (let [arities (clojure.core/for [n (range 1 (count args))]
-                         `([~@(take n args)] (curry* ~(drop n args) ~body)))]
-           `(fn f#
-              ([] f#)
-              ~@arities
-              ([~@args] ~body)))))))
-
-#?(:clj
-   (defmacro curry
-     "Given either a fixed arity function or an arity and a function,
-     return another which is curried.
-
-     With inferred arity (function must have one fixed arity):
-
-         (defn add2 [x y] (+ x y))
-         (def cadd2 (curry add2))
-
-         ((cadd2 1) 3)
-         ;; => 4
-
-         (cadd2 1 3)
-         ;; => 4
-
-     With given arity:
-
-         (def c+ (curry 3 +))
-
-         ((c+ 1 2) 3)
-         ;; => 6
-
-         ((((c+) 1) 2) 3)
-         ;; => 6
-     "
-     ([f]
-      (if (not (symbol? f))
-        (throw (IllegalArgumentException. "You must provide an arity for currying anonymous functions"))
-        (let [fvar (resolve f)]
-          (if-let [args (arglists fvar)]
-            (if (single-arity? fvar)
-              `(curry ~(arity fvar) ~f)
-              (throw (IllegalArgumentException. "The given function is either variadic or has multiple arities, provide an arity for currying.")))
-            (throw (IllegalArgumentException. "The given function doesn't have arity metadata, provide an arity for currying."))))))
-     ([n f]
-      {:pre [(< n 21)]}
-      (let [args (repeatedly n gensym)
-            body `(~f ~@args)]
-        `(curry* ~args ~body)))))
-
-#?(:clj
-   (defmacro lift-m
-     "Lift a function with a given fixed arity to a monadic context.
-
-         (def monad+ (lift-m 2 +))
-
-         (monad+ (maybe/just 1) (maybe/just 2))
-         ;; => <Just [3]>
-
-         (monad+ (maybe/just 1) (maybe/nothing))
-         ;; => <Nothing>
-
-         (monad+ [0 2 4] [1 2])
-         ;; => [1 2 3 4 5 6]
-     "
-     ([f]
-      (if (not (symbol? f))
-        (throw (IllegalArgumentException.
-                "You must provide an arity for lifting anonymous functions"))
-        (let [fvar (resolve f)]
-          (if-let [args (arglists fvar)]
-            (if (single-arity? fvar)
-              `(lift-m ~(arity fvar) ~f)
-              (throw (IllegalArgumentException.
-                      "The given function is either variadic or has multiple arities, provide an arity for lifting.")))
-            (throw (IllegalArgumentException.
-                    "The given function doesn't have arity metadata, provide an arity for lifting."))))))
-     ([n f]
-      (let [val-syms (repeatedly n gensym)
-            mval-syms (repeatedly n gensym)
-            mlet-bindings (interleave val-syms mval-syms)]
-        `(fn [~@mval-syms]
-           (mlet [~@mlet-bindings]
-             (return (~f ~@val-syms))))))))
-
-#?(:clj
-   (defmacro lift-a
-     "Lift a function with a given fixed arity to an applicative context.
-
-         (def app+ (lift-a 2 +))
-
-         (app+ (maybe/just 1) (maybe/just 2))
-         ;; => <Just 3>
-
-         (app+ (maybe/just 1) (maybe/nothing))
-         ;; => <Nothing>
-
-         (app+ [0 2 4] [1 2])
-         ;; => [1 2 3 4 5 6]
-     "
-     ([f]
-      (if (not (symbol? f))
-        (throw (IllegalArgumentException.
-                "You must provide an arity for lifting anonymous functions"))
-        (let [fvar (resolve f)]
-          (if-let [args (arglists fvar)]
-            (if (single-arity? fvar)
-              `(lift-a ~(arity fvar) ~f)
-              (throw (IllegalArgumentException.
-                      "The given function is either variadic or has multiple arities, provide an arity for lifting.")))
-            (throw (IllegalArgumentException.
-                    "The given function doesn't have arity metadata, provide an arity for lifting."))))))
-     ([n f]
-      (let [val-syms (repeatedly n gensym)
-            mval-syms (repeatedly n gensym)
-            bindings (interleave val-syms mval-syms)]
-        `(fn [~@mval-syms]
-           (alet [~@bindings]
-             (~f ~@val-syms)))))))
-
-#?(:clj
-   (defmacro curry-lift-m
-     "Composition of `curry` and `lift-m`"
-     [n f]
-     `(curry ~n (lift-m ~n ~f))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Sequences.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn sequence
-  "Given a collection of monadic values, collect
-  their values in a seq returned in the monadic context.
-
-      (require '[cats.context :as ctx]
-               '[cats.monad.maybe :as maybe]
-               '[cats.core :as m])
-
-      (m/sequence [(maybe/just 2) (maybe/just 3)])
-      ;; => #<Just [[2, 3]]>
-
-      (m/sequence [(maybe/nothing) (maybe/just 3)])
-      ;; => #<Nothing>
-
-      (ctx/with-context maybe/context
-        (m/sequence []))
-      ;; => #<Just [()]>
-  "
-  [mvs]
-  (if (empty? mvs)
-    (return ())
-    (let [ctx (ctx/infer (first mvs))]
-      (ctx/with-context ctx
-        (reduce (fn [mvs mv]
-                  (mlet [v mv
-                         vs mvs]
-                    (return (cons v vs))))
-                (return ())
-                (reverse mvs))))))
-
-(defmacro for
-  "Syntactic wrapper for (sequence (for [,,,] mv)).
-
-      (require '[cats.core :as m]
-               '[cats.monad.maybe :as maybe])
-
-      (m/for [x [2 3]] (maybe/just x))
-      ;; => #<Just [[2, 3]]>
-
-  See cats.core/sequence
-  See clojure.core/for"
-  [seq-exprs body-expr]
-  `(sequence (clojure.core/for ~seq-exprs ~body-expr)))
-
-(defn mapseq
-  "Given a function `mf` that takes a value and puts it into a
-  monadic context, and a collection, map `mf` over the collection,
-  calling `sequence` on the results.
-
-      (require '[cats.context :as ctx]
-               '[cats.monad.maybe :as maybe]
-               '[cats.core :as m])
-
-      (m/mapseq maybe/just [2 3])
-      ;=> <Just [[2 3]]>
-
-      (m/mapseq (fn [v]
-                  (if (odd? v)
-                    (maybe/just v)
-                    (maybe/nothing)))
-                [1 2])
-      ;; => #<Nothing>
-
-      (ctx/with-context maybe/context
-        (mapseq #(maybe/just (* % 2)) []))
-      ;; => #<Just [()]>
-  "
-  [mf coll]
-  (sequence (map mf coll)))
-
-(defn forseq
-  "Same as `mapseq` but with the arguments flipped.
-
-  Let's see a little example:
-
-      (m/forseq [2 3] maybe/just)
-      ;; => <Just [[2 3]]>
-
-  Yet an other example that fails:
-
-      (m/forseq [1 2]
-                (fn [v]
-                  (if (odd? v)
-                    (maybe/just v)
-                    (maybe/nothing))))
-      ;; => <Nothing>
-  "
-  [vs mf]
-  (mapseq mf vs))
-
-(defn filter
-  "Apply a predicate to a value in a `MonadZero` instance,
-  returning the identity element when the predicate does not hold.
-
-  Otherwise, return the instance unchanged.
-
-      (require '[cats.monad.maybe :as maybe])
-      (require '[cats.core :as m])
-
-      (m/filter (partial < 2) (maybe/just 3))
-      ;=> <Just [3]>
-
-      (m/filter (partial < 4) (maybe/just 3))
-      ;=> <Nothing>
-  "
-  [p mv]
-  (mlet [v mv
-         :when (p v)]
-    (return v)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Haskell-style aliases and util functions.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def <$>
-  "A Haskell-style `fmap` alias."
-  fmap)
-
-(def <*>
-  "A Haskell-style `fapply` alias."
-  fapply)
-
-(defn >>=
-  "Perform a Haskell-style left-associative bind.
-
-  Let's see it in action:
-
-      (>>= (just 1) (comp just inc) (comp just inc))
-      ;; => #<Just [3]>
-  "
-  ([mv f]
-   (bind mv f))
-  ([mv f & fs]
-   (reduce bind mv (cons f fs))))
-
-(defn >>
-  "Perform a Haskell-style left-associative bind,
-  ignoring the values produced by the monadic computations."
-  ([mv mv']
-   (bind mv (fn [_] mv')))
-  ([mv mv' & mvs]
-   (reduce >> mv (cons mv' mvs))))
-
-(defn =<<
-  "Same as the two argument version of `>>=` but with the
-  arguments flipped."
-  [f mv]
-  (>>= mv f))
-
-(defn >=>
-  "Left-to-right composition of monads."
-  [mf mg x]
-  (ctx/with-context (ctx/infer mf)
-    (mlet [a (mf x)
-           b (mg a)]
-      (return b))))
-
-(defn <=<
-  "Right-to-left composition of monads.
-  Same as `>=>` with its first two arguments flipped."
-  [mg mf x]
-  (ctx/with-context (ctx/infer mf)
-    (mlet [a (mf x)
-           b (mg a)]
-      (return b))))
-
-(defn extract
-  "Generic function to unwrap/extract
-  the inner value of a container."
-  [v]
-  (p/-extract v))
-
-(def <> mappend)
-
-(defn foldr
-  "Perform a right-associative fold on the data structure."
-  [f z xs]
-  (let [ctx (p/-get-context xs)]
-    (ctx/with-context ctx
-      (p/-foldr ctx f z xs))))
-
-(defn foldl
-  "Perform a left-associative fold on the data structure."
-  [f z xs]
-  (let [ctx (p/-get-context xs)]
-    (ctx/with-context ctx
-      (p/-foldl ctx f z xs))))
-
-(defn foldm
-  "Given an optional monadic context, a function that takes two non-monadic
-  arguments and returns a value inside the given monadic context, an initial
-  value, and a collection of values, perform a left-associative fold.
-
-      (require '[cats.context :as ctx]
-               '[cats.core :as m]
-               '[cats.monad.maybe :as maybe])
-
-      (defn m-div [x y]
-        (if (zero? y)
-          (maybe/nothing)
-          (maybe/just (/ x y))))
-
-      (m/foldm m-div 1 [1 2 3])
-      (m/foldm maybe/context m-div 1 [1 2 3])
-      ;; => #<Just 1/6>
-
-      (m/foldm maybe/context m-div 1 [1 0 3])
-      ;; => #<Nothing>
-
-      (foldm m-div 1 [])
-      ;; => Exception
-
-      (m/foldm maybe/context m-div 1 [])
-      (ctx/with-context maybe/context
-        (foldm m-div 1 []))
-      ;; => #<Just 1>
-  "
-  ([f z xs]
-   (if (empty? xs)
-     (return z)
-     (let [[h & t] xs]
-       (mlet [z' (f z h)]
-         (if (empty? t)
-           (return z')
-           (foldm f z' t))))))
-  ([ctx f z xs]
-   (if (empty? xs)
-     (return ctx z)
-     (foldm f z xs))))
-
-(defn traverse
-  "Map each element of a structure to an action, evaluate these
-  actions from left to right, and collect the results.
-
-      (defn inc-if-even
-        [n]
-        (if (even? n)
-          (maybe/just (inc n))
-          (maybe/nothing)))
-
-      (ctx/with-context maybe/context
-        (m/traverse inc-if-even [2 4]))
-      ;; => #<Just [3 4]>
-  "
-  ([f tv]
-   (p/-traverse (p/-get-context tv) f tv))
-  ([ctx f tv]
-   (ctx/with-context ctx
-     (p/-traverse (p/-get-context tv) f tv))))
-
-(defmacro do-let
-  "Haskell-inspired monadic do notation
-   it allows one to drop the _ when  we don't need the extracted value
-
-  Basically,
-  (do-let
-    a
-    b
-    [c d
-     e f]
-    x
-    y)
-
-  Translates into:
-
-  (mlet
-    [_ a
-     _ b
-     c d
-     e f
-     _ x]
-    y)
-  "
-  [& forms]
-  (assert (not (empty? forms)) "do-let must have at least one argument")
-  (assert (not (vector? (last forms))) "Last argument of do-let must not be a vector")
-  (if (= 1 (count forms))
-    `(do (assert (not (satisfies? p/Monad ~(first forms))) "Single argument of do-let must implement Monad protocol")
-         ~(first forms))
-    `(mlet ~(vec (reduce (fn [acc form]
-                           (cond (vector? form) (into acc form)
-                                 :else          (into acc ['_ form])))
-                         []
-                         (butlast forms)))
-       ~(last forms))))
diff --git a/src/cats/data.cljc b/src/cats/data.cljc
deleted file mode 100644
index b977712..0000000
--- a/src/cats/data.cljc
+++ /dev/null
@@ -1,141 +0,0 @@
-;; Copyright (c) 2014-2015 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2015 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.data
-  "Data structures that are used in various places of the library."
-  (:require [cats.protocols :as p]
-            [cats.context :as ctx]
-            [cats.util :as util]))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Pair type constructor and functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(declare context)
-
-(deftype Pair [fst snd]
-  #?(:clj  clojure.lang.Seqable
-     :cljs cljs.core/ISeqable)
-  (#?(:clj seq :cljs -seq) [_]
-    (list fst snd))
-
-  #?(:clj  clojure.lang.Indexed
-     :cljs cljs.core/IIndexed)
-  (#?(:clj nth :cljs -nth) [_ i]
-    (case i
-      0 fst
-      1 snd
-      (throw #?(:clj (IndexOutOfBoundsException.)
-                :cljs (js/Error. "Out of index")))))
-
-  (#?(:clj nth :cljs -nth) [_ i notfound]
-    (case i
-      0 fst
-      1 snd
-      notfound))
-
-  #?(:clj  clojure.lang.Counted
-     :cljs cljs.core/ICounted)
-  (#?(:clj count :cljs -count) [_] 2)
-
-  #?(:clj  java.lang.Object
-     :cljs cljs.core/IEquiv)
-  (#?(:clj equals :cljs -equiv) [this other]
-    (if (instance? Pair other)
-      (and (= (.-fst this) (.-fst ^Pair other))
-           (= (.-snd this) (.-snd ^Pair other)))
-      false))
-
-  p/Printable
-  (-repr [_]
-    (str "#<Pair [" (pr-str fst) " " (pr-str snd) "]>"))
-
-  p/Contextual
-  (-get-context [data] context))
-
-(alter-meta! #'->Pair assoc :private true)
-
-(util/make-printable Pair)
-
-(defn pair
-  [fst snd]
-  (Pair. fst snd))
-
-(defn pair?
-  [v]
-  (instance? Pair v))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Context definitions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (pair
-        (p/-mappend (p/-get-context (.-fst ^Pair sv))
-                    (.-fst ^Pair sv) (.-fst ^Pair sv'))
-        (p/-mappend (p/-get-context (.-snd ^Pair sv))
-                    (.-snd ^Pair sv) (.-snd ^Pair sv'))))
-
-    p/Functor
-    (-fmap [_ f mv]
-      (pair (.-fst ^Pair mv) (f (.-snd ^Pair mv))))
-
-    p/Bifunctor
-    (-bimap [_ f g s]
-      (pair (f (.-fst ^Pair s)) (g (.-snd ^Pair s))))
-
-    p/Foldable
-    (-foldl [_ f z mv]
-      (f z (.-snd ^Pair mv)))
-
-    (-foldr [_ f z mv]
-      (f (.-snd ^Pair mv) z))
-
-    p/Traversable
-    (-traverse [_ f mv]
-      (let [a (f (.-snd ^Pair mv))]
-        (p/-fmap (p/-get-context a) #(pair (.-fst ^Pair mv) %) a)))))
-
-(defn pair-monoid
-  "A pair monoid type constructor."
-  [inner-monoid]
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (pair
-       (p/-mappend inner-monoid (.-fst ^Pair sv) (.-fst ^Pair sv'))
-       (p/-mappend inner-monoid (.-snd ^Pair sv) (.-snd ^Pair sv'))))
-
-    p/Monoid
-    (-mempty [_]
-      (pair
-       (p/-mempty inner-monoid)
-       (p/-mempty inner-monoid)))))
diff --git a/src/cats/labs/channel.cljc b/src/cats/labs/channel.cljc
deleted file mode 100644
index 51d600a..0000000
--- a/src/cats/labs/channel.cljc
+++ /dev/null
@@ -1,110 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.labs.channel
-  #?(:cljs (:require-macros [cljs.core.async.macros :refer [go go-loop]]))
-  #?(:cljs (:require [cljs.core.async :as a]
-                     [cljs.core.async.impl.protocols :as impl]
-                     [cats.context :as ctx]
-                     [cats.core :as m]
-                     [cats.protocols :as p]
-                     [cats.util :as util])
-     :clj  (:require [clojure.core.async :refer [go go-loop] :as a]
-                     [clojure.core.async.impl.protocols :as impl]
-                     [cats.context :as ctx]
-                     [cats.core :as m]
-                     [cats.protocols :as p]
-                     [cats.util :as util])))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monad definition
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn with-value
-  "Simple helper that creates a channel and attach
-  an value to it."
-  ([value] (with-value value (a/chan)))
-  ([value ch]
-   (a/put! ch value)
-   ch))
-
-(defn channel?
-  "Return true if a `c` is a channel."
-  [c]
-  (instance? #?(:clj  clojure.core.async.impl.channels.ManyToManyChannel
-                :cljs cljs.core.async.impl.channels.ManyToManyChannel) c))
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-    p/Functor
-    (-fmap [_ f mv]
-      (a/pipe mv (a/chan 1 (map f))))
-
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (a/merge [sv sv']))
-
-    p/Monoid
-    (-mempty [_]
-      (a/to-chan []))
-
-    p/Applicative
-    (-pure [_ v]
-      (a/to-chan [(if (nil? v) ::nil v)]))
-
-    (-fapply [mn af av]
-      (a/map #(%1 %2) [af av]))
-
-    p/Monad
-    (-mreturn [_ v]
-      (a/to-chan [(if (nil? v) ::nil v)]))
-
-    (-mbind [it mv f]
-      (let [ctx ctx/*context*
-            out (a/chan)
-            bindf #(binding [ctx/*context* ctx] (f %))]
-        (a/pipeline-async 1 out #(a/pipe (bindf %1) %2) mv)
-        out))
-
-    p/MonadZero
-    (-mzero [it]
-      (a/to-chan []))
-
-    p/MonadPlus
-    (-mplus [it mv mv']
-      (a/merge [mv mv']))
-
-    p/Printable
-    (-repr [_]
-      "#<Channel>")))
-
-(util/make-printable (type context))
-
-(extend-type #?(:clj  clojure.core.async.impl.channels.ManyToManyChannel
-                :cljs cljs.core.async.impl.channels.ManyToManyChannel)
-  p/Contextual
-  (-get-context [_] context))
diff --git a/src/cats/labs/manifold.clj b/src/cats/labs/manifold.clj
deleted file mode 100644
index adfaed2..0000000
--- a/src/cats/labs/manifold.clj
+++ /dev/null
@@ -1,116 +0,0 @@
-;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2015-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.labs.manifold
-  (:require [manifold.deferred :as d]
-            [manifold.stream :as s]
-            [cats.context :as ctx]
-            [cats.core :as m]
-            [cats.protocols :as p]
-            [cats.monad.either :as either]
-            [cats.util :as util]))
-
-(defn- with-timeout
-  [timeout timeout-value d]
-  (when timeout
-    (if timeout-value
-      (d/timeout! d timeout timeout-value)
-      (d/timeout! d timeout)))
-  d)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monad definition
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(deftype DeferredContext [timeout timeout-value]
-  Object
-  (equals [self other]
-    ;; Two context with different values are considered
-    ;; equals because as context they are represent
-    ;; the same context.
-    ;; FIXME: abstract this using own abstraction
-    ;; without overriding the default equality checks.
-    (instance? DeferredContext other))
-
-  p/Context
-  p/Functor
-  (-fmap [_ f mv]
-    (with-timeout timeout timeout-value
-      (d/chain mv f)))
-
-  p/Applicative
-  (-pure [_ v]
-    (d/success-deferred v))
-
-  (-fapply [mn af av]
-    (with-timeout timeout timeout-value
-      (d/chain (d/zip' af av)
-               (fn [[afv avv]]
-                 (afv avv)))))
-
-  p/Semigroup
-  (-mappend [ctx mv mv']
-    (with-timeout timeout timeout-value
-      (d/chain (d/zip' mv mv')
-               (fn [[mvv mvv']]
-                 (let [ctx (p/-get-context mvv)]
-                   (p/-mappend ctx mvv mvv'))))))
-
-  p/Monad
-  (-mreturn [_ v]
-    (d/success-deferred v))
-
-  (-mbind [it mv f]
-    (with-timeout timeout timeout-value
-      (d/chain mv (fn [v]
-                    (ctx/with-context it
-                      (f v))))))
-
-  p/Printable
-  (-repr [_]
-    "#<Deferred>"))
-
-(defn deferred-context*
-  ([] (deferred-context* nil nil))
-  ([timeout] (deferred-context* timeout nil))
-  ([timeout timeout-value]
-   (DeferredContext. timeout timeout-value)))
-
-(def ^{:doc "A default context for manifold deferred."}
-  deferred-context (deferred-context*))
-
-(util/make-printable (type deferred-context))
-
-(extend-type manifold.deferred.Deferred
-  p/Contextual
-  (-get-context [_] deferred-context))
-
-(extend-type manifold.deferred.SuccessDeferred
-  p/Contextual
-  (-get-context [_] deferred-context))
-
-(extend-type manifold.deferred.ErrorDeferred
-  p/Contextual
-  (-get-context [_] deferred-context))
diff --git a/src/cats/labs/promise.cljc b/src/cats/labs/promise.cljc
deleted file mode 100644
index 8d6b224..0000000
--- a/src/cats/labs/promise.cljc
+++ /dev/null
@@ -1,74 +0,0 @@
-(ns cats.labs.promise
-  "A promise monad that uses promesa library."
-  (:require [cats.core :as m]
-            [cats.context :as mc]
-            [cats.protocols :as mp]
-            [promesa.core :as p]
-            [promesa.impl :as pi]
-            [promesa.protocols :as pp])
-  #?(:clj
-     (:import java.util.concurrent.CompletableFuture)))
-
-(declare context)
-
-#?(:cljs
-   (defn extend-promise!
-     [t]
-     (extend-type t
-       mp/Contextual
-       (-get-context [_] context)
-
-       mp/Extract
-       (-extract [it]
-         (pp/-extract it)))))
-
-#?(:cljs (extend-promise! pi/*default-promise*))
-
-#?(:clj
-   (extend-type CompletableFuture
-     mp/Contextual
-     (-get-context [_] context)
-
-     mp/Extract
-     (-extract [it]
-       (pp/-extract it))))
-
-(def ^:no-doc context
-  (reify
-    mp/Context
-    mp/Functor
-    (-fmap [mn f mv]
-      (pp/-map mv f))
-
-    mp/Bifunctor
-    (-bimap [_ err succ mv]
-      (-> mv
-          (pp/-map succ)
-          (pp/-thenErr err)))
-
-    mp/Monad
-    (-mreturn [_ v]
-      (pp/-promise v))
-
-    (-mbind [mn mv f]
-      (pp/-bind mv f))
-
-    mp/Applicative
-    (-pure [_ v]
-      (pp/-promise v))
-
-    (-fapply [_ pf pv]
-      (pp/-map (p/all [pf pv])
-               (fn [[f v]]
-                 (f v))))
-
-    mp/Semigroup
-    (-mappend [_ mv mv']
-      (pp/-map (m/sequence [mv mv'])
-               (fn [[mvv mvv']]
-                 (let [ctx (mp/-get-context mvv)]
-                   (mp/-mappend ctx mvv mvv')))))))
-
-(def ^:deprecated promise-context
-  "Deprecated alias for `context`."
-  context)
diff --git a/src/cats/labs/test.cljc b/src/cats/labs/test.cljc
deleted file mode 100644
index dc5cdb2..0000000
--- a/src/cats/labs/test.cljc
+++ /dev/null
@@ -1,198 +0,0 @@
-;; Copyright (c) 2015 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2015 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.labs.test
-  (:require [cats.context :as ctx :include-macros true]
-            [cats.core :as m]
-            [cats.protocols :as p]
-            [clojure.test.check.generators :as gen]
-            [clojure.test.check.properties :as prop :include-macros true]))
-
-;; Generator context
-
-(def gen-context
-  (reify
-    p/Context
-    p/Functor
-    (-fmap [_ f mv]
-      (gen/fmap f mv))
-
-    p/Applicative
-    (-pure [_ v]
-      (gen/return v))
-    (-fapply [_ gf gv]
-      (m/mlet [f gf
-               v gv]
-        (m/return (f v))))
-
-    p/Monad
-    (-mreturn [_ v]
-      (gen/return v))
-
-    (-mbind [_ mv f]
-      (gen/bind mv f))))
-
-(extend-type clojure.test.check.generators.Generator
-  p/Contextual
-  (-get-context [_] gen-context))
-
-;; Semigroup
-
-(defn semigroup-associativity
-  [{:keys [ctx gen eq] :or {eq =}}]
-  (prop/for-all [x gen
-                 y gen
-                 z gen]
-    (ctx/with-context ctx
-      (eq (m/mappend (m/mappend x y) z)
-          (m/mappend x (m/mappend y z))))))
-
-;; Monoid
-
-(defn monoid-identity-element
-  [{:keys [ctx gen empty eq] :or {empty (m/mempty ctx) eq =}}]
-  (prop/for-all [x gen]
-    (ctx/with-context-override ctx
-      (eq x
-          (m/mappend x empty)
-          (m/mappend empty x)))))
-
-;; Functor laws
-
-(defn first-functor-law
-  [{:keys [gen eq] :or {eq =}}]
-  (prop/for-all [fa gen]
-    (eq fa
-        (m/fmap identity fa))))
-
-(defn second-functor-law
-  [{:keys [gen f g eq] :or {eq =}}]
-  (prop/for-all [fa gen]
-    (eq (m/fmap (comp g f) fa)
-        (m/fmap g (m/fmap f fa)))))
-
-;; Bifunctor laws
-
-(defn bifunctor-first-identity
-  [{:keys [gen eq] :or {eq =}}]
-  (prop/for-all [bv gen]
-    (eq bv (m/left-map identity bv))))
-
-(defn bifunctor-second-identity
-  [{:keys [gen eq] :or {eq =}}]
-  (prop/for-all [bv gen]
-    (eq bv
-        (m/right-map identity bv))))
-
-(defn bifunctor-bimap-identity
-  [{:keys [gen eq] :or {eq =}}]
-  (prop/for-all [bv gen]
-    (eq bv
-        (m/bimap identity identity bv))))
-
-(defn bifunctor-composition
-  [{:keys [gen f g eq] :or {eq =}}]
-  (prop/for-all [bv gen]
-    (eq (m/bimap f g bv)
-        (m/left-map f (m/right-map g bv)))))
-
-;; Applicative laws
-
-(defn applicative-identity-law
-  [{:keys [ctx gen eq] :or {eq =}}]
-  (prop/for-all [app gen]
-    (eq app
-        (m/fapply (m/pure ctx identity) app))))
-
-(defn applicative-homomorphism
-  [{:keys [ctx gen f eq] :or {eq =}}]
-  (prop/for-all [x gen]
-    (eq (m/pure ctx (f x))
-        (m/fapply (m/pure ctx f) (m/pure ctx x)))))
-
-(defn applicative-interchange
-  [{:keys [ctx gen appf eq] :or {eq =}}]
-  (prop/for-all [x gen]
-    (eq (m/fapply appf (m/pure ctx x))
-        (m/fapply (m/pure ctx (fn [f] (f x))) appf))))
-
-(defn applicative-composition
-  [{:keys [ctx gen appf appg eq] :or {eq =}}]
-  (prop/for-all [x gen]
-    (eq (m/fapply appg
-                  (m/fapply appf (m/pure ctx x)))
-        (m/fapply (m/pure ctx (m/curry 2 comp))
-                  appf
-                  appg
-                  (m/pure ctx x)))))
-
-;; Monad laws
-
-(defn first-monad-law
-  [{:keys [ctx mf gen eq] :or {gen gen/any eq =}}]
-  (prop/for-all [a gen]
-    (eq (mf a)
-        (m/>>= (m/return ctx a) mf))))
-
-(defn second-monad-law
-  [{:keys [ctx eq] :or {eq =}}]
-  (prop/for-all [a gen/any]
-    (let [m (m/return ctx a)]
-      (eq m
-          (m/>>= m m/return)))))
-
-(defn third-monad-law
-  [{:keys [ctx f g eq] :or {eq =}}]
-  (prop/for-all [a gen/any]
-    (let [m (m/return ctx a)]
-      (eq (m/>>= (m/>>= m f) g)
-          (m/>>= m (fn [x] (m/>>= (f x) g)))))))
-
-;; MonadPlus
-
-(defn monadplus-associativity
-  [{:keys [ctx gen eq] :or {eq =}}]
-  (prop/for-all
-   [x gen y gen z gen]
-   (eq (m/mplus (m/mplus x y) z)
-       (m/mplus x (m/mplus y z)))))
-
-;; MonadZero
-
-(defn monadzero-identity-element
-  [{:keys [ctx gen eq] :or {eq =}}]
-  (prop/for-all [x gen]
-    (ctx/with-context ctx
-      (eq x
-          (m/mplus x (m/mzero ctx))
-          (m/mplus (m/mzero ctx) x)))))
-
-(defn monadzero-bind
-  [{:keys [ctx gen zero eq] :or {zero (m/mzero ctx) eq =}}]
-  (prop/for-all [m gen]
-    (ctx/with-context ctx
-      (eq zero
-          (m/>>= zero (fn [v] (m/return v)))
-          (m/>> m zero)))))
diff --git a/src/cats/monad/either.cljc b/src/cats/monad/either.cljc
deleted file mode 100644
index babee50..0000000
--- a/src/cats/monad/either.cljc
+++ /dev/null
@@ -1,269 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.monad.either
-  "The Either monad implementation and helper functions
-  for working with either related types.
-
-  Also commonly known as Error monad.
-
-      (require '[cats.monad.either :as either])
-
-      (either/right 1)
-      ;; => #<Right [1]>
-
-      (either/left 1)
-      ;; => #<Left [1]>
-  "
-  (:require [cats.protocols :as p]
-            [cats.context :as ctx]
-            [cats.util :as util]))
-
-;; --- Type constructor and functions
-
-(declare context)
-
-(defrecord Right [right]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] right)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Right " (pr-str right) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] right)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] right)]))
-
-(defrecord Left [left]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] left)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Left " (pr-str left) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] left)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] left)]))
-
-(alter-meta! #'->Right assoc :private true)
-(alter-meta! #'->Left assoc :private true)
-
-(util/make-printable Right)
-(util/make-printable Left)
-
-(defn left
-  "A Left type constructor."
-  ([] (->Left nil))
-  ([v] (->Left v)))
-
-(defn right
-  "A Right type constructor."
-  ([] (->Right nil))
-  ([v] (->Right v)))
-
-(defn left?
-  "Return true if `v` is an instance
-  of Left type."
-  [v]
-  (instance? Left v))
-
-(defn right?
-  "Return true if `v` is an instance
-  of Right type."
-  [v]
-  (instance? Right v))
-
-(defn either?
-  "Return true in case of `v` is instance
-  of Either monad."
-  [v]
-  (cond
-    (or (instance? Right v)
-        (instance? Left v))
-    true
-
-    (satisfies? p/Contextual v)
-    (identical? (p/-get-context v) context)
-
-    :else false))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monad definition
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-
-    p/Semigroup
-    (-mappend [_ sv sv']
-      (if (right? sv)
-        sv
-        sv'))
-
-    p/Functor
-    (-fmap [_ f s]
-      (if (right? s)
-        (right (f (p/-extract ^Right s)))
-        s))
-
-    p/Bifunctor
-    (-bimap [_ f g s]
-      (if (left? s)
-        (left  (f (p/-extract ^Left s)))
-        (right (g (p/-extract ^Right s)))))
-
-    p/Applicative
-    (-pure [_ v]
-      (right v))
-
-    (-fapply [m af av]
-      (if (right? af)
-        (p/-fmap m (p/-extract ^Right af) av)
-        af))
-
-    p/Monad
-    (-mreturn [_ v]
-      (right v))
-
-    (-mbind [_ s f]
-      (assert (either? s) (str "Context mismatch: " (p/-repr s)
-                               " is not allowed to use with either context."))
-      (if (right? s)
-        (f (p/-extract ^Right s))
-        s))
-
-    p/MonadZero
-    (-mzero [_]
-      (left))
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (if (right? mv)
-        mv
-        mv'))
-
-    p/Foldable
-    (-foldl [_ f z mv]
-      (if (right? mv)
-        (f z (p/-extract mv))
-        z))
-
-    (-foldr [_ f z mv]
-      (if (right? mv)
-        (f (p/-extract mv) z)
-        z))
-
-    p/Traversable
-    (-traverse [_ f mv]
-      (if (right? mv)
-        (let [a (f (p/-extract mv))]
-          (p/-fmap (p/-get-context a) right a))
-        (p/-pure (ctx/infer) mv)))
-
-    p/Printable
-    (-repr [_]
-      "#<Either>")))
-
-(util/make-printable (type context))
-
-;; --- Utility functions
-
-(defn branch
-  "Given an either value and two functions, if the either is a
-  left apply the first function to the value it contains; if the
-  either is a right apply the second function to its value."
-  [e lf rf]
-  {:pre [(either? e)]}
-  (if (left? e)
-    (lf (p/-extract e))
-    (rf (p/-extract e))))
-
-(def either branch)
-
-(defn branch-left
-  "Given an either value and a function, if the either is a
-  left, apply the function to the value it contains; if the
-  either is a right, return it."
-  [e lf]
-  {:pre [(either? e)]}
-  (branch e lf right))
-
-(defn branch-right
-  "Either-specific synonym for #'cats.core/bind
-
-  Given an either value and a function, if the either is a
-  right, apply the function to the value it contains; if the
-  either is a left, return it."
-  [e rf]
-  {:pre [(either? e)]}
-  (p/-mbind context e rf))
-
-(def lefts
-  "Given a collection of eithers, return only the values that are left."
-  (partial filter left?))
-
-(def rights
-  "Given a collection of eithers, return only the values that are right."
-  (partial filter right?))
-
-(def first-left
-  "Given a collection of either, return the first value that is left"
-  (comp first lefts))
-
-(def first-right
-  "Given a collection of either, return the first value that is right"
-  (comp first rights))
-
-(defn invert
-  "Convert a left to a right or viceversa, preserving content."
-  [e]
-  {:pre [(either? e)]}
-  (if (left? e)
-    (right (p/-extract e))
-    (left (p/-extract e))))
-
-#?(:clj
-   (defmacro try-either
-     "Try to evalute the body and return the result as an either.
-     If an exception is thrown return the exception as a left,
-     otherwise return the result as a right."
-     [& body]
-     ;; detect compilation of a cljs namespace and inject the appropriate error
-     ;; see https://groups.google.com/forum/#!topic/clojurescript/iBY5HaQda4A
-     (if (:ns &env)
-       `(try (right (do ~@body)) (catch js/Error e# (left e#)))
-       `(try (right (do ~@body)) (catch Exception e# (left e#))))))
diff --git a/src/cats/monad/exception.cljc b/src/cats/monad/exception.cljc
deleted file mode 100644
index b4ae462..0000000
--- a/src/cats/monad/exception.cljc
+++ /dev/null
@@ -1,290 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.monad.exception
-  "The Exception monad.
-
-  Also known as Try monad, popularized by Scala.
-
-  It represents a computation that may either result
-  in an exception or return a successfully computed
-  value. Is very similar to Either monad, but is
-  semantically different.
-
-  It consists in two types: Success and Failure. The
-  Success type is a simple wrapper like Right of Either
-  monad. But the Failure type is slightly different
-  from Left, because it is forced to wrap an instance
-  of Throwable (or Error in cljs).
-
-  The most common use case of this monad is for wrap
-  third party libraries that uses standard Exception
-  based error handling. In normal circumstances you
-  should use Either instead.
-
-  The types defined for Exception monad (Success and
-  Failure) also implementes the clojure IDeref interface
-  which facilitates libraries developing using monadic
-  composition without forcing a user of that library
-  to use or understand monads.
-
-  That is because when you will dereference the
-  failure instance, it will reraise the containing
-  exception."
-
-  (:require [cats.protocols :as p]
-            [cats.util :as util]
-            #?(:clj [cats.context :as ctx]
-               :cljs [cats.context :as ctx :include-macros true]))
-  #?(:cljs
-     (:require-macros [cats.monad.exception :refer (try-on)])))
-
-;; --- Helpers
-
-(defn throw-exception
-  [^String message]
-  (throw (#?(:clj IllegalArgumentException.
-             :cljs js/Error.)
-            message)))
-
-(defn throwable?
-  "Return true if `v` is an instance of
-  the Throwable or js/Error type."
-  [e]
-  (instance? #?(:clj Throwable :cljs js/Error) e))
-
-;; --- Types and implementations.
-
-(declare context)
-
-(defrecord Success [success]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] success)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Success " (pr-str success) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] success)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] success)]))
-
-(defrecord Failure [failure]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] failure)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Failure " (pr-str failure) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] (throw failure))]
-      :clj  [clojure.lang.IDeref
-             (deref [_] (throw failure))]))
-
-(alter-meta! #'->Success assoc :private true)
-(alter-meta! #'->Failure assoc :private true)
-
-(util/make-printable Success)
-(util/make-printable Failure)
-
-(defn success
-  "A Success type constructor.
-
-  It wraps any arbitrary value into
-  success type."
-  [v]
-  (Success. v))
-
-(defn failure
-  "A failure type constructor.
-
-  If a provided parameter is an exception, it wraps
-  it in a `Failure` instance and return it. But if
-  a provided parameter is arbitrary data, it tries
-  create an exception from it using clojure `ex-info`
-  function.
-
-  Take care that `ex-info` function in clojurescript
-  differs a little bit from clojure."
-  ([e] (failure e ""))
-  ([e message]
-   (if (throwable? e)
-     (Failure. e)
-     (Failure. (ex-info message e)))))
-
-(defn success?
-  "Return true if `v` is an instance of
-  the Success type."
-  [v]
-  (instance? Success v))
-
-(defn failure?
-  "Return true if `v` is an instance of
-  the Failure type."
-  [v]
-  (instance? Failure v))
-
-(defn exception?
-  "Return true in case of `v` is instance
-  of Exception monad."
-  [v]
-  (cond
-    (or (instance? Failure v)
-        (instance? Success v))
-    true
-
-    (satisfies? p/Contextual v)
-    (identical? (p/-get-context v) context)
-
-    :else false))
-
-(defn extract
-  "Return inner value from exception monad.
-
-  This is a specialized version of `cats.core/extract`
-  for Exception monad types that allows set up
-  the default value.
-
-  If a provided `mv` is an instance of Failure type
-  it will re raise the inner exception. If you need
-  extract value without raising it, use `cats.core/extract`
-  function for it."
-  ([mv]
-   {:pre [(exception? mv)]}
-   (if (success? mv)
-     (p/-extract mv)
-     (throw (p/-extract mv))))
-  ([mv default]
-   {:pre [(exception? mv)]}
-   (if (success? mv)
-     (p/-extract mv)
-     default)))
-
-(defn ^{:no-doc true}
-  exec-try-on
-  [func]
-  (try
-    (let [result (func)]
-      (cond
-        (throwable? result) (failure result)
-        (exception? result) result
-        :else (success result)))
-    (catch #?(:clj Throwable
-              :cljs js/Error) e (failure e))))
-
-(defn ^{:no-doc true}
-  exec-try-or-else
-  [func defaultvalue]
-  (let [result (exec-try-on func)]
-    (if (failure? result)
-      (success defaultvalue)
-      result)))
-
-(defn ^{:no-doc true}
-  exec-try-or-recover
-  [func recoverfn]
-  (let [result (exec-try-on func)]
-    (ctx/with-context context
-      (if (failure? result)
-        (recoverfn (.-failure ^Failure result))
-        result))))
-
-#?(:clj
-   (defmacro try-on
-    "Wraps a computation and return success of failure."
-    [expr]
-    `(let [func# (fn [] ~expr)]
-       (exec-try-on func#))))
-
-#?(:clj
-   (defmacro try-or-else
-     [expr defaultvalue]
-     `(let [func# (fn [] ~expr)]
-        (exec-try-or-else func# ~defaultvalue))))
-
-#?(:clj
-   (defmacro try-or-recover
-     [expr func]
-     `(let [func# (fn [] ~expr)]
-        (exec-try-or-recover func# ~func))))
-
-(defn wrap
-  "Wrap a function in a try monad.
-
-  Is a high order function that accept a function
-  as parameter and returns an other that returns
-  success or failure depending of result of the
-  first function."
-  [func]
-  (let [metadata (meta func)]
-    (-> (fn [& args] (try-on (apply func args)))
-        (with-meta metadata))))
-
-;; --- Monad definition
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-    p/Functor
-    (-fmap [_ f s]
-      (if (success? s)
-        (try-on (f (p/-extract s)))
-        s))
-
-    p/Applicative
-    (-pure [_ v]
-      (success v))
-
-    (-fapply [m af av]
-      (if (success? af)
-        (p/-fmap m (p/-extract af) av)
-        af))
-
-    p/Monad
-    (-mreturn [_ v]
-      (success v))
-
-    (-mbind [_ s f]
-      (assert (exception? s) (str "Context mismatch: " (p/-repr s)
-                                  " is not allowed to use with exception context."))
-
-      (if (success? s)
-        (f (p/-extract s))
-        s))
-
-    p/Printable
-    (-repr [_]
-      "#<Exception>")))
-
-(util/make-printable (type context))
diff --git a/src/cats/monad/identity.cljc b/src/cats/monad/identity.cljc
deleted file mode 100644
index dd924a1..0000000
--- a/src/cats/monad/identity.cljc
+++ /dev/null
@@ -1,96 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.monad.identity
-  "The Identity Monad."
-  (:refer-clojure :exclude [identity])
-  (:require [cats.protocols :as p]
-            [cats.context :as ctx]
-            [cats.util :as util]))
-
-(declare context)
-
-;; --- Type constructors
-
-(defrecord Identity [v]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] v)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Identity " (pr-str v) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] v)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] v)]))
-
-(alter-meta! #'->Identity assoc :private true)
-
-(util/make-printable Identity)
-
-(defn identity
-  "The Identity type constructor."
-  [v]
-  (Identity. v))
-
-(defn identity?
-  "Return true in case of `v` is instance
-  of Identity monad."
-  [v]
-  (instance? Identity v))
-
-;; --- Monad definition
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-    p/Functor
-    (-fmap [_ f iv]
-      (Identity. (f (.-v ^Identity iv))))
-
-    p/Applicative
-    (-pure [_ v]
-      (Identity. v))
-
-    (-fapply [_ af av]
-      (Identity. ((.-v ^Identity af) (.-v ^Identity av))))
-
-    p/Monad
-    (-mreturn [_ v]
-      (Identity. v))
-
-    (-mbind [_ mv f]
-      (f (.-v ^Identity mv)))
-
-    p/Printable
-    (-repr [_]
-      "#<Identity>")))
-
-(util/make-printable (type context))
diff --git a/src/cats/monad/maybe.cljc b/src/cats/monad/maybe.cljc
deleted file mode 100644
index 9b8c4dd..0000000
--- a/src/cats/monad/maybe.cljc
+++ /dev/null
@@ -1,272 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.monad.maybe
-  "The Maybe monad implementation and helpers functions
-  for working with maybe related types.
-
-      (require '[cats.monad.maybe :as maybe])
-
-      (maybe/just 1)
-      ;; => #<Just [1]>
-  "
-  #?(:cljs
-    (:require-macros [cats.monad.maybe :refer (maybe)]))
-  (:require [cats.protocols :as p]
-            [cats.context :as ctx]
-            [cats.util :as util]))
-
-;; --- Type constructors and functions
-
-(declare context)
-
-(defrecord Just [just]
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] just)
-
-  p/Printable
-  (-repr [_]
-    (str "#<Just " (pr-str just) ">"))
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] just)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] just)]))
-
-(defrecord Nothing []
-  p/Contextual
-  (-get-context [_] context)
-
-  p/Extract
-  (-extract [_] nil)
-
-  p/Printable
-  (-repr [_]
-    "#<Nothing>")
-
-  #?@(:cljs [cljs.core/IDeref
-             (-deref [_] nil)]
-      :clj  [clojure.lang.IDeref
-             (deref [_] nil)]))
-
-(alter-meta! #'->Nothing assoc :private true)
-(alter-meta! #'->Just assoc :private true)
-
-(util/make-printable Just)
-(util/make-printable Nothing)
-
-(defn maybe?
-  "Return true in case of `v` is instance
-  of Maybe monad."
-  [v]
-  (or (instance? Just v)
-      (instance? Nothing v)
-      (and (satisfies? p/Contextual v)
-           (identical? (p/-get-context v) context))))
-
-(defn just
-  "A Just type constructor."
-  [v]
-  {:pre [(some? v)]}
-  (Just. v))
-
-(defn nothing
-  "A Nothing type constructor."
-  []
-  (assoc (Nothing.) :nothing nil))
-
-(defn just?
-  "Returns true if `v` is an instance
-  of `Just` type."
-  [v]
-  (instance? Just v))
-
-(defn nothing?
-  "Returns true if `v` is an instance
-  of `Nothing` type or is nil."
-  [v]
-  (or
-   (nil? v)
-   (instance? Nothing v)))
-
-(defn from-maybe
-  "Return inner value from maybe monad.
-
-  This is a specialized version of `cats.core/extract`
-  for Maybe monad types that allows set up
-  the default value.
-
-  Let see some examples:
-
-      (from-maybe (just 1))
-      ;=> 1
-
-      (from-maybe (nothing))
-      ;=> nil
-
-      (from-maybe (nothing) 42)
-      ;=> 42
-  "
-  ([mv]
-   {:pre [(maybe? mv)]}
-   (when (just? mv)
-     (p/-extract mv)))
-  ([mv default]
-   {:pre [(maybe? mv)]}
-   (if (just? mv)
-     (p/-extract mv)
-     default)))
-
-;; --- Monad definition
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-    p/Semigroup
-    (-mappend [ctx mv mv']
-      (cond
-        (nothing? mv) mv'
-        (nothing? mv') mv
-        :else (just (let [mv (p/-extract mv)
-                          mv' (p/-extract mv')]
-                      (p/-mappend (p/-get-context mv) mv mv')))))
-
-    p/Monoid
-    (-mempty [_]
-      (nothing))
-
-    p/Functor
-    (-fmap [_ f mv]
-      (if (nothing? mv)
-        mv
-        (just (f (p/-extract mv)))))
-
-    p/Applicative
-    (-pure [_ v]
-      (just v))
-    (-fapply [m af av]
-      (if (nothing? af)
-        af
-        (p/-fmap m (p/-extract af) av)))
-
-    p/Monad
-    (-mreturn [_ v]
-      (if (nil? v)
-        (nothing)
-        (just v)))
-    (-mbind [_ mv f]
-      (assert (maybe? mv) (str "Context mismatch: " (p/-repr mv)
-                               " is not allowed to use with maybe context."))
-      (if (nothing? mv)
-        mv
-        (f (p/-extract mv))))
-
-    p/MonadZero
-    (-mzero [_]
-      (nothing))
-
-    p/MonadPlus
-    (-mplus [_ mv mv']
-      (if (just? mv)
-        mv
-        mv'))
-
-    p/Foldable
-    (-foldl [_ f z mv]
-      (if (just? mv)
-        (f z (p/-extract mv))
-        z))
-
-    (-foldr [_ f z mv]
-      (if (just? mv)
-        (f (p/-extract mv) z)
-        z))
-
-    p/Traversable
-    (-traverse [_ f mv]
-      (if (just? mv)
-        (let [a (f (p/-extract mv))]
-          (p/-fmap (p/-get-context a) just a))
-        (p/-pure (ctx/infer) mv)))
-
-    p/Printable
-    (-repr [_]
-      "#<Maybe>")))
-
-(util/make-printable (type context))
-
-;; --- Utility functions
-
-#?(:clj
-   (defmacro maybe
-     "Given a default value, a maybe and a function, return the default if the
-     maybe is a nothing; if its a just, apply the function to the value it
-     contains and return the result."
-     [default m f]
-     `(do
-        (assert (maybe? ~m) (str "'" ~m "' is not a Maybe monad"))
-        (if (nothing? ~m)
-          ~default
-          (~f (p/-extract ~m))))))
-
-(defn seq->maybe
-  "Given a collection, return a nothing if its empty or a just with its
-  first element if its not."
-  [coll]
-  (if (empty? coll)
-    (nothing)
-    (just (first coll))))
-
-(defn maybe->seq
-  "Given a maybe, return an empty seq if its nothing or a one-element seq
-  with its value if its not."
-  [m]
-  {:pre [(maybe? m)]}
-  (if (nothing? m)
-    (lazy-seq [])
-    (lazy-seq [(p/-extract m)])))
-
-(def ^{:private true :no-doc true}
-  +extract-just-xform+
-  (comp
-   (filter just?)
-   (map p/-extract)))
-
-(defn cat-maybes
-  "Given a collection of maybes, return a sequence of the values
-  that the just's contain."
-  [coll]
-  (sequence +extract-just-xform+ coll))
-
-(defn map-maybe
-  "Given a maybe-returning function and a collection, map the function over
-  the collection returning the values contained in the just values of the
-  resulting collection."
-  [mf coll]
-  (cat-maybes (map mf coll)))
diff --git a/src/cats/monad/state.cljc b/src/cats/monad/state.cljc
deleted file mode 100644
index 1690883..0000000
--- a/src/cats/monad/state.cljc
+++ /dev/null
@@ -1,180 +0,0 @@
-(ns cats.monad.state
-  (:refer-clojure :exclude [eval get])
-  (:require [cats.context :as ctx :refer [*context*]]
-            [cats.core :as m]
-            [cats.data :as d #?@(:cljs [:refer [Pair]])]
-            [cats.protocols :as p]
-            [cats.util :as util])
-  #?(:clj (:import (cats.data Pair))))
-
-(declare context)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Protocol declaration
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defprotocol MonadState
-  "A specific case of Monad abstraction for
-  work with state in pure functional way."
-  (-get-state [m] "Return the current state.")
-  (-put-state [m newstate] "Update the state.")
-  (-swap-state [m f] "Apply a function to the current state and update it."))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Type constructors and functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defrecord State [mfn state-context]
-  p/Contextual
-  (-get-context [_] state-context)
-
-  p/Extract
-  (-extract [_] mfn))
-
-(alter-meta! #'->State assoc :private true)
-
-(defn state
-  "The State type constructor.
-  The purpose of State type is wrap a simple
-  function that fullfill the state signature.
-  It exists just for avoid extend the clojure
-  function type because is very generic type."
-  ([f]
-   (State. f context))
-  ([f state-context]
-   (State. f state-context)))
-
-(defn state?
-  "Return true if `s` is instance of
-  the State type."
-  [s]
-  (instance? State s))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Monad definition
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(def ^{:no-doc true}
-  context
-  (reify
-    p/Context
-
-    p/Extract
-    (-extract [mv] (p/-extract mv))
-
-    p/Functor
-    (-fmap [_ f fv]
-      (state (fn [s]
-               (let [[v ns]  ((p/-extract fv) s)]
-                   (d/pair (f v) ns)))))
-
-    p/Monad
-    (-mreturn [_ v]
-      (state (partial d/pair v)))
-
-    (-mbind [_ self f]
-      (state (fn [s]
-               (let [^Pair p  ((p/-extract self) s)
-                     value    (.-fst p)
-                     newstate (.-snd p)]
-                 ((p/-extract (f value)) newstate)))))
-
-    MonadState
-    (-get-state [_]
-      (state #(d/pair %1 %1)))
-
-    (-put-state [_ newstate]
-      (state #(d/pair % newstate)))
-
-    (-swap-state [_ f]
-      (state #(d/pair %1 (f %1))))
-
-    p/Printable
-    (-repr [_]
-      "#<State>")))
-
-(util/make-printable (type context))
-
-(defn ^:private get-context
-  "Default to context if no context set"
-  []
-  (if (nil? *context*)
-    context
-    *context*))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Public Api
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn get
-  "Return a State instance with computation that returns
-  the current state."
-  ([context]
-   (ctx/with-context context
-     (-get-state (ctx/infer))))
-  ([]
-   (get (get-context))))
-
-(defn put
-  "Return a State instance with computation that replaces
-  the current state with specified new state."
-  ([newstate context]
-   (ctx/with-context context
-     (-put-state (ctx/infer) newstate)))
-  ([newstate]
-   (put newstate (get-context))))
-
-(defn swap
-  "Return a State instance with computation that applies the
-  specified function to state and returns the old state."
-  ([f context]
-   (ctx/with-context context
-     (-swap-state (ctx/infer) f)))
-  ([f]
-   (swap f (get-context))))
-
-(defn run
-  "Given a State instance, execute the
-  wrapped computation and returns a cats.data.Pair
-  instance with result and new state.
-    (def computation (mlet [x (get-state)
-                            y (put-state (inc x))]
-                       (return y)))
-    (def initial-state 1)
-    (run computation initial-state)
-  This should return something to: #<Pair [1 2]>"
-  [state seed]
-  ((p/-extract state) seed))
-
-(defn eval
-  "Given a State instance, execute the
-  wrapped computation and return the resultant
-  value, ignoring the state.
-  Equivalent to taking the first value of the pair instance
-  returned by `run` function."
-  [state seed]
-  (first (run state seed)))
-
-(defn exec
-  "Given a State instance, execute the
-  wrapped computation and return the resultant
-  state.
-  Equivalent to taking the second value of the pair instance
-  returned by `run` function."
-  [state seed]
-  (second (run state seed)))
-
-(defn gets
-  "State monad that returns the result of applying
-  a function to a state"
-  ([projfn context]
-   (m/mlet [s (get context)]
-     (m/return (projfn s))))
-  ([projfn]
-   (gets projfn (get-context))))
-
-(defn wrap-fn
-  "Wraps a (possibly side-effecting) function to a state monad"
-  [my-fn]
-  (state (fn [s]
-           (d/pair (my-fn) s))))
diff --git a/src/cats/protocols.cljc b/src/cats/protocols.cljc
deleted file mode 100644
index cfcf7be..0000000
--- a/src/cats/protocols.cljc
+++ /dev/null
@@ -1,103 +0,0 @@
-;; Copyright (c) 2014-2016 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2014-2016 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.protocols
-  "A collection of protocols upon which the cats abstractions are built.
-
-  NOTE: Functions of this namespace are not intended to be used directly.
-  It is considered internal api.")
-
-(defprotocol Context
-  "A marker protocol for identifying the valid context types.")
-
-(defprotocol Contextual
-  "Abstraction that establishes a concrete type as a member of a context.
-
-  A great example is the Maybe monad type Just. It implements
-  this abstraction to establish that Just is part of
-  the Maybe monad."
-  (-get-context [_] "Get the context associated with the type."))
-
-(defprotocol Printable
-  "An abstraction to make a type printable in a platform
-  independent manner."
-  (-repr ^String [_] "Get the repl ready representation of the object."))
-
-(defprotocol Semigroup
-  "A structure with an associative binary operation."
-  (-mappend [s sv sv'] "An associative addition operation."))
-
-(defprotocol Monoid
-  "A Semigroup which has an identity element with respect to an associative binary operation."
-  (-mempty [s] "The identity element for the given monoid."))
-
-(defprotocol Extract
-  "A type class to extract the
-  value from a monad context."
-  (-extract [mv] "Extract the value from monad context."))
-
-(defprotocol Functor
-  "A data type that can be mapped over without altering its context."
-  (-fmap [ftor f fv] "Applies function f to the value(s) inside the context of the functor fv."))
-
-(defprotocol Bifunctor
-  "A 'Functor' of two arguments."
-  (-bimap  [btor f g bv] "Map over both arguments at the same time."))
-
-(defprotocol Applicative
-  "The Applicative abstraction."
-  (-fapply [app af av]
-    "Applies the function(s) inside af's context to the value(s)
-     inside av's context while preserving the context.")
-  (-pure [app v]
-    "Takes any context or monadic value `app` and any value `v`, and puts
-     the value `v` in the most minimal context (normally `mempty`) of same type of `app`"))
-
-(defprotocol Foldable
-  "Abstraction of data structures that can be folded to a summary value."
-  (-foldl [fctx f z xs] "Left-associative fold of a structure.")
-  (-foldr [fctx f z xs] "Right-associative fold of a structure."))
-
-(defprotocol Traversable
-  "Abstraction of data structures that can be traversed from left to right
-  performing an action on every element."
-  (-traverse [tctx f tv]
-    "Map each element to an Applicative, evaluate the applicatives from left
-     to right and collect the results."))
-
-(defprotocol Monad
-  "The Monad abstraction."
-  (-mreturn [m v])
-  (-mbind [m mv f]))
-
-(defprotocol MonadZero
-  "A complement abstraction for monad that
-  supports the notion of an identity element."
-  (-mzero [m] "The identity element for the given monadzero."))
-
-(defprotocol MonadPlus
-  "A complement abstraction for Monad that
-  supports the notion of addition."
-  (-mplus [m mv mv'] "An associative addition operation."))
diff --git a/src/cats/util.cljc b/src/cats/util.cljc
deleted file mode 100644
index 46b1648..0000000
--- a/src/cats/util.cljc
+++ /dev/null
@@ -1,38 +0,0 @@
-;; Copyright (c) 2015 Andrey Antukh <niwi@niwi.nz>
-;; Copyright (c) 2015 Alejandro Gómez <alejandro@dialelo.com>
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions
-;; are met:
-;;
-;; 1. Redistributions of source code must retain the above copyright
-;;    notice, this list of conditions and the following disclaimer.
-;; 2. Redistributions in binary form must reproduce the above copyright
-;;    notice, this list of conditions and the following disclaimer in the
-;;    documentation and/or other materials provided with the distribution.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-;; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-;; THEORY OF LIABILITtY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-;; THIS SOFTWARE, EVE N IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-(ns cats.util
-  "A collection of utils that used around the library."
-  (:require [cats.protocols]))
-
-(defn make-printable
-  [klass]
-  #?(:clj  (defmethod print-method klass
-             [mv ^java.io.Writer writer]
-             (.write writer (cats.protocols/-repr mv)))
-     :cljs (extend-type klass
-             IPrintWithWriter
-             (-pr-writer [mv writer _]
-               (-write writer (cats.protocols/-repr mv))))))
diff --git a/test/cats/builtin_spec.cljc b/test/cats/builtin_spec.cljc
deleted file mode 100644
index e3d44a9..0000000
--- a/test/cats/builtin_spec.cljc
+++ /dev/null
@@ -1,555 +0,0 @@
-(ns cats.builtin-spec
-  #?@(:cljs
-      [(:require [cljs.test :as t]
-                 [clojure.test.check]
-                 [clojure.test.check.generators :as gen]
-                 [clojure.test.check.properties :as prop :include-macros true]
-                 [cats.labs.test :as lt]
-                 [cats.builtin :as b]
-                 [cats.monad.maybe :as maybe]
-                 [cats.context :as ctx :include-macros true]
-                 [cats.core :as m :include-macros true])
-       (:require-macros [clojure.test.check.clojure-test :refer (defspec)])])
-  #?(:clj
-     (:require [clojure.test :as t]
-               [clojure.test.check.clojure-test :refer [defspec]]
-               [clojure.test.check :as tc]
-               [clojure.test.check.generators :as gen]
-               [clojure.test.check.properties :as prop]
-               [cats.labs.test :as lt]
-               [cats.builtin :as b]
-               [cats.monad.maybe :as maybe]
-               [cats.context :as ctx]
-               [cats.core :as m])))
-
-(t/deftest test-nil-as-maybe
-  (t/testing "Nil works like Nothing (for avoiding unnecesary null pointers)."
-    (t/is (= (m/>>= nil (fn [_] (m/return 1))) nil))
-    (t/is (= (m/fmap inc nil) nil))
-    (t/is (maybe/nothing? nil))
-    (t/is (maybe/maybe? nil)))
-
-  (t/testing "extract function"
-    (t/is (= (m/extract nil) nil))))
-
-;; Map
-
-(def map-gen (gen/map gen/keyword gen/any))
-
-(defspec map-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/map-context
-    :gen map-gen}))
-
-(defspec map-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/map-context
-    :gen map-gen}))
-
-(defspec map-first-functor-law 10
-  (lt/first-functor-law
-   {:gen map-gen}))
-
-(defspec map-second-functor-law 10
-  (lt/second-functor-law
-   {:gen map-gen
-    :f   prn-str
-    :g   count}))
-
-(t/deftest map-functor
-  (t/is (= {:a 2 :b 3 :c 4} (m/fmap inc {:a 1 :b 2 :c 3}))))
-
-(t/deftest array-map-foldable
-  (t/testing "Foldl"
-    (t/is (= {:a 1 :b 2 :c 3}
-             (m/foldl (fn [acc [k v]] (merge acc {k v}))
-                      {} {:a 1 :b 2 :c 3})))
-    (t/is (= #{"a:1" "b:2" "c:3" "d:4"}
-             (m/foldl (fn [acc [k v]] (conj acc (str (name k) ":" v)))
-                      #{} {:a 1 :b 2 :c 3 :d 4})))
-    (t/is (= 6 (m/foldl (fn [acc [k v]] (+ acc v)) 0 {:a 1 :b 2 :c 3}))))
-
-  (t/testing "Foldr"
-    (t/is (= {:a 1 :b 2 :c 3}
-             (m/foldr (fn [[k v] acc] (merge {k v} acc))
-                      {} {:a 1 :b 2 :c 3})))
-    (t/is (= #{"a:1" "b:2" "c:3" "d:4"}
-             (m/foldr (fn [[k v] acc] (conj acc (str (name k) ":" v)))
-                      #{} {:a 1 :b 2 :c 3 :d 4})))
-    (t/is (= 6 (m/foldr (fn [[k v] acc] (+ acc v)) 0 {:a 1 :b 2 :c 3})))))
-
-
-;; Vector
-
-(defspec vector-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/vector-context
-    :gen (gen/not-empty (gen/vector gen/any))}))
-
-(defspec vector-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/vector-context
-    :gen (gen/vector gen/any)}))
-
-(defspec vector-first-functor-law 10
-  (lt/first-functor-law
-   {:gen (gen/vector gen/any)}))
-
-(defspec vector-second-functor-law 10
-  (lt/second-functor-law
-   {:gen (gen/vector gen/any)
-    :f   vector
-    :g   vector}))
-
-(defspec vector-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx b/vector-context
-    :gen (gen/vector gen/any)}))
-
-(defspec vector-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx b/vector-context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec vector-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  b/vector-context
-    :gen  gen/int
-    :appf [inc]}))
-
-(defspec vector-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  b/vector-context
-    :gen  gen/int
-    :appf [inc]
-    :appg [dec]}))
-
-(defspec vector-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx b/vector-context
-    :mf  #(if % (vector %) [])}))
-
-(defspec vector-second-monad-law 10
-  (lt/second-monad-law {:ctx b/vector-context}))
-
-(defspec vector-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx b/vector-context
-    :f   (comp vector str)
-    :g   (comp vector count)}))
-
-(t/deftest vector-foldable
-  (t/testing "Foldl"
-    (t/is (= [3 2 1] (m/foldl (fn [acc v] (into [v] acc)) [] [1 2 3])))
-    (t/is (= 6 (m/foldl + 0 [1 2 3]))))
-
-  (t/testing "Foldr"
-    (t/is (= [1 2 3] (m/foldr (fn [v acc] (into [v] acc)) [] [1 2 3])))
-    (t/is (= 6 (m/foldr + 0 [1 2 3])))))
-
-(defn inc-if-even
-  [n]
-  (if (even? n)
-    (maybe/just (inc n))
-    (maybe/nothing)))
-
-(t/deftest vector-traversable
-  (t/testing "Traverse"
-    (t/is (= (maybe/just [])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even []))))
-    (t/is (= (maybe/just [3 5])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even [2 4]))))
-    (t/is (= (maybe/nothing)
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even [1 2]))))))
-
-;; Sequence
-
-(defn sequence-gen [g]
-  (gen/list g))
-
-(defspec sequence-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/sequence-context
-    :gen (gen/not-empty (sequence-gen gen/any))}))
-
-(defspec sequence-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/sequence-context
-    :gen (sequence-gen gen/any)}))
-
-(defspec sequence-first-functor-law 10
-  (lt/first-functor-law
-   {:gen (sequence-gen gen/any)}))
-
-(defspec sequence-second-functor-law 10
-  (lt/second-functor-law
-   {:gen (sequence-gen gen/any)
-    :f   #(list %)
-    :g   #(list %)}))
-
-(defspec sequence-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx b/sequence-context
-    :gen (sequence-gen gen/any)}))
-
-(defspec sequence-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx b/sequence-context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec sequence-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  b/sequence-context
-    :gen  gen/int
-    :appf (list inc)}))
-
-(defspec sequence-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  b/sequence-context
-    :gen  gen/int
-    :appf (list inc)
-    :appg (list dec)}))
-
-(defspec sequence-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx b/sequence-context
-    :mf  #(if % (lazy-seq [%]) (lazy-seq []))}))
-
-(defspec sequence-second-monad-law 10
-  (lt/second-monad-law {:ctx b/sequence-context}))
-
-(defspec sequence-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx b/sequence-context
-    :f   (comp seq vector str)
-    :g   (comp seq vector count)}))
-
-(t/deftest sequence-foldable
-  (t/testing "Foldl"
-    (t/is (= [3 2 1]
-             (m/foldl (fn [acc v] (into [v] acc)) [] (list 1 2 3))))
-    (t/is (= 6 (m/foldl + 0 (list 1 2 3)))))
-
-  (t/testing "Foldr"
-    (t/is (= [1 2 3]
-             (m/foldr (fn [v acc] (into [v] acc)) [] (list 1 2 3))))
-    (t/is (= 6 (m/foldr + 0 (list 1 2 3))))))
-
-(t/deftest sequence-traversable
-  (t/testing "Traverse"
-    (t/is (= (maybe/just [])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even '()))))
-    (t/is (= (maybe/just [3 5])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (list 2 4)))))
-    (t/is (= (maybe/nothing)
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (list 1 2)))))))
-
-;; Lazy Sequence
-
-(defn lazy-sequence-gen [g]
-  (gen/fmap #(lazy-seq %) (gen/vector g)))
-
-(defspec lazy-sequence-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/lazy-sequence-context
-    :gen (gen/not-empty (lazy-sequence-gen gen/any))}))
-
-(defspec lazy-sequence-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/lazy-sequence-context
-    :gen (lazy-sequence-gen gen/any)}))
-
-(defspec lazy-sequence-first-functor-law 10
-  (lt/first-functor-law
-   {:gen (lazy-sequence-gen gen/any)}))
-
-(defspec lazy-sequence-second-functor-law 10
-  (lt/second-functor-law
-   {:gen (lazy-sequence-gen gen/any)
-    :f   #(lazy-seq [%])
-    :g   #(lazy-seq [%])}))
-
-(defspec lazy-sequence-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx b/lazy-sequence-context
-    :gen (lazy-sequence-gen gen/any)}))
-
-(defspec lazy-sequence-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx b/lazy-sequence-context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec lazy-sequence-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  b/lazy-sequence-context
-    :gen  gen/int
-    :appf (lazy-seq [inc])}))
-
-(defspec lazy-sequence-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  b/lazy-sequence-context
-    :gen  gen/int
-    :appf (lazy-seq [inc])
-    :appg (lazy-seq [dec])}))
-
-(defspec lazy-sequence-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx b/lazy-sequence-context
-    :mf  #(if % (lazy-seq [%]) (lazy-seq []))}))
-
-(defspec lazy-sequence-second-monad-law 10
-  (lt/second-monad-law {:ctx b/lazy-sequence-context}))
-
-(defspec lazy-sequence-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx b/lazy-sequence-context
-    :f   (comp seq vector str)
-    :g   (comp seq vector count)}))
-
-(t/deftest lazyseq-foldable
-  (t/testing "Foldl"
-    (t/is (= [3 2 1]
-             (m/foldl (fn [acc v] (into [v] acc)) [] (map identity [1 2 3]))))
-    (t/is (= 6 (m/foldl + 0 (map identity [1 2 3])))))
-
-  (t/testing "Foldr"
-    (t/is (= [1 2 3]
-             (m/foldr (fn [v acc] (into [v] acc)) [] (map identity [1 2 3]))))
-    (t/is (= 6 (m/foldr + 0 (map identity [1 2 3]))))))
-
-(t/deftest lazyseq-traversable
-  (t/testing "Traverse"
-    (t/is (= (maybe/just [])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (lazy-seq [])))))
-    (t/is (= (maybe/just [3 5])
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (lazy-seq [2 4])))))
-    (t/is (= (maybe/nothing)
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (lazy-seq [1 2])))))))
-
-;; Range
-
-(t/deftest range-foldable
-  (t/testing "Foldl"
-    (t/is (= [3 2 1] (m/foldl (fn [acc v] (into [v] acc)) [] (range 1 4))))
-    (t/is (= 6 (m/foldl + 0 (range 1 4)))))
-
-  (t/testing "Foldr"
-    (t/is (= [1 2 3] (m/foldr (fn [v acc] (into [v] acc)) [] (range 1 4))))
-    (t/is (= 6 (m/foldr + 0 (range 1 4))))))
-
-;; Set
-
-(defspec set-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/set-context
-    :gen (gen/not-empty (gen/set gen/any))}))
-
-(defspec set-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/set-context
-    :gen (gen/set gen/any)}))
-
-(defspec set-first-functor-law 10
-  (lt/first-functor-law {:gen (gen/set gen/any)}))
-
-(defspec set-second-functor-law 10
-  (lt/second-functor-law
-   {:gen (gen/set gen/any)
-    :f   (comp set vector)
-    :g   (comp set vector)}))
-
-(defspec set-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx b/set-context
-    :gen (gen/set gen/any)}))
-
-(defspec set-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx b/set-context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec set-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  b/set-context
-    :gen  gen/int
-    :appf #{inc}}))
-
-(defspec set-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  b/set-context
-    :gen  gen/int
-    :appf #{inc}
-    :appg #{dec}}))
-
-(defspec set-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx b/set-context
-    :mf  #(if % #{%} #{})}))
-
-(defspec set-second-monad-law 10
-  (lt/second-monad-law {:ctx b/set-context}))
-
-(defspec set-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx b/set-context
-    :f   (comp set vector str)
-    :g   (comp set vector count)}))
-
-;; Function
-
-(def fn-gen
-  (gen/one-of [(gen/return inc) (gen/return dec)]))
-
-(defn fn-eq
-  ([f g]
-   (= (f 42)
-      (g 42)))
-  ([f g h]
-   (= (f 42)
-      (g 42)
-      (h 42))))
-
-(defspec fn-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/function-context
-    :gen fn-gen
-    :eq  fn-eq}))
-
-(defspec fn-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/function-context
-    :gen fn-gen
-    :eq  fn-eq}))
-
-(defspec fn-first-functor-law 10
-  (lt/first-functor-law
-   {:gen fn-gen
-    :eq  fn-eq}))
-
-(defspec fn-second-functor-law 10
-  (lt/second-functor-law
-   {:gen fn-gen
-    :eq  fn-eq
-    :f   #(+ % 2)
-    :g   #(- % 2)}))
-
-(defspec fn-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx b/function-context
-    :gen fn-gen
-    :eq  fn-eq}))
-
-(defspec fn-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx b/function-context
-    :eq  fn-eq
-    :gen gen/int
-    :f   inc}))
-
-(defspec fn-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  b/function-context
-    :eq   fn-eq
-    :gen  gen/int
-    :appf (constantly inc)}))
-
-
-(defspec fn-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  b/function-context
-    :eq   fn-eq
-    :gen  gen/int
-    :appf (constantly inc)
-    :appg (constantly dec)}))
-
-(defspec fn-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx b/function-context
-    :gen fn-gen
-    :mf  (constantly (constantly 42))
-    :eq  fn-eq}))
-
-(defspec fn-second-monad-law 10
-  (lt/second-monad-law
-   {:ctx b/function-context
-    :eq  fn-eq}))
-
-(defspec fn-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx b/function-context
-    :eq  fn-eq
-    :f   (constantly str)
-    :g   (constantly vector)}))
-
-;; Any
-
-(defspec any-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/any-monoid
-    :gen gen/boolean}))
-
-(defspec any-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/any-monoid
-    :gen gen/boolean}))
-
-;; All
-
-(defspec all-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/all-monoid
-    :gen gen/boolean}))
-
-(defspec all-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/all-monoid
-    :gen gen/boolean}))
-
-;; Sum
-
-(defspec sum-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/sum-monoid
-    :gen gen/int}))
-
-(defspec sum-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/sum-monoid
-    :gen gen/int}))
-
-;; Prod
-
-(defspec prod-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/prod-monoid
-    :gen gen/int}))
-
-(defspec prod-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/prod-monoid
-    :gen gen/int}))
-
-;; String
-
-(defspec string-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx b/string-monoid
-    :gen gen/string}))
-
-(defspec string-monoid 10
-  (lt/monoid-identity-element
-   {:ctx b/string-monoid
-    :gen gen/string}))
diff --git a/test/cats/core_spec.cljc b/test/cats/core_spec.cljc
deleted file mode 100644
index a3fc106..0000000
--- a/test/cats/core_spec.cljc
+++ /dev/null
@@ -1,341 +0,0 @@
-(ns cats.core-spec
-  #?(:cljs
-     (:require [cljs.test :as t]
-               [cats.builtin :as b]
-               [cats.monad.maybe :as maybe]
-               [cats.core :as m :include-macros true]
-               [cats.context :as ctx :include-macros true])
-     :clj
-     (:require [clojure.test :as t]
-               [cats.builtin :as b]
-               [cats.monad.maybe :as maybe]
-               [cats.core :as m]
-               [cats.context :as ctx])))
-
-(defn add2 [x y]
-  (+ x y))
-
-(t/deftest fmap-test
-  (t/testing "Sets the context."
-    (t/is (= [[1] [2] [3] [4]]
-             (m/fmap #(m/return %) [1 2 3 4])))))
-
-(t/deftest fapply-test
-  (t/testing "Simple fapply run."
-    (t/is (= 2 @(m/fapply (maybe/just inc) (maybe/just 1)))))
-  (t/testing "Variadic fapply run."
-    (t/is (= 3 @(m/fapply (maybe/just #(partial + %))
-                          (maybe/just 1)
-                          (maybe/just 2))))))
-
-(t/deftest mlet-tests
-  (t/testing "Support regular let bindings inside mlet"
-    (t/is (= (maybe/just 20)
-             (m/mlet [[{:n/keys [a b c] y2 :i j :j :or {c 'yes}}] (maybe/just [{:i 1 :j 1 :n/a 2 :n/b 3}])
-                      :let [[[x1 y1] [x2 & [y2]] & remaining :as all-vec] (sorted-map j a b 4)]
-                      {age :age :keys [m/w ::m/z :zero] :or {z 5 w 5} :as all-map} (m/return {:age (+ x1 x2 y1 y2) :zero 0})]
-                     (m/return (when (= c 'yes) (+ zero w z age)))))))
-
-  (t/testing "Support :when guards inside its bindings"
-    (t/is (= (maybe/nothing)
-             (m/mlet [i (maybe/just 2)
-                      :when (> i 2)]
-               (m/return i))))
-    (t/is (= [3 4 5]
-             (m/mlet [i [1 2 3 4 5]
-                      :when (> i 2)]
-               (m/return i)))))
-
-  (t/testing "The body runs in an implicit do"
-    (t/is (= (maybe/just 3)
-             (m/mlet [i (maybe/just 2)
-                      :let [x (inc i)]]
-               (assert (= x 3))
-               (m/return x))))))
-
-(t/deftest alet-tests
-  (t/testing "It works with just one applicative binding"
-    (t/is (= (maybe/just 3)
-             (m/alet [x (maybe/just 2)]
-               (inc x)))))
-
-  (t/testing "The body runs in an implicit do"
-    (t/is (= (maybe/just 3)
-             (m/alet [x (maybe/just 2)]
-               nil
-               42
-               (inc x)))))
-
-  (t/testing "It works with no dependencies between applicative values"
-    (t/is (= (maybe/just 3)
-             (m/alet [x (maybe/just 1)
-                      y (maybe/just 2)]
-               (add2 x y)))))
-
-  (t/testing "It works with one level of dependencies between applicative values"
-    (t/is (= (maybe/just [42])
-             (m/alet [x (maybe/just 21)       ;; split 1
-                      y (maybe/just 2)
-                      z (maybe/just (* x y))] ;; split 2
-               (vector z)))))
-
-  (t/testing "It works with more than one level of dependencies between applicative values"
-    (t/is (= (maybe/just [45])
-             (m/alet [x (maybe/just 21)       ;; split 1
-                      y (maybe/just 2)
-                      z (maybe/just (* x y))  ;; split 2
-                      z (maybe/just (+ 3 z))] ;; split 3
-               (vector z)))))
-
-  (t/testing "It works with more than one level of dependencies, with distinct split sizes"
-    (t/is (= (maybe/just 66)
-             (m/alet [x (maybe/just 21)         ;; split 1
-                      y (maybe/just 2)
-                      z (maybe/just (* x y))    ;; split 2
-                      a (maybe/just (* 3 x))
-                      b (maybe/just 1)          ;; split 3
-                      c (maybe/just 2)
-                      d (maybe/just (+ a b c))] ;; split 4
-               d))))
-
-  (t/testing "It renames the body symbols correctly"
-    (t/is (= (maybe/just 42)
-             (m/alet [x (maybe/just 5)
-                      y (maybe/just 6)
-                      x (maybe/just (inc x))
-                      y (maybe/just (inc y))]
-               (* x y))))))
-
-(t/deftest sequence-tests
-  (t/testing "It works with vectors"
-    (t/is (= (m/sequence [[1 2] [3 4]])
-             [[1 3] [1 4] [2 3] [2 4]])))
-
-  (t/testing "It works with lazy seqs"
-    (t/is (= (m/sequence [(lazy-seq [1 2]) (lazy-seq [3 4])])
-             [[1 3] [1 4] [2 3] [2 4]])))
-
-  (t/testing "It works with sets"
-    (t/is (= (m/sequence [#{1 2} #{3 4}])
-             #{[1 3] [1 4] [2 3] [2 4]})))
-
-  (t/testing "It works with Maybe values"
-    (t/is (= (maybe/just [2 3])
-             (m/sequence [(maybe/just 2) (maybe/just 3)])))
-
-    (t/is (= (maybe/nothing)
-             (m/sequence [(maybe/just 2) (maybe/nothing)]))))
-
-  (t/testing "It works with an empty collection"
-    (t/is (= (maybe/just ())
-             (ctx/with-context maybe/context
-               (m/sequence ()))))))
-
-(t/deftest mapseq-tests
-  (t/testing "It works with Maybe values"
-    (t/is (= (maybe/just [1 2 3 4 5])
-             (m/mapseq maybe/just [1 2 3 4 5])))
-    (t/is (= (maybe/nothing)
-             (m/mapseq (fn [v]
-                         (if (odd? v)
-                           (maybe/just v)
-                           (maybe/nothing)))
-                       [1 2 3 4 5]))))
-
-  (t/testing "It works with an empty collection"
-    (t/is (= (maybe/just ())
-             (ctx/with-context maybe/context
-               (m/mapseq maybe/just []))))))
-
-(t/deftest lift-a-tests
-  (let [app+ (m/lift-a 2 +)]
-    (t/testing "It can lift a function to the vector applicative"
-      (t/is (= [1 2 3 4 5 6]
-               (app+ [0 2 4] [1 2]))))
-
-    (t/testing "It can lift a function to the Maybe applicative"
-      (t/is (= (maybe/just 6)
-               (app+ (maybe/just 2) (maybe/just 4))))
-      (t/is (= (maybe/nothing)
-               (app+ (maybe/just 1) (maybe/nothing)))))))
-
-(t/deftest lift-m-tests
-  (let [monad+ (m/lift-m 2 +)]
-    (t/testing "It can lift a function to the vector monad"
-      (t/is (= [1 2 3 4 5 6]
-               (monad+ [0 2 4] [1 2]))))
-
-    (t/testing "It can lift a function to the Maybe monad"
-      (t/is (= (maybe/just 6)
-               (monad+ (maybe/just 2) (maybe/just 4))))
-      (t/is (= (maybe/nothing)
-               (monad+ (maybe/just 1) (maybe/nothing)))))))
-
-(t/deftest fixed-arity-lift-m-tests
-  #?(:clj
-     (let [monad+ (m/lift-m add2)]
-       (t/testing "It can lift a function to the vector monad"
-         (t/is (= [1 2 3 4 5 6]
-                  (monad+ [0 2 4] [1 2]))))))
-
-  (t/testing "It can lift a function to the Maybe monad"
-    (let [monad+ (m/lift-m 2 add2)]
-      (t/is (= (maybe/just 6)
-               (monad+ (maybe/just 2) (maybe/just 4))))
-      (t/is (= (maybe/nothing)
-               (monad+ (maybe/just 1) (maybe/nothing))))))
-
-  (t/testing "Currying and lifting can be combined"
-    (let [curry-monad+ (m/curry-lift-m 2 add2)]
-      (t/is (= (maybe/just 6)
-               ((curry-monad+ (maybe/just 1)) (maybe/just 5)))))))
-
-(t/deftest filter-tests
-  (t/testing "It can filter Maybe monadic values"
-    (let [bigger-than-4 (partial < 4)]
-      (t/is (= (maybe/just 6)
-               (m/filter bigger-than-4 (maybe/just 6))))
-      (t/is (= (maybe/nothing)
-               (m/filter bigger-than-4 (maybe/just 3))))))
-  (t/testing "It can filter vectors"
-    (t/is (= [1 3 5]
-             (m/filter odd? [1 2 3 4 5 6])))))
-
-(t/deftest when-tests
-  (t/testing "It returns the monadic value unchanged when the condition is true"
-    (t/is (= (maybe/just 3)
-             (m/when true (maybe/just 3))))
-    (t/is (= (maybe/just 3)
-             (m/when maybe/context true (maybe/just 3)))))
-
-  (t/testing "It returns nil in the monadic context when the condition is false"
-    (ctx/with-context b/sequence-context
-      (t/is (= [nil]
-               (m/when false []))))
-    (t/is (= [nil]
-             (m/when b/sequence-context false []))))
-
-  (t/testing "it doesn't evaluate the mv when the conditions is false"
-    (t/is (= [nil]
-             (m/when b/sequence-context false (throw (ex-info "bang" {})))))))
-
-(t/deftest unless-tests
-  (t/testing "It returns the monadic value unchanged when the condition is false"
-    (t/is (= (maybe/just 3)
-             (m/unless false (maybe/just 3))))
-    (t/is (= (maybe/just 3)
-             (m/unless maybe/context false (maybe/just 3)))))
-
-  (t/testing "It returns nil in the monadic context when the condition is true"
-    (ctx/with-context b/sequence-context
-      (t/is (= [nil]
-               (m/unless true []))))
-    (t/is (= [nil]
-             (m/unless b/sequence-context true []))))
-
-  (t/testing "it doesn't evaluate the mv when the condition is true"
-    (t/is (= [nil]
-             (m/unless b/sequence-context true (throw (ex-info "bang" {})))))))
-
-(t/deftest curry-tests
-  #?(:clj
-     (t/testing "It can curry single and fixed arity functions automatically"
-       (let [cadd2 (m/curry add2)]
-         (t/is (= ((cadd2 1) 2)
-                  3))
-         (t/is (= (cadd2)
-                  cadd2))
-         (t/is (= (cadd2 1 2)
-                  3)))))
-
-  (t/testing "It can curry anonymous functions when providing an arity"
-    (let [csum (m/curry 3 (fn [x y z] (+ x y z)))]
-      (t/is (= (((csum 1) 2) 3)
-               6))
-      (t/is (= ((csum 1 2) 3)
-               6))
-      (t/is (= (((csum) 1 2) 3)
-               6))
-      (t/is (= (csum 1 2 3)
-               6))))
-
-  (t/testing "It can curry variadic functions when providing an arity"
-    (let [csum (m/curry 3 +)]
-      (t/is (= (((csum 1) 2) 3)
-               6))
-      (t/is (= ((csum 1 2) 3)
-               6))
-      (t/is (= (((csum) 1 2) 3)
-               6))
-      (t/is (= (csum 1 2 3)
-               6)))))
-
-(t/deftest foldm-tests
-  (letfn [(m-div [x y]
-            (if (zero? y)
-              (maybe/nothing)
-              (maybe/just (/ x y))))]
-
-    (t/testing "It can fold a non-empty collection without an explicit context"
-      (t/is (= (maybe/just #?(:clj 1/6 :cljs (/ 1 6)))
-               (m/foldm m-div 1 [1 2 3])))
-      (t/is (= (maybe/nothing)
-               (m/foldm m-div 1 [1 0 3]))))
-
-    (t/testing "It cannot fold an empty collection without an explicit context"
-      (t/is (thrown? #?(:clj IllegalArgumentException, :cljs js/Error)
-                     (with-redefs [cats.context/get-current (constantly nil)]
-                       (m/foldm m-div 1 [])))))
-
-    (t/testing "It can fold a non-empty collection, given an explicit context"
-      (t/is (= (maybe/just #?(:clj 1/6, :cljs (/ 1 6)))
-               (m/foldm maybe/context m-div 1 [1 2 3])))
-      (t/is (= (maybe/nothing)
-               (m/foldm maybe/context m-div 1 [1 0 3]))))
-
-    (t/testing "It can fold an empty collection, given an explicit context"
-      (t/is (= (maybe/just 1)
-               (m/foldm maybe/context m-div 1 [])))
-      (t/is (= (maybe/just 1)
-               (ctx/with-context maybe/context
-                 (m/foldm m-div 1 [])))))))
-
-(t/deftest do-let-tests
-  (t/testing "Support regular let bindings inside do-let"
-    (t/is (= (maybe/just 2)
-             (m/do-let [i (maybe/just 1)
-                        :let [i (inc i)]]
-               (m/return i)))))
-
-  (t/testing "Support :when guards inside its bindings"
-    (t/is (= (maybe/nothing)
-             (m/do-let [i (maybe/just 2)
-                        :when (> i 2)]
-               (m/return i))))
-    (t/is (= [3 4 5]
-             (m/do-let [i [1 2 3 4 5]
-                        :when (> i 2)]
-                       (m/return i)))))
-
-  (t/testing "Support one single form"
-    (t/is (= (maybe/just 2)
-             (m/do-let (maybe/just 2)))))
-
-  (t/testing "Support multiple single form"
-    (t/is (= (maybe/just 3)
-             (m/do-let (maybe/just 2)
-                       (maybe/just 3)))))
-
-  (t/testing "Bound variables are always in scope"
-    (t/is (= (maybe/just 6)
-             (m/do-let [x (maybe/just 2)]
-                       (maybe/just x)
-                       [y (maybe/just (+ 2 x))]
-                       (maybe/just (+ 2 y)))))))
-
-(t/deftest for-tests
-  (t/testing "m/for works like (m/sequence (clojure.core/for))"
-    (t/is (= (maybe/just [2 3])
-             (m/sequence [(maybe/just 2) (maybe/just 3)])
-             (m/sequence (for [x [2 3]] (maybe/just x)))
-             (m/for [x [2 3]] (maybe/just x))))))
diff --git a/test/cats/data_spec.cljc b/test/cats/data_spec.cljc
deleted file mode 100644
index b1faa23..0000000
--- a/test/cats/data_spec.cljc
+++ /dev/null
@@ -1,87 +0,0 @@
-(ns cats.data-spec
-  (:require [clojure.test.check]
-            [clojure.test.check.generators :as gen]
-            [clojure.test.check.properties :as prop #?@(:cljs [:include-macros true])]
-            [cats.labs.test :as lt]
-            [cats.data :as d]
-            [cats.builtin :as b]
-            [cats.protocols :as p]
-            [cats.monad.maybe :as maybe]
-            [cats.context :as ctx #?@(:cljs [:include-macros true])]
-            [#?(:clj clojure.test :cljs cljs.test) :as t]
-            [cats.core :as m #?@(:cljs [:include-macros true])]
-            #?(:clj [clojure.test.check.clojure-test :refer [defspec]]))
-  #?(:cljs (:require-macros [clojure.test.check.clojure-test :refer (defspec)])))
-
-(def ctx (d/pair-monoid b/string-monoid))
-
-(defn pair-gen [g]
-  (m/alet [s1 g, s2 g]
-    (d/pair s1 s2)))
-
-(defspec pair-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx ctx
-    :gen (pair-gen gen/string)}))
-
-(defspec pair-monoid 10
-  (lt/monoid-identity-element
-   {:ctx   ctx
-    :gen   (pair-gen gen/string)
-    :empty (d/pair "" "")}))
-
-(defspec pair-monoid-sum 10
-  (lt/monoid-identity-element
-   {:ctx   (d/pair-monoid b/sum-monoid)
-    :gen   (pair-gen gen/int)
-    :empty (d/pair 0 0)}))
-
-(defspec pair-first-functor-law 10
-  (lt/first-functor-law {:gen (pair-gen gen/any)}))
-
-(defspec pair-second-functor-law 10
-  (lt/second-functor-law
-   {:gen (pair-gen gen/any)
-    :f   str
-    :g   count}))
-
-;; Bifunctor
-
-(defspec pair-first-identity 10
-  (lt/bifunctor-first-identity
-   {:gen (pair-gen gen/any)}))
-
-(defspec pair-second-identity 10
-  (lt/bifunctor-second-identity
-   {:gen (pair-gen gen/any)}))
-
-(defspec pair-bimap-identity 10
-  (lt/bifunctor-bimap-identity
-   {:gen (pair-gen gen/any)}))
-
-(defspec pair-bifunctor-composition 10
-  (lt/bifunctor-composition
-   {:gen (pair-gen gen/any)
-    :f   str
-    :g   count}))
-
-(t/deftest pair-foldable
-  (t/testing "Foldl"
-    (t/is (= (/ 1 3) (m/foldl / 1 (d/pair 0 3)))))
-
-  (t/testing "Foldr"
-    (t/is (= (/ 3 1) (m/foldr / 1 (d/pair 0 3))))))
-
-(defn inc-if-even [n]
-  (if (even? n)
-    (maybe/just (inc n))
-    (maybe/nothing)))
-
-(t/deftest pair-traversable
-  (t/testing "Traverse"
-    (t/is (= (maybe/just (d/pair 0 3))
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (d/pair 0 2)))))
-    (t/is (= (maybe/nothing)
-             (ctx/with-context maybe/context
-               (m/traverse inc-if-even (d/pair 0 1)))))))
diff --git a/test/cats/labs/channel_spec.cljc b/test/cats/labs/channel_spec.cljc
deleted file mode 100644
index e68721b..0000000
--- a/test/cats/labs/channel_spec.cljc
+++ /dev/null
@@ -1,271 +0,0 @@
-(ns cats.labs.channel-spec
-  #?(:cljs (:require-macros [cljs.core.async.macros :refer [go]]))
-  #?(:cljs (:require [cljs.core.async :as a]
-                     [cljs.test :as t]
-                     [cats.builtin :as b]
-                     [cats.context :as ctx :include-macros true]
-                     [cats.core :as m :include-macros true]
-                     [cats.labs.channel :as c]
-                     [cats.monad.either :as either])
-     :clj  (:require [clojure.core.async :as a :refer [go]]
-                     [clojure.test :as t]
-                     [cats.builtin :as b]
-                     [cats.context :as ctx]
-                     [cats.core :as m]
-                     [cats.labs.channel :as c]
-                     [cats.monad.either :as either])))
-
-(t/deftest channel-as-functor
-  #?(:clj
-     (let [ch (m/pure c/context 1)]
-       (t/is (= 2 (a/<!! (m/fmap inc ch)))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [ch (m/pure c/context 1)
-               rs (m/fmap inc ch)]
-           (t/is (= 2 (a/<! rs)))
-           (done))))))
-
-(t/deftest channel-as-monad-1
-  #?(:clj
-     (let [ch (m/pure c/context 1)]
-       (t/is (= 2 (a/<!! (m/>>= ch (fn [x] (m/return (inc x))))))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [ch (m/pure c/context 1)
-               result (m/>>= ch (fn [x] (m/return (inc x))))]
-           ;; (println 2222 @(a/<! result))
-
-           (t/is (= 2 (a/<! result)))
-           (done))))))
-
-
-(t/deftest channel-as-monad-2
-  #?(:clj
-     (let [ch1 (a/chan 1)
-           ch2 (a/chan 1)
-           ch3 (a/chan 1)
-           r   (m/mlet [x ch1
-                        y ch2
-                        z ch3]
-                 (m/return (+ x y z)))]
-       (go
-         (a/>! ch1 1)
-         (a/>! ch2 1)
-         (a/>! ch3 1))
-       (t/is (= 3 (a/<!! r))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [ch1 (a/chan 1)
-               ch2 (a/chan 1)
-               ch3 (a/chan 1)
-               r   (m/mlet [x ch1
-                            y ch2
-                            z ch3]
-                     (m/return (+ x y z)))]
-           (a/>! ch1 1)
-           (a/>! ch2 1)
-           (a/>! ch3 1)
-           (t/is (= 3 (a/<! r))))
-         (done)))))
-
-(t/deftest channel-with-empty
-  #?(:clj
-     (let [r (m/mlet [v (a/to-chan [1])
-                      empty (a/to-chan [])]
-                     (m/return v))]
-       (t/is (= nil (a/<!! r))))
-     :cljs
-     (t/async done
-        (go
-          (let [r (m/mlet [v (a/to-chan [1])
-                           empty (a/to-chan [])]
-                          (m/return v))]
-            (t/is (= nil (a/<! r)))
-            (done))))))
-
-(t/deftest channel-comprehension
-  #?(:clj
-     (let [r (m/mlet [x (a/to-chan (range 1 4))
-                      y (a/to-chan (range x))]
-                     (m/return [x y]))]
-       (t/is (= [[1 0] [2 0] [2 1] [3 0] [3 1] [3 2]]
-                (a/<!! (a/into [] r)))))
-     :cljs
-     (t/async done
-              (go
-                (let [r (m/mlet [x (a/to-chan (range 1 4))
-                                 y (a/to-chan (range x))]
-                                (m/return [x y]))]
-                  (t/is (= [[1 0] [2 0] [2 1] [3 0] [3 1] [3 2]]
-                           (a/<! (a/into [] r))))
-                  (done))))))
-
-
-(t/deftest first-monad-law-left-identity
-  #?(:clj
-     (let [ch1 (m/pure c/context 4)
-           ch2 (m/pure c/context 4)
-           vl  (m/>>= ch2 c/with-value)]
-       (t/is (= (a/<!! ch1)
-                (a/<!! vl))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [ch1 (m/pure c/context 4)
-               ch2 (m/pure c/context 4)
-               vl  (m/>>= ch2 c/with-value)]
-           (t/is (= (a/<! ch1)
-                    (a/<! vl)))
-           (done))))))
-
-(t/deftest second-monad-law-right-identity
-  #?(:clj
-     (let [ch1 (c/with-value 2)
-           rs  (m/>>= (c/with-value 2) m/return)]
-       (t/is (= (a/<!! ch1) (a/<!! rs))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [ch1 (c/with-value 2)
-               rs  (m/>>= (c/with-value 2) m/return)]
-           (t/is (= (a/<! ch1) (a/<! rs)))
-           (done))))))
-
-(t/deftest third-monad-law-associativity
-  #?(:clj
-     (let [rs1 (m/>>= (m/mlet [x  (c/with-value 2)
-                               y  (c/with-value (inc x))]
-                        (m/return y))
-                      (fn [y] (c/with-value (inc y))))
-           rs2 (m/>>= (c/with-value 2)
-                      (fn [x] (m/>>= (c/with-value (inc x))
-                                     (fn [y] (c/with-value (inc y))))))]
-       (t/is (= (a/<!! rs1) (a/<!! rs2))))
-
-     :cljs
-     (t/async done
-       (go
-         (let [rs1 (m/>>= (m/mlet [x  (c/with-value 2)
-                                   y  (c/with-value (inc x))]
-                            (m/return y))
-                          (fn [y] (c/with-value (inc y))))
-               rs2 (m/>>= (c/with-value 2)
-                          (fn [x] (m/>>= (c/with-value (inc x))
-                                         (fn [y] (c/with-value (inc y))))))]
-           (t/is (= (a/<! rs1) (a/<! rs2)))
-           (done))))))
-
-(t/deftest semigroup-tests
-  #?(:clj
-     (let [c1 (a/to-chan [1 2 3])
-           c2 (a/to-chan [4 5 6])
-           r (m/mappend c1 c2)]
-       (t/is (= #{1 2 3 4 5 6} (a/<!! (a/into #{} r)))))
-     :cljs
-     (t/async done
-       (go
-         (let [c1 (a/to-chan [1 2 3])
-               c2 (a/to-chan [4 5 6])
-               r (m/mappend c1 c2)]
-           (t/is (= #{1 2 3 4 5 6} (a/<! (a/into #{} r))))
-           (done))))))
-
-
-(t/deftest semigroup-with-monoid-tests
-  #?(:clj
-     (let [c (m/mappend (m/mempty c/context) (a/to-chan [1]))]
-       (t/is (= [1] (a/<!! (a/into [] c)))))
-     :cljs
-     (t/async done
-       (go
-         (let [c (m/mappend (m/mempty c/context) (a/to-chan [1]))]
-           (t/is (= [1] (a/<! (a/into [] c))))
-           (done))))))
-
-(t/deftest applicative-do
-  (letfn [(async-call [wait]
-            (go
-              (a/<! (a/timeout wait))
-              wait))]
-    #?(:clj
-       (let [result (m/alet [x (async-call 100)
-                             y (async-call 100)]
-                            (+ x y))]
-         (t/is (c/channel? result))
-         (t/is (= (a/<!! result) 200)))
-       :cljs
-       (t/async done
-         (go
-           (let [result (m/alet [x (async-call 100)
-                                 y (async-call 100)]
-                                (+ x y))]
-             (t/is (c/channel? result))
-             (t/is (= (a/<! result) 200))
-             (done)))))))
-
-(t/deftest monadzero-tests
-  #?(:clj
-     (t/is (= #{} (a/<!! (a/into #{} (m/mzero c/context)))))
-     :cljs
-     (t/async
-      done
-      (go (t/is (= #{} (a/<! (a/into #{} (m/mzero c/context)))))
-          (done)))))
-
-(t/deftest monadplus-tests
-  #?(:clj
-     (do (t/is (= #{1 2 3}
-                  (a/<!! (a/into #{} (m/mplus (m/mzero c/context)
-                                              (a/to-chan #{1 2 3}))))))
-         (t/is (= #{1 2 3}
-                  (a/<!! (a/into #{} (m/mplus (a/to-chan #{1 2 3})
-                                              (m/mzero c/context))))))
-         (t/is (= (a/<!! (a/into #{} (m/mplus (a/to-chan [1])
-                                              (m/mplus (a/to-chan [2])
-                                                       (a/to-chan [3])))))
-                  (a/<!! (a/into #{} (m/mplus (m/mplus (a/to-chan [1])
-                                                       (a/to-chan [2]))
-                                              (a/to-chan [3])))))))
-     :cljs
-     (t/async
-      done
-      (go (t/is (= #{1 2 3}
-                   (a/<! (a/into #{} (m/mplus (m/mzero c/context)
-                                              (a/to-chan #{1 2 3}))))))
-          (t/is (= #{1 2 3}
-                   (a/<! (a/into #{} (m/mplus (a/to-chan #{1 2 3})
-                                              (m/mzero c/context))))))
-          (t/is (= (a/<! (a/into #{} (m/mplus (a/to-chan [1])
-                                              (m/mplus (a/to-chan [2])
-                                                       (a/to-chan [3])))))
-                   (a/<! (a/into #{} (m/mplus (m/mplus (a/to-chan [1])
-                                                       (a/to-chan [2]))
-                                              (a/to-chan [3]))))))
-          (done)))))
-
-(t/deftest channel-mlet-when
-  #?(:clj
-     (t/is (= [2] (a/<!! (a/into [] (m/mlet [v (a/to-chan [1 2])
-                                             :when (even? v)]
-                                            (m/return v))))))
-     :cljs
-     (t/async done
-              (go (t/is (= [2] (a/<! (a/into [] (m/mlet [v (a/to-chan [1 2])
-                                                         :when (even? v)]
-                                                        (m/return v))))))
-                  (done)))))
-
-
-
-;; #?(:cljs (defn main [] (node/run-tests)))
-
-;; #? (:cljs (set! *main-cli-fn* main))
diff --git a/test/cats/labs/manifold_spec.clj b/test/cats/labs/manifold_spec.clj
deleted file mode 100644
index f2abca9..0000000
--- a/test/cats/labs/manifold_spec.clj
+++ /dev/null
@@ -1,90 +0,0 @@
-(ns cats.labs.manifold-spec
-  (:require [manifold.deferred :as d]
-            [clojure.test :as t]
-            [cats.builtin :as b]
-            [cats.context :as ctx]
-            [cats.core :as m]
-            [cats.labs.manifold :as mf]
-            [cats.monad.either :as either]))
-
-(t/deftest deferred-as-functor
-  (let [ch (m/pure mf/deferred-context 1)]
-    (t/is (= 2 @(m/fmap inc ch)))))
-
-(t/deftest deferred-as-monad-1
-  (let [ch (m/pure mf/deferred-context 1)]
-    (t/is (= 2 @(m/>>= ch (fn [x] (m/return (inc x))))))))
-
-(t/deftest deferred-as-monad-2
-  (let [ch1 (d/future 1)
-        ch2 (d/future 1)
-        ch3 (d/future 1)
-        r   (m/mlet [x ch1
-                     y ch2
-                     z ch3]
-              (m/return (+ x y z)))]
-    (t/is (= 3 @r))))
-
-(t/deftest first-monad-law-left-identity
-  (let [ch1 (m/pure mf/deferred-context 4)
-        ch2 (m/pure mf/deferred-context 4)
-        vl  (m/>>= ch2 #(m/pure mf/deferred-context %))]
-    (t/is (= @ch1 @vl))))
-
-(t/deftest second-monad-law-right-identity
-  (let [ch1 (d/future 3)
-        rs  (m/>>= (d/future 3) m/return)]
-    (t/is (= @ch1 @rs))))
-
-(t/deftest third-monad-law-associativity
-  (let [rs1 (m/>>= (m/mlet [x (d/future 2)
-                            y (d/future (inc x))]
-                     (m/return y))
-                   (fn [y] (d/future (inc y))))
-        rs2 (m/>>= (d/future 2)
-                   (fn [x] (m/>>= (d/future (inc x))
-                                  (fn [y] (d/future (inc y))))))]
-    (t/is (= @rs1 @rs2))))
-
-(t/deftest semigroup-tests
-  (let [c1 (d/success-deferred {:a 1})
-        c2 (d/success-deferred {:b 2})
-        r (m/mappend c1 c2)]
-    (t/is (= {:a 1 :b 2} @r)))
-  (let [c1 (d/success-deferred {:a 1})
-        c2 (d/error-deferred {:b 2})
-        r (m/mappend c1 c2)]
-    (t/is (thrown? clojure.lang.ExceptionInfo @r))))
-
-(t/deftest applicative-do
-  (letfn [(async-call [wait]
-            (d/future
-              (Thread/sleep 100)
-              wait))]
-    (let [result (m/alet [x (async-call 100)
-                          y (async-call 100)]
-                         (+ x y))]
-      (t/is (d/deferred? result))
-      (t/is (= @result 200)))))
-
-(t/deftest timeout-tests
-  (t/testing "Doesn't timeout"
-    (let [tctx (mf/deferred-context* 20)
-          v (ctx/with-context tctx
-              (m/mlet [x (d/future (Thread/sleep 10) :foo)]
-                (m/return x)))]
-      (t/is (= :foo @v))))
-
-  (t/testing "Times out"
-    (let [tctx (mf/deferred-context* 20)
-          v (ctx/with-context-override tctx
-              (m/mlet [x (d/future (Thread/sleep 30) :foo)]
-                (m/return x)))]
-      (t/is (thrown? java.util.concurrent.TimeoutException @v))))
-
-  (t/testing "Times out with value"
-    (let [tctx (mf/deferred-context* 20 (either/left :foo))
-          v (ctx/with-context-override tctx
-              (m/mlet [x (d/future (Thread/sleep 30) :foo)]
-                (m/return x)))]
-      (t/is (= (either/left :foo) @v)))))
diff --git a/test/cats/labs/promise_spec.cljc b/test/cats/labs/promise_spec.cljc
deleted file mode 100644
index a5c099e..0000000
--- a/test/cats/labs/promise_spec.cljc
+++ /dev/null
@@ -1,149 +0,0 @@
-(ns cats.labs.promise-spec
-  #?(:cljs (:require [cljs.test :as t]
-                     [cats.builtin :as b]
-                     [cats.context :as ctx :include-macros true]
-                     [cats.core :as m :include-macros true]
-                     [cats.labs.promise :as pm]
-                     [promesa.core :as p]
-                     [promesa.impl :as pi]
-                     [promesa.exec :as pe])
-     :clj  (:require [clojure.test :as t]
-                     [cats.builtin :as b]
-                     [cats.context :as ctx]
-                     [cats.core :as m]
-                     [cats.labs.promise :as pm]
-                     [promesa.core :as p]
-                     [promesa.exec :as pe])))
-
-
-(defn future-ok
-  [sleep value]
-  (p/delay sleep value))
-
-(t/deftest chaining-using-bind
-  #?(:cljs
-     (t/async done
-       (let [p1 (future-ok 200 2)
-             inc #(p/resolved (inc %))
-             p2 (m/>>= p1 inc inc inc)]
-         (p/then p2 (fn [v]
-                      (t/is (= v 5))
-                      (done)))))
-     :clj
-     (let [p1 (future-ok 200 2)
-           inc #(p/resolved (inc %))
-           p2 (m/>>= p1 inc inc inc)]
-       (t/is (= @p2 5)))))
-
-(t/deftest promise-as-functor
-  #?(:cljs
-     (t/async done
-       (let [rp (m/fmap inc (p/promise 2))]
-         (p/then rp (fn [v]
-                      (t/is (= v 3))
-                      (done)))))
-
-     :clj
-     (let [rp (m/fmap inc (p/promise 2))]
-       @(p/then rp (fn [v]
-                     (t/is (= v 3)))))))
-
-(t/deftest promise-as-bifunctor
-  #?(:cljs
-     (t/async done
-       (let [rp (m/bimap #(ex-info "Oh no" {}) inc (p/promise 2))]
-         (p/then rp (fn [v]
-                      (t/is (= v 3))
-                      (done)))))
-
-     :clj
-     (let [rp (m/bimap #(ex-info "Oh no" {}) inc (p/promise 2))]
-       @(p/then rp (fn [v]
-                     (t/is (= v 3)))))))
-
-(t/deftest promise-as-applicative
-  #?(:cljs
-     (t/async done
-       (let [rp (m/fapply (p/resolved inc) (p/promise 2))]
-         (p/then rp (fn [v]
-                      (t/is (= v 3))
-                      (done)))))
-     :clj
-     (let [rp (m/fapply (p/resolved inc) (p/promise 2))]
-       @(p/then rp (fn [v]
-                     (t/is (= v 3)))))))
-
-(t/deftest promise-as-monad
-  #?(:cljs
-     (t/async done
-       (let [p1 (m/>>= (p/promise 2) (fn [v] (m/return (inc v))))]
-         (p/then p1 (fn [v]
-                      (t/is (= v 3))
-                      (done)))))
-     :clj
-     (let [p1 (m/>>= (p/promise 2) (fn [v] (m/return (inc v))))]
-       @(p/then p1 (fn [v]
-                     (t/is (= v 3)))))))
-
-(t/deftest first-monad-law-left-identity
-  #?(:cljs
-     (t/async done
-       (let [p1 (m/pure pm/promise-context 4)
-             p2 (m/pure pm/promise-context 4)
-             vl  (m/>>= p2 #(m/pure pm/promise-context %))]
-         (p/then (p/all [p1 vl])
-                 (fn [[v1 v2]]
-                   (t/is (= v1 v2))
-                   (done)))))
-     :clj
-     (let [p1 (m/pure pm/promise-context 4)
-           p2 (m/pure pm/promise-context 4)
-           vl  (m/>>= p2 #(m/pure pm/promise-context %))]
-       @(p/then (p/all [p1 vl])
-                (fn [[v1 v2]]
-                  (t/is (= v1 v2)))))))
-
-(t/deftest second-monad-law-right-identity
-  #?(:cljs
-     (t/async done
-       (let [p1 (p/promise 3)
-             rs  (m/>>= (p/promise 3) m/return)]
-         (p/then (p/all [p1 rs])
-                 (fn [[v1 v2]]
-                   (t/is (= v1 v2))
-                   (done)))))
-     :clj
-     (let [p1 (p/promise 3)
-           rs  (m/>>= (p/promise 3) m/return)]
-       @(p/then (p/all [p1 rs])
-                (fn [[v1 v2]]
-                  (t/is (= v1 v2)))))))
-
-(t/deftest third-monad-law-associativity
-  #?(:cljs
-     (t/async done
-       (let [rs1 (m/>>= (m/mlet [x (p/promise 2)
-                                 y (p/promise (inc x))]
-                          (m/return y))
-                        (fn [y] (p/promise (inc y))))
-             rs2 (m/>>= (p/promise 2)
-                        (fn [x] (m/>>= (p/promise (inc x))
-                                       (fn [y] (p/promise (inc y))))))]
-         (p/then (p/all [rs1 rs2])
-                 (fn [[v1 v2]]
-                   (t/is (= v1 v2))
-                   (done)))))
-     :clj
-     (let [rs1 (m/>>= (m/mlet [x (p/promise 2)
-                               y (p/promise (inc x))]
-                        (m/return y))
-                      (fn [y]
-                        (p/promise (inc y))))
-           rs2 (m/>>= (p/promise 2)
-                      (fn [x] (m/>>= (p/promise (inc x))
-                                     (fn [y] (p/promise (inc y))))))
-           [v1 v2] @(p/all [rs1 rs2])]
-       (t/is (= v1 v2)))))
-
-
-
diff --git a/test/cats/labs/sugar_spec.cljc b/test/cats/labs/sugar_spec.cljc
deleted file mode 100644
index ffd62f1..0000000
--- a/test/cats/labs/sugar_spec.cljc
+++ /dev/null
@@ -1,57 +0,0 @@
-(ns cats.labs.sugar-spec
-  #?(:cljs (:require-macros [cats.core :refer [ap ap-> ap->> as-ap->
-                                               ->= ->>= as->=]]))
-  #?(:cljs
-     (:require [cljs.test :as t]
-               [cats.core :as m :include-macros true]
-               [cats.monad.maybe :as maybe])
-     :clj
-     (:require [clojure.test :as t]
-               [cats.monad.maybe :as maybe]
-               [cats.core :as m :refer [ap ap-> ap->> as-ap->
-                                        ->= ->>= as->=]])))
-
-(t/deftest ap-example-test
-  (t/is (= (ap + (maybe/just 1) (maybe/just 2) (maybe/just 3))
-           (maybe/just 6)))
-
-  (t/is (= (ap str ["hi" "lo"] ["bye" "woah" "hey"])
-           ["hibye" "hiwoah" "hihey"
-            "lobye" "lowoah" "lohey"]))
-
-  (t/is (= (ap-> (maybe/just 1)
-                 inc
-                 inc)
-           (maybe/just 3)))
-
-  (t/is (= (ap->> (maybe/just 1)
-                  inc
-                  inc
-                  (- (maybe/just 5)))
-           (maybe/just 2)))
-
-  (t/is (= (as-ap-> (maybe/just 1) $
-                    (inc $)
-                    (/ (maybe/just 6) $ (maybe/nothing))
-                    (inc $))
-           (maybe/nothing))))
-
-(t/deftest threading-macros
-  (let [linc (comp m/return inc)
-        ldec (comp m/return dec)
-        safe-div (fn [a b] (if (> b 0) (maybe/just (/ a b)) (maybe/nothing)))]
-    (t/is (= (->= (maybe/just 1)
-                  linc
-                  linc
-                  linc)
-             (maybe/just 4)))
-    (t/is (= (->>= (maybe/just 1)
-                   ldec
-                   (safe-div 5)
-                   linc)
-             (maybe/nothing)))
-    (t/is (= (as->= (maybe/just 1) $
-                    (m/return (+ 2 $ 3))
-                    (safe-div 6 $)
-                    (linc $))
-             (maybe/just 2)))))
diff --git a/test/cats/monad/either_spec.cljc b/test/cats/monad/either_spec.cljc
deleted file mode 100644
index 4c223d5..0000000
--- a/test/cats/monad/either_spec.cljc
+++ /dev/null
@@ -1,249 +0,0 @@
-(ns cats.monad.either-spec
-  #?@(:cljs
-      [(:require [clojure.string :as s]
-                 [cljs.test :as t]
-                 [clojure.test.check]
-                 [clojure.test.check.generators :as gen]
-                 [clojure.test.check.properties :as prop :include-macros true]
-                 [cljs.core.match :refer-macros [match]]
-                 [cats.labs.test :as lt]
-                 [cats.builtin :as b]
-                 [cats.protocols :as p]
-                 [cats.monad.maybe :as maybe]
-                 [cats.monad.either :as either :include-macros true]
-                 [cats.context :as ctx :include-macros true]
-                 [cats.core :as m :include-macros true])
-       (:require-macros [clojure.test.check.clojure-test :refer (defspec)])])
-  #?(:clj
-     (:require [clojure.string :as s]
-               [clojure.test :as t]
-               [clojure.test.check.clojure-test :refer [defspec]]
-               [clojure.test.check :as tc]
-               [clojure.test.check.generators :as gen]
-               [clojure.test.check.properties :as prop]
-               [clojure.core.match :refer [match]]
-               [cats.labs.test :as lt]
-               [cats.builtin :as b]
-               [cats.protocols :as p]
-               [cats.monad.maybe :as maybe]
-               [cats.monad.either :as either]
-               [cats.context :as ctx]
-               [cats.core :as m])))
-
-;; Generators
-
-(defn rights-of [g]
-  (gen/fmap either/right g))
-
-(def right-gen
-  (rights-of gen/any))
-
-(def left-gen
-  (gen/return (either/left :oh-no)))
-
-(def either-gen
-  (gen/one-of [right-gen left-gen]))
-
-(def vectors-gen
-  (gen/vector gen/any))
-
-;; Semigroup
-
-(defspec either-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx either/context
-    :gen (rights-of (gen/not-empty vectors-gen))}))
-
-;; Functor
-
-(defspec either-first-functor-law 10
-  (lt/first-functor-law
-   {:gen either-gen}))
-
-(defspec either-second-functor-law 10
-  (lt/second-functor-law
-   {:gen either-gen
-    :f   str
-    :g   count}))
-
-;; Bifunctor
-
-(defspec either-first-identity 10
-  (lt/bifunctor-first-identity
-   {:gen either-gen}))
-
-(defspec either-second-identity 10
-  (lt/bifunctor-second-identity
-   {:gen either-gen}))
-
-(defspec either-bimap-identity 10
-  (lt/bifunctor-bimap-identity
-   {:gen either-gen}))
-
-(defspec either-bifunctor-composition 10
-  (lt/bifunctor-composition
-   {:gen either-gen
-    :f   str
-    :g   count}))
-
-;; Applicative
-
-(defspec either-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx either/context
-    :gen either-gen}))
-
-(defspec either-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx either/context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec either-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  either/context
-    :gen  gen/int
-    :appf (either/right inc)}))
-
-(defspec either-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  either/context
-    :gen  gen/int
-    :appf (either/right inc)
-    :appg (either/right dec)}))
-
-;; Monad
-
-(defspec either-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx either/context
-    :mf  #(if % (either/right %) (either/left :oh-no))}))
-
-(defspec either-second-monad-law 10
-  (lt/second-monad-law {:ctx either/context}))
-
-(defspec either-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx either/context
-    :f   (comp either/right str)
-    :g   (comp either/right count)}))
-
-;; MonadPlus
-
-(defspec either-monadplus 10
-  (lt/monadplus-associativity
-   {:ctx either/context
-    :gen (gen/not-empty vectors-gen)}))
-
-;; MonadZero
-
-(defspec either-monadzero-identity 10
-  (lt/monadzero-identity-element
-   {:ctx either/context
-    :gen (rights-of (gen/not-empty vectors-gen))}))
-
-(defspec either-monadzero-bind 10
-  (lt/monadzero-bind
-   {:ctx  either/context
-    :gen  right-gen
-    :zero (either/left :oh-no)}))
-
-(t/deftest basic-operations-test
-  (t/is (= 1 (m/extract (either/right 1))))
-  (t/is (= nil (m/extract (either/left)))))
-
-(t/deftest ideref-test
-  (t/is (= 1 @(either/left 1)))
-  (t/is (= 1 @(either/right 1))))
-
-(t/deftest predicates-test
-  (let [m1 (either/right 1)
-        m2 (either/left 42)]
-    (t/is (either/either? m1))
-    (t/is (either/either? m2))
-    (t/is (either/right? m1))
-    (t/is (either/left? m2))))
-
-(t/deftest branch-test
-  (let [l (either/left "oh no")
-        r (either/right 42)]
-    (t/is (= "OH NO" (either/branch l s/upper-case inc)))
-    (t/is (= 43 (either/branch r s/upper-case inc)))))
-
-(t/deftest branch-left-test
-  (let [l (either/left "oh no")
-        r (either/right 42)]
-    (t/is (= "OH NO" (either/branch-left l s/upper-case)))
-    (t/is (= r (either/branch-left r s/upper-case)))))
-
-(t/deftest branch-right-test
-  (let [l (either/left "oh no")
-        r (either/right 42)]
-    (t/is (= l (either/branch-right l inc)))
-    (t/is (= 43 (either/branch-right r inc)))))
-
-
-(t/deftest filtering-test
-  (let [l1 (either/left "oh no")
-        l2 (either/left "yo ho ho ho")
-        r1 (either/right 42)
-        r2 (either/right 99)
-        es [l1 l2 r1 r2]]
-    (t/is (every? either/left? (either/lefts es)))
-    (t/is (every? either/right? (either/rights es)))
-    (t/is (= l1 (either/first-left es)))
-    (t/is (= r1 (either/first-right es)))))
-
-(t/deftest invert-test
-  (let [l (either/left "oh no")
-        r (either/right "oh no")]
-    (t/is (= r (either/invert l)))
-    (t/is (= l (either/invert r)))))
-
-(t/deftest foldable-test
-  (t/testing "Foldl"
-    (t/is (= (either/right 2)
-             (m/foldl #(m/return (+ %1 %2)) 1 (either/right 1))))
-    (t/is (= 1
-             (m/foldl #(m/return (+ %1 %2)) 1 (either/left 5)))))
-
-  (t/testing "Foldr"
-    (t/is (= (either/right 2)
-             (m/foldr #(m/return (+ %1 %2)) 1 (either/right 1))))
-    (t/is (= 1
-             (m/foldr #(m/return (+ %1 %2)) 1 (either/left 5))))))
-
-(t/deftest traversable-test
-  (t/testing "Traverse"
-    (t/is (= (maybe/just (either/right 42))
-             (ctx/with-context maybe/context
-               (m/traverse #(maybe/just (inc %)) (either/right 41)))))
-    (t/is (= (maybe/just (either/left :nope))
-             (ctx/with-context maybe/context
-               (m/traverse #(maybe/just (inc %)) (either/left :nope)))))))
-
-(t/deftest try-success-test
-  (t/testing "try-either for a successful function"
-    (let [result (either/try-either (inc 1))]
-      (t/is (either/right? result))
-      (t/is (= 2 @result)))))
-
-(t/deftest try-exception-test
-  (t/testing "try-either for a exceptional function"
-    (let [result (either/try-either #?(:clj  (throw (Exception. "oh no!"))
-                                       :cljs (throw (js/Error "oh no!"))))]
-      (t/is (either/left? result))
-      #?(:clj  (t/is (= "oh no!" (.getMessage @result)))
-         :cljs (t/is (= "oh no!" (.-message @result))))
-      )))
-
-(t/deftest match-test
-  (t/testing "Test ILookup"
-    (t/is (= (match [(either/left "failure")]
-                    [{:left l}] l
-                    [{:right r}] r)
-             "failure"))
-    (t/is (= (match [(either/right 123)]
-                    [{:left l}] l
-                    [{:right r}] r)
-             123))))
diff --git a/test/cats/monad/exception_spec.cljc b/test/cats/monad/exception_spec.cljc
deleted file mode 100644
index 27765ed..0000000
--- a/test/cats/monad/exception_spec.cljc
+++ /dev/null
@@ -1,171 +0,0 @@
-(ns cats.monad.exception-spec
-  #?@(:cljs
-      [(:require [cljs.test :as t]
-                 [clojure.test.check]
-                 [clojure.test.check.generators :as gen]
-                 [clojure.test.check.properties :as prop :include-macros true]
-                 [cats.labs.test :as lt]
-                 [cats.builtin :as b]
-                 [cats.protocols :as p]
-                 [cats.monad.exception :as exc :include-macros true]
-                 [cats.monad.either :as either]
-                 [cats.context :as ctx :include-macros true]
-                 [cats.core :as m :include-macros true])
-       (:require-macros [clojure.test.check.clojure-test :refer (defspec)])])
-  #?(:clj
-     (:require [clojure.test :as t]
-               [clojure.test.check.clojure-test :refer [defspec]]
-               [clojure.test.check :as tc]
-               [clojure.test.check.generators :as gen]
-               [clojure.test.check.properties :as prop]
-               [cats.labs.test :as lt]
-               [cats.builtin :as b]
-               [cats.protocols :as p]
-               [cats.monad.exception :as exc]
-               [cats.monad.either :as either]
-               [cats.context :as ctx]
-               [cats.core :as m])))
-
-(t/deftest basic-operations-test
-  (let [e #?(:clj  (Exception. "test")
-             :cljs (js/Error.  "test"))]
-    (t/is (= 1 (m/extract (exc/try-on 1))))
-    (t/is (= e (m/extract (exc/try-on (throw e)))))
-    (t/is (= e (m/extract (exc/try-on e))))))
-
-#?(:clj
-   (t/deftest ideref-test
-     (t/is (= 1 @(exc/success 1)))
-     (t/is (thrown? Exception @(exc/failure {:message "foobar"})))))
-
-(t/deftest predicates-test
-  (let [m1 (exc/success 1)
-        m2 (exc/failure {})]
-    (t/is (exc/success? m1))
-    (t/is (exc/failure? m2))))
-
-
-(t/deftest wrapping-test
-  (let [func #?(:clj (fn [x] (+ x nil))
-                :cljs (fn [x] (throw (js/Error. "test"))))
-        func (exc/wrap func)]
-    (t/is (exc/failure? (func 3)))))
-
-#?(:clj
-   (t/deftest try-or-else-test
-     (let [m1 (exc/try-or-else (+ 1 nil) 40)]
-       (t/is (exc/success? m1))
-       (t/is (= 40 (exc/extract m1))))))
-
-#?(:clj
-   (t/deftest try-or-recover-test
-     (let [m1 (exc/try-or-recover (+ 1 nil) (fn [e] (m/return 60)))]
-       (t/is (exc/success? m1))
-       (t/is (= 60 (exc/extract m1))))
-
-     (let [m1 (exc/try-or-recover
-               (+ 1 nil)
-               (fn [e] (either/right 60)))]
-       (t/is (either/right? m1))
-       (t/is (= 60 (m/extract m1))))))
-
-#?(:cljs
-   (t/deftest try-or-recover-test
-     (let [e  (js/Error. "test")
-           m1 (exc/try-or-recover e (fn [e] (m/return 60)))]
-       (t/is (exc/success? m1))
-       (t/is (= 60 (exc/extract m1))))
-
-     (let [e  (js/Error. "test")
-           m1 (exc/try-or-recover e (fn [e] (either/right 60)))]
-       (t/is (either/right? m1))
-       (t/is (= 60 (m/extract m1))))))
-
-#?(:clj
-   (t/deftest try-on-macro-test
-     (let [m1 (exc/try-on (+ 1 nil))]
-       (t/is (instance? NullPointerException (m/extract m1))))))
-
-#?(:cljs
-   (t/deftest try-on-macro-test
-     (let [m1 (exc/try-on (js/Error. "foo"))]
-       (t/is (instance? js/Error (m/extract m1))))))
-
-#?(:clj
-   (t/deftest functor-test
-     (let [m1 (exc/try-on 1)
-           m2 (exc/try-on nil)]
-       (t/is (instance? NullPointerException
-                        (m/extract (m/fmap inc m2))))
-       (t/is (= (exc/success 2) (m/fmap inc m1))))))
-
-;; Generators
-
-(defn successes-of [g]
-  (gen/fmap exc/success g))
-
-(def success-gen
-  (successes-of gen/any))
-
-(def failure-gen
-  (gen/return (exc/failure {})))
-
-(def exc-gen
-  (gen/one-of [success-gen failure-gen]))
-
-(def vectors-gen
-  (gen/vector gen/any))
-
-;; Functor
-
-(defspec exc-first-functor-law 10
-  (lt/first-functor-law
-   {:gen exc-gen}))
-
-(defspec exc-second-functor-law 10
-  (lt/second-functor-law
-   {:gen exc-gen
-    :f   str
-    :g   count}))
-
-;; Applicative
-
-(defspec exc-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx exc/context
-    :gen exc-gen}))
-
-(defspec exc-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx exc/context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec exc-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  exc/context
-    :gen  gen/int
-    :appf (exc/success inc)}))
-
-(defspec exc-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  exc/context
-    :gen  gen/int
-    :appf (exc/success inc)
-    :appg (exc/success dec)}))
-
-;; Monad
-
-(defspec exc-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx exc/context
-    :mf  #(if % (exc/success %) (exc/failure {}))}))
-
-(defspec exc-second-monad-law 10
-  (lt/second-monad-law {:ctx exc/context}))
-
-(defspec exc-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx exc/context
-    :f   (comp exc/success str)
-    :g   (comp exc/success count)}))
diff --git a/test/cats/monad/identity_spec.cljc b/test/cats/monad/identity_spec.cljc
deleted file mode 100644
index cb3de29..0000000
--- a/test/cats/monad/identity_spec.cljc
+++ /dev/null
@@ -1,79 +0,0 @@
-(ns cats.monad.identity-spec
-  #?@(:cljs
-      [(:require [cljs.test :as t]
-                 [clojure.test.check]
-                 [clojure.test.check.generators :as gen]
-                 [clojure.test.check.properties :as prop :include-macros true]
-                 [cats.labs.test :as lt]
-                 [cats.builtin :as b]
-                 [cats.monad.identity :as id]
-                 [cats.context :as ctx :include-macros true]
-                 [cats.core :as m :include-macros true])
-       (:require-macros [clojure.test.check.clojure-test :refer (defspec)])])
-  #?(:clj
-     (:require [clojure.test :as t]
-               [clojure.test.check.clojure-test :refer [defspec]]
-               [clojure.test.check :as tc]
-               [clojure.test.check.generators :as gen]
-               [clojure.test.check.properties :as prop]
-               [cats.labs.test :as lt]
-               [cats.builtin :as b]
-               [cats.monad.identity :as id]
-               [cats.context :as ctx]
-               [cats.core :as m])))
-
-(t/deftest basic-operations-test
-  (t/is (= 1 @(id/identity 1))))
-
-(def id-gen
-  (gen/fmap id/identity gen/any))
-
-(defspec identity-first-functor-law 10
-  (lt/first-functor-law {:gen id-gen}))
-
-(defspec identity-second-functor-law 10
-  (lt/second-functor-law
-   {:gen id-gen
-    :f   str
-    :g   count}))
-
-(defspec identity-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx id/context
-    :gen id-gen}))
-
-(defspec identity-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx id/context
-    :gen gen/any
-    :f   str}))
-
-(defspec identity-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  id/context
-    :gen  gen/int
-    :appf (id/identity inc)}))
-
-(defspec identity-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  id/context
-    :gen  gen/int
-    :appf (id/identity inc)
-    :appg (id/identity dec)}))
-
-(defspec identity-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx id/context
-    :mf  (comp id/identity str)}))
-
-(defspec identity-second-monad-law 10
-  (lt/second-monad-law {:ctx id/context}))
-
-(defspec identity-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx id/context
-    :f   (comp id/identity str)
-    :g   (comp id/identity count)}))
-
-(t/deftest predicate-test
-  (t/is (id/identity 1)))
diff --git a/test/cats/monad/maybe_spec.cljc b/test/cats/monad/maybe_spec.cljc
deleted file mode 100644
index 62f910f..0000000
--- a/test/cats/monad/maybe_spec.cljc
+++ /dev/null
@@ -1,221 +0,0 @@
-(ns cats.monad.maybe-spec
-  #?@(:cljs
-      [(:require [cljs.test :as t]
-                 [clojure.test.check]
-                 [clojure.test.check.generators :as gen]
-                 [clojure.test.check.properties :as prop :include-macros true]
-                 [cljs.core.match :refer-macros [match]]
-                 [cats.labs.test :as lt]
-                 [cats.builtin :as b]
-                 [cats.protocols :as p]
-                 [cats.monad.maybe :as maybe]
-                 [cats.monad.either :as either]
-                 [cats.context :as ctx :include-macros true]
-                 [cats.core :as m :include-macros true])
-       (:require-macros [clojure.test.check.clojure-test :refer (defspec)])])
-  #?(:clj
-     (:require [clojure.test :as t]
-               [clojure.test.check.clojure-test :refer [defspec]]
-               [clojure.test.check :as tc]
-               [clojure.test.check.generators :as gen]
-               [clojure.test.check.properties :as prop]
-               [clojure.core.match :refer [match]]
-               [cats.labs.test :as lt]
-               [cats.builtin :as b]
-               [cats.protocols :as p]
-               [cats.monad.maybe :as maybe]
-               [cats.monad.either :as either]
-               [cats.context :as ctx]
-               [cats.core :as m])))
-
-;; Generators
-
-(defn justs-of [g]
-  (gen/fmap maybe/just g))
-
-(def just-gen
-  (justs-of gen/any))
-
-(def nothing-gen
-  (gen/return (maybe/nothing)))
-
-(def maybe-gen
-  (gen/one-of [just-gen nothing-gen]))
-
-(def vectors-gen
-  (gen/vector gen/any))
-
-;; Semigroup
-
-(defspec maybe-semigroup 10
-  (lt/semigroup-associativity
-   {:ctx maybe/context
-    :gen (justs-of (gen/not-empty vectors-gen))}))
-
-;; Monoid
-
-(defspec maybe-monoid 10
-  (lt/monoid-identity-element
-   {:ctx   maybe/context
-    :gen   (justs-of (gen/not-empty vectors-gen))
-    :empty (maybe/just [])}))
-
-;; Functor
-
-(defspec maybe-first-functor-law 10
-  (lt/first-functor-law {:gen maybe-gen}))
-
-(defspec maybe-second-functor-law 10
-  (lt/second-functor-law
-   {:gen maybe-gen
-    :f   str
-    :g   count}))
-
-;; Applicative
-
-(defspec maybe-applicative-identity 10
-  (lt/applicative-identity-law
-   {:ctx maybe/context
-    :gen maybe-gen}))
-
-(defspec maybe-applicative-homomorphism 10
-  (lt/applicative-homomorphism
-   {:ctx maybe/context
-    :gen gen/any
-    :f   (constantly false)}))
-
-(defspec maybe-applicative-interchange 10
-  (lt/applicative-interchange
-   {:ctx  maybe/context
-    :gen  gen/int
-    :appf (maybe/just inc)}))
-
-(defspec maybe-applicative-composition 10
-  (lt/applicative-composition
-   {:ctx  maybe/context
-    :gen  gen/int
-    :appf (maybe/just inc)
-    :appg (maybe/just dec)}))
-
-;; Monad
-
-(defspec maybe-first-monad-law 10
-  (lt/first-monad-law
-   {:ctx maybe/context
-    :mf  #(if % (maybe/just %) (maybe/nothing))}))
-
-(defspec maybe-second-monad-law 10
-  (lt/second-monad-law {:ctx maybe/context}))
-
-(defspec maybe-third-monad-law 10
-  (lt/third-monad-law
-   {:ctx maybe/context
-    :f   (comp maybe/just str)
-    :g   (comp maybe/just count)}))
-
-;; MonadPlus
-
-(defspec maybe-monadplus 10
-  (lt/monadplus-associativity
-   {:ctx maybe/context
-    :gen (gen/not-empty vectors-gen)}))
-
-;; MonadZero
-
-(defspec maybe-monadzero-identity 10
-  (lt/monadzero-identity-element
-   {:ctx maybe/context
-    :gen (justs-of (gen/not-empty vectors-gen))}))
-
-(defspec maybe-monadzero-bind 10
-  (lt/monadzero-bind
-   {:ctx maybe/context
-    :gen just-gen}))
-
-;; Examples
-
-(t/deftest maybe-monad-tests
-  (t/testing "Basic maybe operations."
-    (t/is (= 1 (maybe/from-maybe (maybe/just 1))))
-    (t/is (= 1 (maybe/from-maybe (maybe/just 1) 42)))
-    (t/is (= nil (maybe/from-maybe (maybe/nothing))))
-    (t/is (= 42 (maybe/from-maybe (maybe/nothing) 42))))
-
-  (t/testing "extract function"
-    (t/is (= (m/extract (maybe/just 1)) 1))
-    (t/is (= (m/extract (maybe/nothing)) nil)))
-
-  (t/testing "Test IDeref"
-    (t/is (= nil @(maybe/nothing)))
-    (t/is (= 1 @(maybe/just 1))))
-
-  (t/testing "Test predicates"
-    (let [m1 (maybe/just 1)]
-      (t/is (maybe/maybe? m1))
-      (t/is (maybe/just? m1)))))
-
-(t/deftest maybe-test
-  (let [n          (maybe/nothing)
-        j          (maybe/just 42)
-        wrap-in-ex (fn [v] (do (throw (ex-info "shouldn't run" {})) v))]
-    (t/is (= 42 (maybe/maybe 42 n inc)))
-    (t/is (= 43 (maybe/maybe 42 j inc)))
-    (t/is (= 42 (maybe/maybe 42 n (wrap-in-ex inc))))
-    (t/is (= 43 (maybe/maybe (wrap-in-ex 42) j inc)))
-    (t/is (thrown?
-            #?(:clj  java.lang.AssertionError
-               :cljs js/Error)
-            43 (maybe/maybe 42 :not-maybe-value inc)))))
-
-(t/deftest seq-conversion-test
-  (let [n (maybe/nothing)
-        j (maybe/just 42)]
-    (t/is (= n (maybe/seq->maybe [])))
-    (t/is (= j (maybe/seq->maybe [42 99])))
-    (t/is (= [] (maybe/maybe->seq n)))
-    (t/is (= [42] (maybe/maybe->seq j)))))
-
-(t/deftest cat-maybes-test
-  (let [n1 (maybe/nothing)
-        n2 (maybe/nothing)
-        j1 (maybe/just 42)
-        j2 (maybe/just 99)
-        ms [n1 n2 j1 j2]]
-    (t/is (= [42 99] (maybe/cat-maybes ms)))))
-
-(t/deftest map-maybe-test
-  (let [just-evens #(if (even? %) (maybe/just %) (maybe/nothing))]
-    (t/is (= [42 100] (maybe/map-maybe just-evens [41 42 99 100])))))
-
-(t/deftest foldable-test
-  (t/testing "Foldl"
-    (t/is (= (maybe/just 2)
-             (m/foldl #(m/return (+ %1 %2)) 1 (maybe/just 1))))
-    (t/is (= 1
-             (m/foldl #(m/return (+ %1 %2)) 1 (maybe/nothing)))))
-
-  (t/testing "Foldr"
-    (t/is (= (maybe/just 2)
-             (m/foldr #(m/return (+ %1 %2)) 1 (maybe/just 1))))
-    (t/is (= 1
-             (m/foldr #(m/return (+ %1 %2)) 1 (maybe/nothing))))))
-
-(t/deftest traversable-test
-  (t/testing "Traverse"
-    (t/is (= (either/right (maybe/just 42))
-             (ctx/with-context either/context
-               (m/traverse #(either/right (inc %)) (maybe/just 41)))))
-    (t/is (= (either/right (maybe/nothing))
-             (ctx/with-context either/context
-               (m/traverse #(either/right (inc %)) (maybe/nothing)))))))
-
-(t/deftest match-test
-  (t/testing "Test ILookup"
-    (t/is (= (match [(maybe/just 123)]
-                    [{:just v}] v
-                    [{:nothing _}] nil)
-             123))
-    (t/is (= (match [(maybe/nothing)]
-                    [{:just v}] v
-                    [{:nothing _}] nil)
-             nil))))
diff --git a/test/cats/monad/state_spec.cljc b/test/cats/monad/state_spec.cljc
deleted file mode 100644
index f1c12a7..0000000
--- a/test/cats/monad/state_spec.cljc
+++ /dev/null
@@ -1,52 +0,0 @@
-(ns cats.monad.state-spec
-  #?@(:clj
-       [(:require
-         [cats.context :as ctx]
-         [cats.core :as m]
-         [cats.data :as d]
-         [cats.monad.state :as state]
-         [clojure.test :as t])]
-       :cljs
-       [(:require
-         [cats.context :as ctx :include-macros true]
-         [cats.core :as m :include-macros true]
-         [cats.data :as d]
-         [cats.monad.state :as state]
-         [cljs.test :as t])]))
-
-(def postincrement
-  (m/mlet [x (state/get)
-           _ (state/put (+ x 1))]
-          (m/return x)))
-
-(t/deftest state-monad-tests
-
-  (t/testing "state"
-    (let [mstate (state/state (fn [st] (d/pair "foo" (* 2 st))))]
-      (t/is (= (state/state? mstate) true))
-      (t/is (=  (state/run mstate 2) (d/pair "foo" 4)))))
-
-  (t/testing "monad operations"
-    (t/is (= (state/run (ctx/with-context state/context (m/return 1)) 0) (d/pair 1 0)))
-    (let [mstate1 (state/get)
-          func (fn [value] (state/state (fn [st] [(+ 2 st) (+ value st)])))
-          mstate2 (m/bind mstate1 func)]
-      (t/is (= (state/state? mstate2) true))
-      (t/is (state/run mstate2 1) [3 2])))
-
-  (t/testing "put"
-    (let [put-hello (state/put "hello")]
-      (t/is (= (state/run put-hello "x") (d/pair "x" "hello")))))
-
-  (t/testing "get"
-    (t/is (= (state/run (state/get) "x") (d/pair "x" "x"))))
-
-  (t/testing "swap"
-    (let [appendworld (state/swap (fn [st] (str st " world!")))]
-      (t/is (= (state/exec appendworld "hello") "hello world!"))))
-
-  (t/testing "wrap-fn"
-    (t/is (= (state/run (state/wrap-fn (fn [] (+ 2 3))) 0) (d/pair 5 0))))
-
-  (t/testing "post-increment"
-    (t/is (= (state/run postincrement 1) (d/pair 1 2)))))
diff --git a/test/cats/runner.cljs b/test/cats/runner.cljs
deleted file mode 100644
index 8f0bfdf..0000000
--- a/test/cats/runner.cljs
+++ /dev/null
@@ -1,35 +0,0 @@
-(ns cats.runner
-  (:require [clojure.string :as str]
-            [cljs.test :as test]
-            [cats.core-spec]
-            [cats.builtin-spec]
-            [cats.monad.exception-spec]
-            [cats.monad.either-spec]
-            [cats.monad.maybe-spec]
-            [cats.monad.state-spec]
-            [cats.monad.identity-spec]
-            [cats.labs.sugar-spec]
-            [cats.labs.channel-spec]
-            [cats.labs.promise-spec]))
-
-(enable-console-print!)
-
-(defn -main []
-  (test/run-tests
-   (test/empty-env)
-   'cats.core-spec
-   'cats.builtin-spec
-   'cats.monad.exception-spec
-   'cats.monad.either-spec
-   'cats.monad.maybe-spec
-   'cats.monad.identity-spec
-   'cats.monad.state-spec
-   'cats.labs.sugar-spec
-   'cats.labs.channel-spec
-   'cats.labs.promise-spec))
-
-(defmethod test/report [:cljs.test/default :end-run-tests] [m]
-  (when-not (test/successful? m)
-    ((aget js/process "exit") 1)))
-
-(set! *main-cli-fn* -main)