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