existence

    1.1.0 • Public • Published

    Existence

    Build Status Dependencies

    Fantasy Land Compliant!

    Indigenous Complaint!

    A monadic wrapper around values that may or may not exist. Inspired by Scala's Option monad. Unlike Scala's implementation, we have a really small interface and we purposefully don't implement Existence#get().

    The problem with Existence#get() is it lets you side step the contextual bounds by unsafely detaching the value from the context. This results in the same NPE try/catch soup that Option is intended to avoid.

    Examples

    Monoid concatenation example:

    var Some = require("existence/some");
    var None = require("existence/none");
     
    var list  = [new Some([1, 2, 3]), new None(), new Some([4, 5, 6])];
    var added = list.reduce(function(memo, item) {
        return memo.concat(item);
    });
     
    console.log("value: " + JSON.stringify(filtered.getOrDefault([])));
    // prints "value: [1, 2, 3, 4, 5, 6]"

    Functor composition example:

    var Some = require("existence/some");
    var None = require("existence/none");
     
    var some   = new Some(21);
    var answer = some.map(function(n) {
        return n * 2;
    });
    console.log("value: " + answer.getOrDefault("None"));
    // prints "value: 42"
     
    var none = new None();
    var nada = none.map(function(n) {
        return n * 2;
    });
    console.log("exists = " + nada.exists());
    // prints "exists = false"

    Applicative composition example:

    var Existence = require("existence");
    var Some      = require("existence/some");
    var None      = require("existence/none");
    var curry     = require("lodash").curry;
     
    var someNumber  = new Some(42);
    var someString  = new Some("beep");
    var someBoolean = new Some(true);
    var none        = new None();
     
    var lifted = Existence.of(curry(function(a, b, c) {
        return a + " - " + b + " - " + c;
    }));
     
    var allThere = lifted.ap(someNumber).ap(someString).ap(someBoolean);
    console.log("value: " + answer.getOrDefault("None"));
    // prints "value: 42 - beep - true"
     
    var missing = lifted.ap(someNumber).ap(none).ap(someBoolean);
    console.log("value: " + answer.getOrDefault("None"));
    // prints "value: None"
     

    Monadic composition (flatMap / chain) example (flatMap is an alias for chain):

    var Some = require("existence/some");
    var None = require("existence/none");
     
    var value    = new Some(42);
    var filtered = value.flatMap(function(n) {
        return (% 1 == 0) ? new Some(n)
                            : new None()
    });
     
    console.log("value: " + filtered.getOrDefault("value was not even"));
    // prints "value: 42"

    Install

    npm i existence

    DownloadsWeekly Downloads

    14

    Version

    1.1.0

    License

    none

    Last publish

    Collaborators

    • josephmoniz