Skip to content

Commit

Permalink
Add tap, tapOk, tapError, tapSome
Browse files Browse the repository at this point in the history
  • Loading branch information
aantron committed Sep 22, 2019
1 parent 83fc210 commit 217e19e
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 1 deletion.
21 changes: 21 additions & 0 deletions src/js/repromise.re
Expand Up @@ -155,6 +155,11 @@ module Rejectable = {
let on = (callback, promise) =>
promise |> map(callback) |> ignore;

let tap = (callback, promise) => {
on(callback, promise);
promise;
};

[@bs.scope "Promise"]
[@bs.val]
external rejected: 'e => rejectable(_, 'e) = "reject";
Expand Down Expand Up @@ -233,6 +238,7 @@ let resolved = Rejectable.resolved;
let flatMap = Rejectable.flatMap;
let map = Rejectable.map;
let on = Rejectable.on;
let tap = Rejectable.tap;
let all = Rejectable.all;
let all2 = Rejectable.all2;
let all3 = Rejectable.all3;
Expand Down Expand Up @@ -289,6 +295,16 @@ let onError = (_callback, promise) =>
| Error(_) => [%raw "_callback(result[0])"]
});

let tapOk = (callback, promise) => {
onOk(callback, promise);
promise;
};

let tapError = (callback, promise) => {
onError(callback, promise);
promise;
};

module Operators = {
let (>|=) = (promise, callback) =>
mapOk(callback, promise);
Expand Down Expand Up @@ -319,3 +335,8 @@ let onSome = (_callback, promise) =>
| Some(_) => [%raw "_callback(Caml_option.valFromOption(option))"]
| None => ()
});

let tapSome = (callback, promise) => {
onSome(callback, promise);
promise;
};
13 changes: 13 additions & 0 deletions src/js/repromise.rei
Expand Up @@ -23,6 +23,8 @@ let map: ('a => 'b, promise('a)) => promise('b);

let on: ('a => unit, promise('a)) => unit;

let tap: ('a => unit, promise('a)) => promise('a);

let flatMap: ('a => promise('b), promise('a)) => promise('b);

let all: list(promise('a)) => promise(list('a));
Expand Down Expand Up @@ -71,6 +73,12 @@ let onOk:
let onError:
('e => unit, promise(result(_, 'e))) => unit;

let tapOk:
('a => unit, promise(result('a, 'e))) => promise(result('a, 'e));

let tapError:
('e => unit, promise(result('a, 'e))) => promise(result('a, 'e));

let flatMapOk:
('a => promise(result('b, 'e)), promise(result('a, 'e))) =>
promise(result('b, 'e));
Expand All @@ -97,6 +105,9 @@ let mapSome:
let onSome:
('a => unit, promise(option('a))) => unit;

let tapSome:
('a => unit, promise(option('a))) => promise(option('a));

let flatMapSome:
('a => promise(option('b)), promise(option('a))) => promise(option('b));

Expand All @@ -118,6 +129,8 @@ module Rejectable: {

let on: ('a => unit, rejectable('a, _)) => unit;

let tap: ('a => unit, rejectable('a, 'e)) => rejectable('a, 'e);

let flatMap:
('a => rejectable('b, 'e), rejectable('a, 'e)) => rejectable('b, 'e);

Expand Down
21 changes: 21 additions & 0 deletions src/native/repromise.re
Expand Up @@ -214,6 +214,11 @@ let map = (mapper, promise) =>
let on = (callback, promise) =>
map(callback, promise) |> ignore;

let tap = (callback, promise) => {
on(callback, promise);
promise;
};

let catch = (callback, promise) => {
let outerPromise = newInternal();

Expand Down Expand Up @@ -494,6 +499,16 @@ let onError = (callback, promise) =>
| Ok(_) => ()
| Error(error) => callback(error));

let tapOk = (callback, promise) => {
onOk(callback, promise);
promise;
};

let tapError = (callback, promise) => {
onError(callback, promise);
promise;
};

module Operators = {
let (>|=) = (promise, callback) =>
mapOk(callback, promise);
Expand All @@ -519,6 +534,11 @@ let onSome = (callback, promise) =>
| Some(value) => callback(value)
| None => ());

let tapSome = (callback, promise) => {
onSome(callback, promise);
promise;
};



module Rejectable = {
Expand All @@ -538,6 +558,7 @@ module Rejectable = {
let flatMap = flatMap;
let map = map;
let on = on;
let tap = tap;
let catch = catch;
let all = all;
let race = race;
Expand Down
13 changes: 13 additions & 0 deletions src/native/repromise.rei
Expand Up @@ -23,6 +23,8 @@ let map: ('a => 'b, promise('a)) => promise('b);

let on: ('a => unit, promise('a)) => unit;

let tap: ('a => unit, promise('a)) => promise('a);

let flatMap: ('a => promise('b), promise('a)) => promise('b);

let all: list(promise('a)) => promise(list('a));
Expand Down Expand Up @@ -71,6 +73,12 @@ let onOk:
let onError:
('e => unit, promise(result(_, 'e))) => unit;

let tapOk:
('a => unit, promise(result('a, 'e))) => promise(result('a, 'e));

let tapError:
('e => unit, promise(result('a, 'e))) => promise(result('a, 'e));

let flatMapOk:
('a => promise(result('b, 'e)), promise(result('a, 'e))) =>
promise(result('b, 'e));
Expand All @@ -97,6 +105,9 @@ let mapSome:
let onSome:
('a => unit, promise(option('a))) => unit;

let tapSome:
('a => unit, promise(option('a))) => promise(option('a));

let flatMapSome:
('a => promise(option('b)), promise(option('a))) => promise(option('b));

Expand All @@ -121,6 +132,8 @@ module Rejectable: {

let on: ('a => unit, rejectable('a, _)) => unit;

let tap: ('a => unit, rejectable('a, 'e)) => rejectable('a, 'e);

let catch:
('e => rejectable('a, 'e2), rejectable('a, 'e)) => rejectable('a, 'e2);

Expand Down
51 changes: 50 additions & 1 deletion test/test_repromise.re
Expand Up @@ -22,7 +22,14 @@ let basicTests = Framework.suite("basic", [
Repromise.resolved(1)
|> Repromise.on(n => correct := (n == 1));
Repromise.resolved()
|> Repromise.map(() => correct^)
|> Repromise.map(() => correct^);
}),

test("tap", () => {
let correct = ref(false);
Repromise.resolved(1)
|> Repromise.tap(n => correct := (n == 1))
|> Repromise.map(n => n == 1 && correct^);
}),

test("flatMap", () => {
Expand Down Expand Up @@ -563,6 +570,34 @@ let resultTests = Framework.suite("result", [
|> Repromise.map(n => n == 43);
}),

test("tapOk, ok", () => {
let correct = ref(false);
Repromise.resolved(Ok(42))
|> Repromise.tapOk(n => correct := n == 42)
|> Repromise.map(result => result == Ok(42) && correct^);
}),

test("tapOk, error", () => {
let called = ref(false);
Repromise.resolved(Error(42))
|> Repromise.tapOk(_ => called := true)
|> Repromise.map(result => result == Error(42) && !called^);
}),

test("tapError, ok", () => {
let called = ref(false);
Repromise.resolved(Ok(42))
|> Repromise.tapError(_ => called := true)
|> Repromise.map(result => result == Ok(42) && !called^);
}),

test("onError, error", () => {
let correct = ref(false);
Repromise.resolved(Error(42))
|> Repromise.tapError(n => correct := n == 42)
|> Repromise.map(result => result == Error(42) && correct^);
}),

test("flatMapOk, ok", () => {
Repromise.resolved(Ok(42))
|> Repromise.flatMapOk(n => Repromise.resolved(Ok(n + 1)))
Expand Down Expand Up @@ -647,6 +682,20 @@ let optionTests = Framework.suite("opton", [
|> Repromise.map(() => !called^);
}),

test("tapSome, some", () => {
let correct = ref(false);
Repromise.resolved(Some(42))
|> Repromise.tapSome(n => correct := n == 42)
|> Repromise.map(result => result == Some(42) && correct^);
}),

test("tapSome, none", () => {
let called = ref(false);
Repromise.resolved(None)
|> Repromise.tapSome(_ => called := true)
|> Repromise.map(result => result == None && !called^);
}),

test("flatMapSome, some", () => {
Repromise.resolved(Some(42))
|> Repromise.flatMapSome(n => Repromise.resolved(Some(n + 1)))
Expand Down

0 comments on commit 217e19e

Please sign in to comment.