{"name":"breakable","version":"1.0.0","description":"Break out of functions, recursive or not, in a more composable way than by using exceptions explicitly. Non-local return.","main":"breakable.js","repository":{"type":"git","url":"https://github.com/olov/breakable.git"},"keywords":["throw","try","catch","exception","non-local","return","break","breakable"],"scripts":{"test":"tap test/*.js"},"devDependencies":{"tap":"~0.4.4"},"author":{"name":"Olov Lassus","email":"olov.lassus@gmail.com"},"license":"MIT","readme":"# breakable.js\nBreak out of functions, recursive or not, in a more composable way\nthan by using exceptions explicitly. Non-local return.\n\n\n\n## Usage\nYou can use breakable to break out of simple loops like this example\nbut note that it is often simpler to just use `.some` instead. Anyways,\nhere's a minimal example.\n\n```javascript\nvar breakable = require(\"breakable\");\n\nbreakable(function(brk) {\n    arr.forEach(function(v) {\n        if (...) {\n           brk();\n        }\n    });\n});\n```\n\nPass a value to `brk` and it becomes the return-value of breakable.\n\n\nbreakable is useful when you want to break out of a deep recursion,\npassing a value, without riddling your code with exception ceremony.\n\nInstead of:\n\n```javascript\nvar esprima = require(\"esprima\").parse;\nvar traverse = require(\"ast-traverse\");\nvar ast = esprima(\"f(!x, y)\");\n\nvar val;\ntry {\n    traverse(ast, {pre: function(node) {\n        if (node.type === \"UnaryExpression\" && node.operator === \"!\") {\n            val = node.argument;\n            throw 0;\n        }\n    }});\n} catch(e) {\n    if (val === undefined) {\n        throw e; // re-throw if it wasn't our exception\n    }\n}\n\nconsole.dir(val); // { type: 'Identifier', name: 'x' }\n```\n\nyou use breakable and do:\n\n```javascript\nvar breakable = require(\"breakable\");\nvar esprima = require(\"esprima\").parse;\nvar traverse = require(\"ast-traverse\");\nvar ast = esprima(\"f(!x, y)\");\n\nvar val = breakable(function(brk) {\n    traverse(ast, {pre: function(node) {\n        if (node.type === \"UnaryExpression\" && node.operator === \"!\") {\n            brk(node.argument);\n        }\n    }});\n});\n\nconsole.dir(val); // { type: 'Identifier', name: 'x' }\n```\n\n\n\n## Installation\n\n### Node\nInstall using npm\n\n    npm install breakable\n\n```javascript\nvar breakable = require(\"breakable\");\n```\n\n### Browser\nClone the repo and include it in a script tag\n\n    git clone https://github.com/olov/breakable.git\n\n```html\n<script src=\"breakable/breakable.js\"></script>\n```\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/olov/breakable/issues"},"homepage":"https://github.com/olov/breakable","_id":"breakable@1.0.0","_shasum":"784a797915a38ead27bad456b5572cb4bbaa78c1","_from":"https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz","_resolved":"https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz"}