Home

Awesome

Build Status Coverage Status Join the chat at https://gitter.im/crocksjs/crocks NPM version

crocks is a collection of popular Algebraic Data Types (ADTs) that are all the rage in functional programming. You have heard of things like Maybe and Either and heck maybe even IO, that is what these are. The main goal of crocks is to curate and provide not only a common interface between each type (where possible of course), but also provide all of the helper functions needed to hit the ground running.

Table of Contents

<!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> <!-- END doctoc generated TOC please keep comment here to allow auto update -->

Installation

crocks is available from npm and is just a shell command away. All you need to do is run the following to save it as a dependency in your current project folder:

$ npm install crocks -S

Usage

There are many options to use crocks to suit the needs of your, projects. When used on the backend or in an environment where size is not a big concern, the entire lib can be brought in and the various elements can be either be plucked off of or referenced by the namespace.

For those cases where size matters, like in the case of frontend bundle building, the individual entities can be brought in. This will ensure that your finished bundles include only what is needed for your application/program.

For using the latter case, refer to the desired function's documentation to find the path in which it resides.

Entire crocks library (CommonJS)

// namespace entire suite to crocks variable
const crocks = require('crocks')

// pluck anything that does not require name-spacing
const { safe, isNumber } = crocks

// still requires entire object, but removes name-spacing
const { and, liftA2 } = require('crocks')

Entire crocks library (JS Modules)

// namespace entire suite to crocks variable
import crocks from 'crocks'

// still imports entire object, but removes name-spacing
import { and, liftA2 }  from 'crocks'

// pluck anything that does not require name-spacing
const { safe, isNumber } = crocks

Single entities (CommonJS)

// require in each entity directly
const and = require('crocks/logic/and')
const curry = require('crocks/helpers/curry')
const isNumber = require('crocks/predicates/isNumber')
const liftA2 = require('crocks/helpers/liftA2')
const safe = require('crocks/Maybe/safe')

Single entities (JS Modules)

// import in each entity directly
import and from 'crocks/logic/and'
import curry from 'crocks/helpers/curry'
import isNumber from 'crocks/predicates/isNumber'
import liftA2 from 'crocks/helpers/liftA2'
import safe from 'crocks/Maybe/safe'

Example

Documentation references: and, curry, predicates (isNumber), liftA2, safe.

// divide :: Number -> Number -> Number
const divide = x => y =>
  x / y

// safeNumber :: a -> Maybe Number
const safeNumber =
  safe(isNumber)

// notZero :: a -> Maybe Number
const notZero = safe(
  and(isNumber, x => x !== 0)
)

// safeDivide:: a -> a -> Maybe Number
const safeDivide = curry(
  (x, y) => liftA2(divide, safeNumber(x), notZero(y))
)

safeDivide(20)(0)
//=> Nothing

safeDivide(20, 0)
//=> Nothing

safeDivide(20, 5)
//=> Just 4

safeDivide('number', 5)
//=> Nothing

Documentation

What is Included?

There are (8) classifications of "things" included in this library:

Contributors

Thanks goes to these wonderful people (emoji key):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tr> <td align="center"><a href="https://github.com/evilsoft"><img src="https://avatars1.githubusercontent.com/u/3665793?v=4" width="100px;" alt=""/><br /><sub><b>Ian Hofmann-Hicks</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=evilsoft" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/commits?author=evilsoft" title="Documentation">πŸ“–</a> <a href="#video-evilsoft" title="Videos">πŸ“Ή</a></td> <td align="center"><a href="https://github.com/rstegg"><img src="https://avatars0.githubusercontent.com/u/19234385?v=4" width="100px;" alt=""/><br /><sub><b>Ryan</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=rstegg" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/issues?q=author%3Arstegg" title="Bug reports">πŸ›</a> <a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Arstegg" title="Reviewed Pull Requests">πŸ‘€</a></td> <td align="center"><a href="http://vanslaars.io"><img src="https://avatars0.githubusercontent.com/u/1271181?v=4" width="100px;" alt=""/><br /><sub><b>Andrew Van Slaars</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=avanslaars" title="Documentation">πŸ“–</a> <a href="#video-avanslaars" title="Videos">πŸ“Ή</a></td> <td align="center"><a href="https://github.com/HenriqueLimas"><img src="https://avatars0.githubusercontent.com/u/2222191?v=4" width="100px;" alt=""/><br /><sub><b>Henrique Limas</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=HenriqueLimas" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/commits?author=HenriqueLimas" title="Documentation">πŸ“–</a> <a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3AHenriqueLimas" title="Reviewed Pull Requests">πŸ‘€</a></td> <td align="center"><a href="https://robertwpearce.com"><img src="https://avatars2.githubusercontent.com/u/592876?v=4" width="100px;" alt=""/><br /><sub><b>Robert Pearce</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/issues?q=author%3Arpearce" title="Bug reports">πŸ›</a> <a href="https://github.com/evilsoft/crocks/commits?author=rpearce" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Arpearce" title="Reviewed Pull Requests">πŸ‘€</a> <a href="#tutorial-rpearce" title="Tutorials">βœ…</a> <a href="https://github.com/evilsoft/crocks/commits?author=rpearce" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/flintinatux"><img src="https://avatars1.githubusercontent.com/u/888052?v=4" width="100px;" alt=""/><br /><sub><b>Scott McCormack</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/issues?q=author%3Aflintinatux" title="Bug reports">πŸ›</a></td> <td align="center"><a href="http://www.fdaoud.com"><img src="https://avatars3.githubusercontent.com/u/1706600?v=4" width="100px;" alt=""/><br /><sub><b>Fred Daoud</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Afoxdonut" title="Reviewed Pull Requests">πŸ‘€</a></td> </tr> <tr> <td align="center"><a href="https://github.com/karthikiyengar"><img src="https://avatars0.githubusercontent.com/u/8260207?v=4" width="100px;" alt=""/><br /><sub><b>Karthik Iyengar</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Akarthikiyengar" title="Reviewed Pull Requests">πŸ‘€</a> <a href="https://github.com/evilsoft/crocks/commits?author=karthikiyengar" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/commits?author=karthikiyengar" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/jonwhelan"><img src="https://avatars1.githubusercontent.com/u/7376957?v=4" width="100px;" alt=""/><br /><sub><b>Jon Whelan</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/issues?q=author%3Ajonwhelan" title="Bug reports">πŸ›</a> <a href="https://github.com/evilsoft/crocks/commits?author=jonwhelan" title="Code">πŸ’»</a></td> <td align="center"><a href="http://bennypowers.com"><img src="https://avatars0.githubusercontent.com/u/1466420?v=4" width="100px;" alt=""/><br /><sub><b>Benny Powers</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=bennypowers" title="Documentation">πŸ“–</a> <a href="https://github.com/evilsoft/crocks/commits?author=bennypowers" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Abennypowers" title="Reviewed Pull Requests">πŸ‘€</a></td> <td align="center"><a href="https://github.com/dalefrancis88"><img src="https://avatars0.githubusercontent.com/u/1909325?v=4" width="100px;" alt=""/><br /><sub><b>Dale Francis</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=dalefrancis88" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/pulls?q=is%3Apr+reviewed-by%3Adalefrancis88" title="Reviewed Pull Requests">πŸ‘€</a></td> <td align="center"><a href="https://github.com/premithk"><img src="https://avatars1.githubusercontent.com/u/7926867?v=4" width="100px;" alt=""/><br /><sub><b>Premith</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=premithk" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/dbagia"><img src="https://avatars0.githubusercontent.com/u/6302673?v=4" width="100px;" alt=""/><br /><sub><b>Dipen Bagia</b></sub></a><br /><a href="#example-dbagia" title="Examples">πŸ’‘</a></td> <td align="center"><a href="https://github.com/ximenean"><img src="https://avatars3.githubusercontent.com/u/5243925?v=4" width="100px;" alt=""/><br /><sub><b>Andrew Jones</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=ximenean" title="Documentation">πŸ“–</a></td> </tr> <tr> <td align="center"><a href="https://github.com/wayneseymour"><img src="https://avatars0.githubusercontent.com/u/4858051?v=4" width="100px;" alt=""/><br /><sub><b>W. K. Seymour III</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=wayneseymour" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://youtube.com/euprogramadoroficial"><img src="https://avatars2.githubusercontent.com/u/11702749?v=4" width="100px;" alt=""/><br /><sub><b>Eliseu Benedito Codinhoto</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=zeucxb" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/NiallArkEnergy"><img src="https://avatars3.githubusercontent.com/u/12712867?v=4" width="100px;" alt=""/><br /><sub><b>NiallArkEnergy</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=NiallArkEnergy" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/commits?author=NiallArkEnergy" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/vidyu"><img src="https://avatars0.githubusercontent.com/u/3265934?v=4" width="100px;" alt=""/><br /><sub><b>vidyu</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=vidyu" title="Documentation">πŸ“–</a></td> <td align="center"><a href="http://michael-wolfenden.github.io"><img src="https://avatars2.githubusercontent.com/u/780521?v=4" width="100px;" alt=""/><br /><sub><b>Michael Wolfenden</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=michael-wolfenden" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/JohanCodinha"><img src="https://avatars0.githubusercontent.com/u/14071356?v=4" width="100px;" alt=""/><br /><sub><b>Johan Codinha</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/issues?q=author%3AJohanCodinha" title="Bug reports">πŸ›</a></td> <td align="center"><a href="http://www.mattross.io"><img src="https://avatars0.githubusercontent.com/u/450220?v=4" width="100px;" alt=""/><br /><sub><b>Matt Ross</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=amsross" title="Code">πŸ’»</a></td> </tr> <tr> <td align="center"><a href="http://jazzy.codes"><img src="https://avatars2.githubusercontent.com/u/4014487?v=4" width="100px;" alt=""/><br /><sub><b>Jasmina Jacquelina</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=jasminabasurita" title="Documentation">πŸ“–</a> <a href="https://github.com/evilsoft/crocks/commits?author=jasminabasurita" title="Code">πŸ’»</a></td> <td align="center"><a href="https://github.com/faliah"><img src="https://avatars0.githubusercontent.com/u/5593080?v=4" width="100px;" alt=""/><br /><sub><b>Denis Zolkin</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=faliah" title="Documentation">πŸ“–</a></td> <td align="center"><a href="http://www.cnblogs.com/Answer1215/"><img src="https://avatars0.githubusercontent.com/u/11929006?v=4" width="100px;" alt=""/><br /><sub><b>Zhentian Wan</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=zhentian-wan" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/RichardForrester"><img src="https://avatars0.githubusercontent.com/u/12902182?v=4" width="100px;" alt=""/><br /><sub><b>RichardForrester</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=RichardForrester" title="Code">πŸ’»</a> <a href="https://github.com/evilsoft/crocks/commits?author=RichardForrester" title="Documentation">πŸ“–</a> <a href="https://github.com/evilsoft/crocks/commits?author=RichardForrester" title="Tests">⚠️</a></td> <td align="center"><a href="http://furkantunali.com"><img src="https://avatars2.githubusercontent.com/u/68406?v=4" width="100px;" alt=""/><br /><sub><b>Furkan TunalΔ±</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=JacopKane" title="Documentation">πŸ“–</a> <a href="#example-JacopKane" title="Examples">πŸ’‘</a></td> <td align="center"><a href="https://github.com/sunwukonga"><img src="https://avatars3.githubusercontent.com/u/12194690?v=4" width="100px;" alt=""/><br /><sub><b>Paul Desmond Parker</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=sunwukonga" title="Documentation">πŸ“–</a></td> <td align="center"><a href="https://github.com/area73"><img src="https://avatars3.githubusercontent.com/u/2030605?v=4" width="100px;" alt=""/><br /><sub><b>Rodrigo Erades</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=area73" title="Documentation">πŸ“–</a></td> </tr> <tr> <td align="center"><a href="https://twitter.com/jamiedixon"><img src="https://avatars2.githubusercontent.com/u/1519443?v=4" width="100px;" alt=""/><br /><sub><b>Jamie Dixon</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=JamieDixon" title="Code">πŸ’»</a></td> <td align="center"><a href="http://sharepointfordeveloper.blogspot.com"><img src="https://avatars2.githubusercontent.com/u/896016?v=4" width="100px;" alt=""/><br /><sub><b>Basant Pandey</b></sub></a><br /><a href="https://github.com/evilsoft/crocks/commits?author=BasantPandey" title="Documentation">πŸ“–</a></td> </tr> </table> <!-- markdownlint-enable --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->

Course/Videos

Video evilsoft

Video avanslaars

Tutorials

Tutorial rpearce

Examples

Example dbagia