Daggy

Library for creating tagged constructors.

daggy.getInstance(self, constructor)

Returns self if it's an instanceof constructor, otherwise creates a new object with constructor's prototype.

Allows creating constructors that can be used with or without the new keyword but always have the correct prototype.

function WrappedArray() {
    var self = daggy.getInstance(this, WrappedArray);
    self._array = [].slice.apply(arguments);
    return self;
}
new WrappedArray(1, 2, 3) instanceof WrappedArray; // true
WrappedArray(1, 2, 3) instanceof WrappedArray; // true

daggy.tagged(arguments)

Creates a new constructor with the given field names as arguments and properties. Allows instanceof checks with returned constructor.

var Tuple3 = daggy.tagged('x', 'y', 'z');

var _123 = Tuple3(1, 2, 3); // optional new keyword
_123.x == 1 && _123.y == 2 && _123.z == 3; // true
_123 instanceof Tuple3; // true

daggy.taggedSum(constructors)

Creates a constructor for each key in constructors. Returns a function with each constructor as a property. Allows instanceof checks for each constructor and the returned function.

var Option = daggy.taggedSum({
    Some: ['x'],
    None: []
});

Option.Some(1) instanceof Option.Some; // true
Option.Some(1) instanceof Option; // true
Option.None instanceof Option; // true

function incOrZero(o) {
    return o.cata({
        Some: function(x) {
            return x + 1;
        },
        None: function() {
            return 0;
        }
    });
}
incOrZero(Option.Some(1)); // 2
incOrZero(Option.None); // 0