diff --git a/src/monet.d.ts b/src/monet.d.ts index e3de405..170c9c8 100644 --- a/src/monet.d.ts +++ b/src/monet.d.ts @@ -54,6 +54,8 @@ interface IMonad extends Functor, Bind, Applicative { chain(fn: (val: T) => IMonad): IMonad; map(fn: (val: T) => V): IMonad; join(): IMonad; // only if T = IMonad + mapT(fn: (val: V1) => V2): IMonad>; // only if T = IMonad + mapTT(fn: (val: V1) => V2): IMonad>>; // only if T = IMonad> /* These are monet-Monad-specific: */ takeLeft(m: IMonad): IMonad; diff --git a/src/monet.js b/src/monet.js index 178f1cb..24a8d74 100644 --- a/src/monet.js +++ b/src/monet.js @@ -77,7 +77,7 @@ var targetType = target[TYPE_KEY] || target.constructor && target.constructor[TYPE_KEY] - return Boolean(targetType) && + return Boolean(targetType) && targetType.length >= typeName.length && targetType.indexOf(typeName) === targetType.length - typeName.length } @@ -714,7 +714,7 @@ }) }, toArray: function () { - return this.map(function (val) { + return this.map(function (val) { return [val] }).orLazy(function () { return [] @@ -1376,6 +1376,17 @@ }) } } + + type.prototype.mapT = function(fn) { + return this.map(function (ma) { + return ma.map(fn) + }) + } + type.prototype.mapTT = function(fn) { + return this.map(function (ma) { + return ma.mapT(fn) + }) + } } function addFunctorOps(type) {