From b77effbd0247522177e8845ef73505c64d60dafe Mon Sep 17 00:00:00 2001 From: Nick Zuber Date: Mon, 19 Dec 2016 23:28:45 -0500 Subject: [PATCH] Added Contracts (#127) * Added description of contracts * Added ES6 example * linted and toc --- readme.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index d624e89..b398ca4 100644 --- a/readme.md +++ b/readme.md @@ -31,6 +31,8 @@ __Table of Contents__ * [Value](#value) * [Constant](#constant) * [Functor](#functor) + * [Preserves identity](#preserves-identity) + * [Composable](#composable) * [Pointed Functor](#pointed-functor) * [Lift](#lift) * [Referential Transparency](#referential-transparency) @@ -270,7 +272,20 @@ const predicate = (a) => a > 2 ## Contracts -TODO +A contract specifies the obligations and guarentees of the behavior from a function or expression at runtime. This acts as a set of rules that are expected from the input and output of a function or expression, and errors are generally reported whenever a contract is violated. + +```js +// Define our contract : int -> int +const contract = (input) => { + if (typeof input === 'number') return true + throw new Error('Contract violated: expected int -> int') +} + +const addOne = (num) => contract(num) && num + 1 + +addOne(2) // 3 +addOne('some string') // Contract violated: expected int -> int +``` ## Guarded Functions