diff --git a/mpromise/mpromise-tests.ts b/mpromise/mpromise-tests.ts
new file mode 100644
index 000000000..cb09df475
--- /dev/null
+++ b/mpromise/mpromise-tests.ts
@@ -0,0 +1,134 @@
+///
+///
+
+var assert = require('assert');
+import Promise = require('mpromise');
+
+function ex1() {
+ var promise = new Promise;
+}
+
+function ex2() {
+ var promise = new Promise (function(reason: string, ...args: number[]) {
+ return;
+ });
+}
+
+function ex3() {
+ var promise = new Promise();
+ promise.onResolve(function(reason: string, ...args: number[]) {
+ return;
+ });
+}
+
+function fulfill() {
+ var promise = new Promise();
+ promise.fulfill(1, 2, 3);
+}
+
+function reject() {
+ var promise = new Promise();
+ promise.reject('reason');
+}
+
+function onFulfill1() {
+ var promise = new Promise();
+ promise.onFulfill(function (...args: number[]) {
+ assert.equal(3, args[0] + args[1]);
+ });
+ promise.fulfill(1, 2);
+}
+
+function onFulfill2() {
+ var promise = new Promise();
+ promise.fulfill(" :D ");
+ promise.onFulfill(function (arg: string) {
+ console.log(arg); // logs " :D "
+ });
+}
+
+function onReject1() {
+ var promise = new Promise();
+ promise.onReject(function (reason: string) {
+ assert.equal('sad', reason);
+ });
+ promise.reject('sad');
+}
+
+function onReject2() {
+ var promise = new Promise();
+ promise.reject(" :( ");
+ promise.onReject(function (reason: string) {
+ console.log(reason); // logs " :( "
+ });
+}
+
+function onResolve1() {
+ var promise = new Promise();
+ promise.onResolve(function (err: R, ...args: number[]) {
+ console.log(args[0] + args[1]); // logs 3
+ });
+ promise.fulfill(1, 2);
+}
+
+function onResolve2() {
+ // rejection
+ var promise = new Promise();
+ promise.onResolve(function (err: Error) {
+ if (err) {
+ console.log(err.message); // logs "failed"
+ }
+ });
+ promise.reject(new Error('failed'));
+}
+
+function then() {
+ var promise = new Promise();
+
+ promise.then(function (arg: number) {
+ return arg + 1;
+ }).then(function (arg: number) {
+ throw new Error(arg + ' is an error!');
+ }).then(null, function (err: Error) {
+ assert.ok(err instanceof Error);
+ assert.equal('2 is an error', err.message);
+ });
+ promise.fulfill(1);
+}
+
+function end1() {
+ var promise = new Promise();
+ promise.then(function(){ throw new Error('shucks') });
+ setTimeout(function () {
+ promise.fulfill();
+ // error was caught and swallowed by the promise returned from
+ // p.then(). we either have to always register handlers on
+ // the returned promises or we can do the following...
+ }, 10);
+}
+
+function end2() {
+ // this time we use .end() which prevents catching thrown errors
+ var promise = new Promise();
+ setTimeout(function () {
+ promise.fulfill(); // throws "shucks"
+ }, 10);
+ return promise.then(function(){ throw new Error('shucks') }).end(); // <--
+}
+
+function chain() {
+ function makeMeAPromise(i: number) {
+ var p = new Promise();
+ p.fulfill(i);
+ return p;
+ }
+
+ var initialPromise = new Promise();
+ var returnPromise = initialPromise;
+ for (var i=0; i<10; ++i) {
+ returnPromise = returnPromise.chain(makeMeAPromise(i));
+ }
+
+ initialPromise.fulfill();
+ return returnPromise;
+}
diff --git a/mpromise/mpromise.d.ts b/mpromise/mpromise.d.ts
new file mode 100644
index 000000000..ba6961362
--- /dev/null
+++ b/mpromise/mpromise.d.ts
@@ -0,0 +1,42 @@
+// Type definitions for mpromise 0.5.4
+// Project: https://github.com/aheckmann/mpromise
+// Definitions by: Seulgi Kim
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module "mpromise" {
+ interface IFulfillFunction {
+ (...args: F[]): void;
+ (arg: F): void;
+ }
+ interface IRejectFunction {
+ (err: R): void;
+ }
+ interface IResolveFunction {
+ (err: R, ...args: F[]): void;
+ (err: R, arg: F): void;
+ }
+
+ class Promise {
+ constructor(fn?: IResolveFunction);
+
+ static FAILURE: string;
+ static SUCCESS: string;
+
+ fulfill(...args: F[]): Promise;
+ fulfill(arg: F): Promise;
+ reject(reason: R): Promise;
+ resolve(reason: R, ...args: F[]): Promise;
+ resolve(reason: R, arg: F): Promise;
+
+ onFulfill(callback: IFulfillFunction): Promise;
+ onReject(callback: IRejectFunction): Promise;
+ onResolve(callback: IResolveFunction): Promise;
+
+ then(onFulfilled: IFulfillFunction, onRejected?: IRejectFunction): Promise;
+ end(): void;
+
+ chain(promise: Promise): Promise;
+ }
+
+ export = Promise;
+}