{"_id":"frb","_rev":"138-7bf5b18406d0bf12d215f529ebe43328","name":"frb","description":"Functional reactive bindings","dist-tags":{"latest":"4.0.3"},"versions":{"0.0.0":{"name":"frb","main":"frb","version":"0.0.0","dependencies":{"collections":"0.0.x"},"devDependencies":{"jasmine-node":"0.1.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.0","description":"-   **property and content change events** for objects and arrays using     getters and setters for observable objects and either prototype     swapping or method override for observable arrays.  Other collection     types can implement the same interface","dist":{"shasum":"750d528a07ae2db80dd6feb6cb1600893821a76f","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.0.tgz","integrity":"sha512-TWIYoAkbhOqoBoP0TA1NTi0l2hrLHh+x23kX47DlM0qo6eK2i2AbSyzPxtUYjp6FijRVMOlLewYLox7Unram/w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUXa0WHlbBiAQYaai/9CabgxTXbzf3ilCgAhoTV+9tLQIhALp/3Hf7tToxQFQk6CXGGQRNMfIG6IYNlJpb/rII/N0M"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.1":{"name":"frb","version":"0.0.1","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"frb","dependencies":{"collections":"0.0.x"},"devDependencies":{"jasmine-node":"0.1.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.1","dist":{"shasum":"17ee9293b8f3b5446aaa5b37a8fe9706a4f99720","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.1.tgz","integrity":"sha512-ADoAc8uFwCTwXFBFVnMlDesKNx2N6URB4fU+XmsbLFDCFGTbTo900DvQPCDBsv6TQWW+Fo4pxFN6JiVl+wcrFQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5yhfS3bPPnWHFWB033L4EbmVoXXD3A/WM+keakCOV6wIhAMPtGnkKKW4wP2nHNPDoC0tDVF/J/EXid3yo4l4rZ8E4"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.2":{"name":"frb","version":"0.0.2","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"frb","dependencies":{"collections":">=0.0.5"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.2","dist":{"shasum":"dd83989a3fb054e43fa46dbdb011b751606b4504","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.2.tgz","integrity":"sha512-DFveufwfKaQk8+d0Mxci9o9utezEqJ4fTzf/E5ezukBR8FTKeM7DXrO7bCJ9HF7GK7F+tVcHzS6JXhrpZQ74aQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIChi96R9YTtSwHHxiBm6BzrI50u2Mhw1OykZET4g/CghAiEAg3RWrQuMRB5pI0zJL2ClRB3i+0vULUAfAZKBK8HlNTs="}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.3":{"name":"frb","version":"0.0.3","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"frb","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.3","dist":{"shasum":"1fd95f214b67c2d41932c9cc3a8408cf2b614fab","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.3.tgz","integrity":"sha512-Hwl5YgDAnTZEENad3Z1FtrAT1KbsvLa/IDFs7nUnuRN9uwJIAZNRNBrmwQot4qCqeDZeO73aqvB5YmAqPWYDhw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAvEch/Nlr6p+ttR0A7bdcxwSf4Bj9FBCbfCuTA/6p6wIgbxzOoTiPPGa9hdKeAeJVBNxbOxi7KbuScxXLsjqBeXE="}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.4":{"name":"frb","version":"0.0.4","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"frb","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.4","dist":{"shasum":"c6f85dde784ac367d92919ce179edb4073cc9b08","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.4.tgz","integrity":"sha512-QlHPMMZsT6wOPwdTDCdWIa4uSl9op84OjZUtvHU03qn/w6kHiBTi7Wwe0C+3BaUVaDG2Eowsn41CCBTlCJnCmg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEJY9NfbY2MWHuXB1xt5HMxGE/eYXB8yjrAV/vJXfnkjAiBqOHnysHGjraNaOUtQOh49qGqKjT6ga2Hmo5Bp17UGng=="}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.5":{"name":"frb","version":"0.0.5","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.5","dist":{"shasum":"10a1ccb190414e99f671b097b565b9b2ddda98bf","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.5.tgz","integrity":"sha512-0w+SqH8OJkshOqo8xa6EJNzsj0N9YYqKoSJdTsPcrUwUkher1l8keGt9OWAdTaq3LrKY5D3FJEj2zF7sjYShLQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDASSRFkPmGm9St9J8ESn/6YOOWbVHAnAud7i1/aiMBZAIhAMxLTbXv+briaYPTPaEob9mdAb+E27xF84Hd4PBb1xob"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.6":{"name":"frb","version":"0.0.6","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.6","dist":{"shasum":"ad09822d062df289f3ba79d6970fd514566ae4e8","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.6.tgz","integrity":"sha512-lSvCCCQwFi2W8f/mVwS07TrDFVO3MYYYGBrVphZIA9d191thlgF7ZCar32c5Sk2tPqCKthVouPI/CRHGA4ATsw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwe3++EFCO+XENAr2uU95ixT73ecOTyAY5WAhaOw3BRwIhAJfNjRl9mm4WUhh8ZCmlfz75FO5clYeS6MBUopPQShct"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.7":{"name":"frb","version":"0.0.7","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.7","dist":{"shasum":"381ae1625d947b77c222fa1fbc987d57fe651962","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.7.tgz","integrity":"sha512-FmHw5xDvpD57ivFdUjmDougC4jegONZ0nTQfHSvwv3hHyyhpfVWClRV8hFt+pmSq3zswMTXDmDpZvvMUoVqsow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFgTLsyOAGbVSPun6UTfvoVBVdfJQj1pf0sc66sjKH3eAiAkyvgbD/QYrVV3Zy5sDmzNOWlCxfnuhZU2xcImmc7iOQ=="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.8":{"name":"frb","version":"0.0.8","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":">=0.0.6"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.8","dist":{"shasum":"78ed2e292772e9ae2f7a71eac874a5944614fec2","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.8.tgz","integrity":"sha512-2XPWFSLLujMkSTlzfOfIwSg1IhmJHNWlQcvbUcuqj+PqPkAYpzZ5YgL6i9c/9kEt46vhwzTXJBRQtb5c2YmvhA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpz/L4zmouoq8Q6T/xR3gOjXVyAEdVx5zVKaUFmVBIqQIgRX8N2OzBQtOqRT+kM7jtpEQZ280R76VOqe0E2T928yI="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.0.9":{"name":"frb","version":"0.0.9","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":">=0.0.11"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.0.9","dist":{"shasum":"156a97d63f0d426dcb329fac6fd20ea47dc36f32","tarball":"https://registry.npmjs.org/frb/-/frb-0.0.9.tgz","integrity":"sha512-5H0SWcgC0BpQ9KfIqNleFPr3i1CI4nkU4THwFAzKGgJ+xdsC4S+AVx7Pt7J/Rl/OqoW9nn/CwXNLZs37xGWDkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4LbYWD98wECzHF7zZODZB3ZAQqG6OmeEkAkMlpHPlUQIhAPEroJXTMMUkvH0FJ2RWyOGiJkdZC1Ji0rXEZsglobZM"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.0":{"name":"frb","version":"0.1.0","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.0","dist":{"shasum":"760e7ee23060ac7b440239135f602b93fadb0f56","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.0.tgz","integrity":"sha512-ob7cW2VO2bDwiWP6OhunD9fEvIqnzeJYrvQVTsoXCZ74NXLyfmUfXbo9ndCvOJPQomHKm12aFRoOIrdrQHMhaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdqNJDp/ao80UiOf2RPJzHa6IvhAVshVwPf4rT2+nOsAIhAKvFHQMFzyswgbbfLHmqYJdQQLpkove2g4fzPEIBZAtT"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.1":{"name":"frb","version":"0.1.1","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.1","dist":{"shasum":"ec72dcd274dfcff1d51a83775136577845d199d5","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.1.tgz","integrity":"sha512-m3gcoU0jce8A5s4xa08AyXeoMLvXiHyb1ntzX0onIKf4zmgt0l7MLabMPyTruvtraUuZXvAuO3iGrV1rFfRK9Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJ4WTKeLe0Iab5e1qesasb1bbnX2iU3i/Zr7+aCVx8QAIgcoWAN+O/LNmHqqUqDVBBRQPNgj/rDk4CFHJUD5d6r4I="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.2":{"name":"frb","version":"0.1.2","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.2","dist":{"shasum":"d32b70d4bd73a39a00da8ac1f794c0ef6d0e20e9","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.2.tgz","integrity":"sha512-KEAsEr5Ejd4qppZ51+TIf3r+35IqJJBXZWmabNz5hvh+Tw7qeHES8UyHcqXpYS7doftSaJVrQB5lqklm6pp4sQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICI3j6nIvNlGlYNZLE5gUO9fmB3fFan/UbELinqaiQGUAiAxcNEPwypMgyRpvUVN67wgYtccoCENzM6ZDc8GEd+vjA=="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.3":{"name":"frb","version":"0.1.3","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.3","dist":{"shasum":"972faafd49a166241605ec00133e5d49bcbe1d4b","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.3.tgz","integrity":"sha512-9wFq+/JKwMqcmUjkDX3V8Zqk+qUNk3gITbjJBdmxHL8nu2AVD8wcNpoGzF1YdIARO9b/6eLZ+i3SXVzO/WUG9A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuIFxAvcqvA5le0EPvZqq8uoUGQl2jdSb6xBDx9hZ91gIhAMIbOdqUw4dm9JeEMTzjqYjrYyiPI21mmi+wmnFUqvHl"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.4":{"name":"frb","version":"0.1.4","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.4","dist":{"shasum":"43e20515dfd3673e38cca2371601008bede4ecf7","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.4.tgz","integrity":"sha512-Q+feFuxNVfRF7764RrGeOP8D/Mo6lai9RKmULN9UY+YdKLNQCp1qT3IA4Nfe4FZS56NI0/Kxp7TUOB54TDuv3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9fyBnorGvqB0c8Yc+bPA5oaGLlPv2pktGjcHuRgfmkAiEAtlttIQDlvXrUQB6UoXTsMwyP5yFXc9fSrtqgxjMG+9I="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.5":{"name":"frb","version":"0.1.5","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.5","dist":{"shasum":"12d52fca80351840e4caae2aaad0097af1934fcc","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.5.tgz","integrity":"sha512-XoHiQqnxgJ57GT/w1YEp5VUSLIDEUA+TAz68aMfyA+mFlJzOXvwYXDoDmJjskF+o4bv2V8KZIyDk22/MbE3xOA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgwnPmV3/tEqhx9F6UqmxNPgtspUPMfREBSacbtx02gQIgeKhHBEulwgbe8q9GWxdRn8nhUa2eJowehqWBzgnvqTw="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.6":{"name":"frb","version":"0.1.6","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.6","dist":{"shasum":"30dc9f73b95872c71e93dc1e0d4d5aa665c661c7","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.6.tgz","integrity":"sha512-rBmzOI3j0+9QlgXHmUQAxpKVDf1rsuM0g7FZ1S9bNxb1pPKt/iLm2rrKQx45LUxe+Xfd7r8JMyX5th/TujEI5A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF2OYDUFdsE9aGSwug5vtL0/ZTwOx5j8dUzDEv2ZANN2AiAGEu/oi3WpJyU13RqGU2eDO+WzrRpZrTZ+3X8SZ+VWpA=="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.7":{"name":"frb","version":"0.1.7","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.7","dist":{"shasum":"fc2251f01b6d2546c0acd37db867c643a50bc98a","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.7.tgz","integrity":"sha512-5snddbaHt68ICHy8VNeThusJqt529Ybg1MeghRNMG/qXB9ChS6zBhwM18OnJ2ZSVilPTqNB5cwQGddJAfWNm8g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGUj4Gx1TNCb2JTiYJDQt3bnyGyk4rXU2vGwYwIurE+GAiEAv0YHHCU20JWoxDgz/ygA55AbccFUuUg0SheoJyRqI1Q="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.8":{"name":"frb","version":"0.1.8","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"0.1.x >=0.1.3"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.8","dist":{"shasum":"a587d3ecfada2a82b5884a84440c5feaa49a22c9","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.8.tgz","integrity":"sha512-B1Zl46zlobRnyGQOusof1cU/A7jXEwYGzG0yKTkGmcLYOJfENaJ4WUm4/O87dxD7WTetbCVdBaI0P4Z5SgCbCw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDL+jUDEG07c2tZqleogIdmlN4W37pwMEerVvHAynDiAwIhAP0nL5neuwVyaYAIg91O9JFJA9q6/krVLKgtHKdyMkTi"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.9":{"name":"frb","version":"0.1.9","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.9"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.9","dist":{"shasum":"49f5cee54e0e6e420c086b7f9b075f77c245b1e5","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.9.tgz","integrity":"sha512-TrwqSdAm4XBT/l753NqWxQyMojSCgoqt9GI02WJqjHCqPB0YKhM+pntxPZnSUsLTiJeBk3wbyZ+IPzhtIg4ooA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDJdMsXbhM0YCluVzcr9AAzBDSkKPHTsEF2qffL2OtxNAiEAjypuw3AAZ+A2qJlUbBIpk/1b6ROZdcbHQM9iFIEp7hs="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.10":{"name":"frb","version":"0.1.10","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.10"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.10","dist":{"shasum":"ce13c6ed91e182e714a888a3358610109845e34e","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.10.tgz","integrity":"sha512-czW+QwoZoD72DO1pE3M6Snh802sW+Ys49PaYefTlWp8l3U9HMRUkbXiiuwA/fUDXNJNRRyF6+mzy5M0zeoAYdg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJfJirF5DhcQaHLM3uLP9QheAQUdq6YWH0VJP4hHaVfQIhALlaFnbWSdWn9yGQiU9hpZMY+ielnkCTM5MMl130/jUs"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.11":{"name":"frb","version":"0.1.11","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.10"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.11","dist":{"shasum":"81ed326f8227265a55b959da949b1ff7594299de","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.11.tgz","integrity":"sha512-tiuepth1hK7bUEE+xcqb8vgGfCxbHqphUqqshM6UO+JF6lSTr7my/WQ9Lk6ZKnEm6VbuWTLeaWbQhCyIryNFCA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdqH9P8TWOL8i0M69eGEcxcRXFlYdAiITZL64i1rJu3AiEA1cqHtW5Oh91JYOAs2t5QEjzywUlvmQr0rFJ79yGpwyY="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.12":{"name":"frb","version":"0.1.12","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.10"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.12","dist":{"shasum":"963152ec66bb3f58ff2d9b95aa83061d80cd064a","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.12.tgz","integrity":"sha512-HO5UgtVU1yNEokh4fSozoltZRQVYyEu3wb79OTjH57kJfispH+Gwocs+QAOM4ySx5Pp7hN9xB33akL01MHyyfg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKe8kgex7l0kXBSToaqBguUOrcDYOGLtpuJmBrKdBYuwIhAIT+bjDkHJT+2Q4bpO17x5vWVxLegvegGM4d/z3u87ev"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.13":{"name":"frb","version":"0.1.13","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.10"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.13","dist":{"shasum":"36eb7c007760e07a3b64de572a685489455df438","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.13.tgz","integrity":"sha512-qFdRE2KbcYftO/giexhtX7biP1auSgqRaGCGoUP7WCOUieMNfEXla4pqnlwmuZKnfWNdH7TduFb9W6Gv5kcukQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNpER5Tm28jmqYKHFEMKijYxVrSiTYMoJR3dkwolBQoQIgcePymm5pbjWeTxzarP/9Xru3RrtfKTCLZ+f7G10COwM="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.14":{"name":"frb","version":"0.1.14","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.10"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.14","dist":{"shasum":"db5597368a6386d84bef68b3f04d53306fe99a75","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.14.tgz","integrity":"sha512-SQj3yMdvKVZa5Ufzz0xfN08cA6SC9NNFxp0aCOXNsuDtZ+jF5/vwIL2voBBxkt4HGp+0B6d+Yyb+R11iepxb2Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAE3y7KtCXPg0YVzyMwyyc9VEIM70PrA11NkgwcTbY1mAiBf5XSPidGVkhxabWipx+EYXEdTS9THp+jqJs5eAq0abg=="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.15":{"name":"frb","version":"0.1.15","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.13"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.15","dist":{"shasum":"e73eed489c1f89673a904c2fac3f641bf25d0490","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.15.tgz","integrity":"sha512-kwBAi1+PiArER2qtQfKrgs4wAK4e+YW9PSYxnAQY/TXvLKmGIWlqXzw0TtH7KKdgNA1QWVc+RLt/SQd7w6t8zw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9ummkpO7X3DTxQ5HnYiw2b3eZpgksZFqoK+nrDPzuGQIhALTVH+0tWAWQdgEmKAAmwattZFCLCjG3aVmShuLHRuQZ"}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.16":{"name":"frb","version":"0.1.16","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.13"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.16","dist":{"shasum":"f26147251d009c0503f0bad6c7f77b0829c65960","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.16.tgz","integrity":"sha512-4gR9vxOWqwsR/O/DDlDgAd7egz3y0QiCawSGEyExWST+4+zkvbRpPzwUorEvZPngWMR9YfuZtdEp9Q43I8LvDw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQSssNFgAnpvLSAdxnyvX57tUMCObG34eaPmt/zDbo7wIgeQjq0iF5KnXaKeAb9GL1xMShWAOkIUJelSPDmqY8RmU="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.17":{"name":"frb","version":"0.1.17","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.14"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.17","dist":{"shasum":"798456d52370ee7a6450ff1fd63dd62df149ec8f","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.17.tgz","integrity":"sha512-Y92pJZoPwEk562flNbrjspv+tvOHgnv98zRvb8qtd3cgwaaaylWvS9BCYSmWAvPkX2ukZhQyZOI7rija3oyIUA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICWn40gREQbIc0hLjBtkyOqqjcHcmQWPKp7K9YUGOiYTAiEA/BCB7Fbeh8hIV2YXCnLNOunbQ2aqL8c7ZFd09svnt04="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.18":{"name":"frb","version":"0.1.18","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.14"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.18","dist":{"shasum":"db30f0b7c1073a31b6d7bc00dad4e8a1bbd90de0","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.18.tgz","integrity":"sha512-WvoZb1QN+blgTGPPc82awjt7QsPS1XhMXV4nHSJV4zHT3AeKHYKxivjGlYUN8fouMDRiyPk1T16Z1/jK5IFMVQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZrLmyZ/VXPt0PpsMAPG9IqDSlO2IxhlPVkMNp6ltLKQIhAMnAclc3F+X9l5kpGMMVNpW8CCUuErs3WJ0t3W59/Dcq"}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.19":{"name":"frb","version":"0.1.19","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.14"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.19","dist":{"shasum":"26241baadc55078bafb0ef945f0c39faaae83f4d","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.19.tgz","integrity":"sha512-W9uFvmjXJj0apJuE+XCIZLQ2ILGhkaGcQfy+ApAx5Y78HfIDS83fglSQS3YLe7Kiqlix/wObGgQeV9P/W+tDhw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDx9RIeLcdnTniI9iphDZ0+6Af8abItl1R0YBznBZlF7AiEA2M3Rsgzgv2b8GuCet8Fc+uJ6s8JBYR4g+8U6hucNl4A="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.20":{"name":"frb","version":"0.1.20","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.20","dist":{"shasum":"7045ba021147976e02084c61640c782fca96a022","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.20.tgz","integrity":"sha512-L0PSzMyJu5S/9BJFEMOtIxnbRka6enbHLL3dz4zicoioB01b+KLzV5nA6xDX7/F8j+2oGxv/rNzG7xOctKtWYQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTexOXVlpgDx6+XibIoVvLQYXqTvlD8hgp/l9FVVzCgAIgJgzC8IvRvGeoUY7KQbefBCI2zGcrzN9NNBH5rgYfIDo="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.21":{"name":"frb","version":"0.1.21","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.21","dist":{"shasum":"0817206ba349a96f5fa5b737e72bb0fca7619181","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.21.tgz","integrity":"sha512-C1fkNu67+5um0d3xI1iZ3TyqMe+n9C0qQX4Gkn+gBo/BWZORFR4W8XMXlO9ifdN1T1iuywoOxpdc6TDqOaDZdQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDeud7fptpb90yqWVGn0WxklyJbctG0DZYWYufNV2U+KAiEAx/cTx3QfyGI08LJieUCwbascNgkFPNmQ9tcq9Da35Ps="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.22":{"name":"frb","version":"0.1.22","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.22","dist":{"shasum":"75e4940a4fe2df98c183c278247b88bba30776b8","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.22.tgz","integrity":"sha512-9WOsqhBzuqzrK6wLi630HwqIxHRXq4JRvHFGIeMM4B0ZLADe3W/fJX+JVF2xn5XbOMC2DWpJ0MLI+Elidbt7Gw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAxYsEX+fZb7L1gVdPrLWEuu0sNpcQ1Jke8pxcEEXlbbAiBefRGZkETNltCgot9G2NTpzz2tvM4lA7LjRXJUV59+Kg=="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.23":{"name":"frb","version":"0.1.23","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.23","dist":{"shasum":"0c217ffdf4c6b868f6cc7871d57b4d11e6f138c8","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.23.tgz","integrity":"sha512-34u8ZzO46Af8uIX7TOg4FVZpBkIXVRgJ1/UeI8FLM0RyJBKnS0/3Wrrf4k6StrqeoohByGq+4fvtdT3qlHqV/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6/02SPugX9pIN31QY9C1QE/PJ8xCT/NeEs3sjg78STAIgcuXG8FmvWiWj6QgUGiMBSSHFPmO0SafXrQMxRaW9k48="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.24":{"name":"frb","version":"0.1.24","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.24","dist":{"shasum":"33ecd7d5f5e72a3d300cb81c8483eaa05b7f5c5e","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.24.tgz","integrity":"sha512-qJLG3uFlIzSfzvNCKNzchbkCb8NafEjn40TjND1IGqJSezGwCrcvVWm7Grt7BOmIL9lFp1hlxifKWXkFlawPZw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBFRZq7+ALNq/bBsP38x+oYc6uAGvDxGDssLkvUmYLW0AiBCSDQBsfuDSxikf71eSzjWNZYmjwV5FTY8kuq3MKoX5A=="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.25":{"name":"frb","version":"0.1.25","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.25","dist":{"shasum":"a7037867ee69598b25df04f9e56d7fb83c2ff63e","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.25.tgz","integrity":"sha512-vxHulgoSU4qF0Fd9WZwTtV0wiFq8H0zM/PpfFP5E2ysOmJhUH/CPR7Y4X8guVrrNXRfBfVeMj+ksOfZE23OAUw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFyPm/Gxqmja3hpKroZHcJ48UE9leBeXdT6M58gyF+8gIhALK4vDwFwzFSgW+nDOzK9BlWRNADMrFeEPc1Y8dIU6oA"}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.26":{"name":"frb","version":"0.1.26","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.26","dist":{"shasum":"c0af7956cd3de7307176d727b37da7fd641d575a","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.26.tgz","integrity":"sha512-N+FCGvZGt07aR5P5j4joI7+/yUjksVc/BRTB0pv/l9xN4DI9rBxMga4oUwrKGEIB6d68imTg7Wv0DiNhPESJdw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYiqBK104OHFM+4tff0GHWOdIUT84/SyojbTPszBm1bAIgA8rAaOAXBj3Yeup4e+USf3p+wxe+5dtAjaEjOsCzx8I="}]},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.27":{"name":"frb","version":"0.1.27","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.27","dist":{"shasum":"c61cfa1e9e85fc185e07243eb58c2be02836785e","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.27.tgz","integrity":"sha512-/WRrXAW1fUqDefxpn9Q2ZGdEmFT/Zi30m8o8HcuCldYPg9JbvT4GbV1IJ7pVmls9H0XKoGEZe4R+6QHuV7twuw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFjpn0/GwgCv9VsGzO92J16rrQqRnmSCWjeBDQHKtC/aAiARK1tC6WZTaH9L6nMibF2ubGEya/nXcNVgbDB6L1soQw=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.1.28":{"name":"frb","version":"0.1.28","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.1.28","dist":{"shasum":"8481982da78465c52b91820c5fe3f040d841c98e","tarball":"https://registry.npmjs.org/frb/-/frb-0.1.28.tgz","integrity":"sha512-zi86085EZOck7EWOwCfHTZh2GGMra3c3jVZ+IwpyW/0kK0A5QXWklc3VLLsNMJ5sF6G55NahGl0acbu96mN24w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSHAVZM+xPMVzpgBd+SYUhfjzTNr69Tuln+xVZtxdkSgIgdd7TiXae4WIBjRDGs6P+0Y5RziEwVw3tQNvtI9+KrGY="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.0":{"name":"frb","version":"0.2.0","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x"},"scripts":{"test":"jasmine-node spec"},"_id":"frb@0.2.0","dist":{"shasum":"628f58509815cfdaa748a89bc7ab810054554ee2","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.0.tgz","integrity":"sha512-phhFcl/Dh24dB9hxgGsnwe5mF0SzO7ZI3OSTb5ocsD1UindHCmvkzCYdy0YnxVG9ISlyYE0g4Q94RYj3K2KcOQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGK4RWlx0GDDjvErL2TMq466mPdIToKqK2/Ac4HX4f1QAiEApS8HU9ltjLcWO3LB3HDNbxDGmOhUEecjxe7N1uUFwkw="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.1":{"name":"frb","version":"0.2.1","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.1","dist":{"shasum":"6316c4acbb9eb3ac4234dcb6c78fd8ef4f52e834","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.1.tgz","integrity":"sha512-NyLnuRWhFgq5R59f09Yi9nWSR+5uPoKHsdXRYcNKFLHehzRn09JQXii/HTNzQ0OBJ4pjNnYGn5Wx76Kw1AcCXw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD20uiR+vCIatSnOyFA3Za6Wf0MmGOMb0FOoVeozdKOeAIgRxL7eub/nrZEwQrxthk3n9NJEmwRfqwU1kDI4nBm+BM="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.2":{"name":"frb","version":"0.2.2","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.2","dist":{"shasum":"b090ae19cfde341a8b3d3a504390f87874455681","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.2.tgz","integrity":"sha512-1ju59e2XjKJDFOyCySNS7qXvi2BhcvHRQeYAA5o8jXGf5JjIhhDb2icGiQHF95PxwUF4Z8tCODNACqjo74iR6w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICI8JRWPnK1OmfHSK5d4lY2SfgcIwvQMH05z9N2amoBjAiA4DkLj5lLkz3I4J32ycczwypLMswgeX8LspAohlE2mPg=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.3":{"name":"frb","version":"0.2.3","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.15"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.3","dist":{"shasum":"3827d6939bf3fe28eee46c85bba5cf91aac21cea","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.3.tgz","integrity":"sha512-8gK5cj1Xwgje+VMWVAb0gTzidznfSsIT2eXeKPS9OhtFNvy6BV8AcEoO4aN2ygQ4ANuJFX158QQQ+uARqLd2ng==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF7BQZ88MiqsxA+mo8Xa9PRgps6GywdYv4HKiq3aTKJuAiAEScgDP9M16+RFSa/us/lmG+aMhSwwq1+M8C2ZL4027g=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.4":{"name":"frb","version":"0.2.4","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.4","dist":{"shasum":"e0d5159b5ac9e61dc000e71f40f3519c9f861b5a","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.4.tgz","integrity":"sha512-ufTnUQ3HRhDww5NL0Ip81bVL54Cs5TvbYinajl8cy9dqPNHoWhak6IPhn4wT5tbYet1Hcb6Xc3ZILGD4XKa7mA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7TFKdSafBOvETZCCMKFBAKMzMelah4GfF21uAyDKA6AIgc7eMgKXobloPPzl0kCWlbBj+qvlPy8MG+eLadnqEZTU="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.5":{"name":"frb","version":"0.2.5","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.5","dist":{"shasum":"c2aac9c54d00d97dac3428280fdd18d9db08bf16","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.5.tgz","integrity":"sha512-5ZlqnapmVpDLrhebgTpXvu/z0cVo/nsN3oIuuRJ4/cBBm4AhCbOvhrD9KG1Lgr4iNAeI/KNU+uTfLI7Bhctzpw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH33Zll6JULZiAkfC/tWa6N//Y5pEc7z3MbCOV9r2tJCAiEA4/UntB0GZubvDqFFfcS1jPzTlepS2DDVI9OyPm1eOag="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.6":{"name":"frb","version":"0.2.6","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.6","dist":{"shasum":"38f5eb0824e29d2aa0b4137a41b9c952c26b94dd","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.6.tgz","integrity":"sha512-QucFyjUW6WQIHi3M+e+c1Eu3GmzC4uP7eZJbYqzTZrR0W7ia9NJmP/YrwEvA0JsKzpOUIt7l4/yNrmg6tu1+Sg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9orZs8l5VbaAoeIMh8R2iKjhqGKVcC4rTawzd4SEjMgIhAOWVAGtlo+ssUdvtWVyWfAcb6cbSyWl4WKIhM2R2Xjgx"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.7":{"name":"frb","version":"0.2.7","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.7","dist":{"shasum":"3a42bed84d1a9cf1406107385c5ad63a0e3de388","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.7.tgz","integrity":"sha512-t4PCtHinc3/PPFqOjk9UcluFPCBbjkDrZY1t9yQjqPhuvb714truhFHpTvCBBX0/OVfF+Uk3J3iuWlYmfXo0eQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBygFN2F3FojnntwmoX8b6g2RVcPxSCqLQnj1luWSKLPAiEAuplHIPJHtOSs4B1LNl73Eh/XHSvYKiVCnhrHTlqLBz8="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.8":{"name":"frb","version":"0.2.8","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"mail":"kris@cixar.com","url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.8","dist":{"shasum":"c70dccef94829c001f8f79ad7bd542c95c530361","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.8.tgz","integrity":"sha512-TnlTGPTEDxDT7h32/7TgW1eJ66f0h58H5Z2fBtkSZ440voGVhAs+lMlJlxluQRusm4n6Sfk5btEXWagb5p3idQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGKz1qNja5ir12CpKtwqLWY9ZueTKMnRyTTAv/cb5ngnAiEA1Js5PxDsfowmBrFMJYI61+J6psNIg7yW2nhZFJEaleY="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.9":{"name":"frb","version":"0.2.9","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.21"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.9","dist":{"shasum":"95687505ebab3c651909e5f07e924331d6822807","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.9.tgz","integrity":"sha512-lgDK9+vZIaw/NM7AE7n/Wdc2+XLic6fNH78sVIM6N+EqCYUC98ljZRLWgwMNVXR05SnbQxJWqqtyOdpCQO32/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID51e1Irf6BPNY86sj41OeINGzaQw0Ln1p0dUi+0+yUqAiBb079zxZVcxq2KoRMouivj826Dz6VDpY+Y2/ZMNH5nkA=="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.10":{"name":"frb","version":"0.2.10","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.23"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.10","dist":{"shasum":"33a266dd5fcdff685c80c40991800927e7c2f3cf","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.10.tgz","integrity":"sha512-LPS6gHkcpIVYg2GxsrduhfPpZRYcN1KZMd+Q2l+yf7odHD09uQRCd7XYNjjdcOxJ3bcoBmkSQg2ap4IuXi5DNw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHYQgFFGiAhOXDv8cjwHeEwGBJu3rOQqaESwmbAaU6HGAiBQ7eobo7Ftrtvnkr70qz7sH/qE/yaKxn2WGqxnQKejsg=="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.11":{"name":"frb","version":"0.2.11","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.23"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.11","dist":{"shasum":"e7a393b072a63282669d4ce81b3308737919ae01","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.11.tgz","integrity":"sha512-4t2FcX0imh3CaivVjV6TbI/LXa9Dfln6XFQAi5eFZqI3umskTaAqFBRDTB62IV7XYQ+AsMhACB86J1jUt+lRjw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBbhMhnwqKznNdAH+guxb9qnXiNVPO3bLmbGADzHp5KSAiEAqBlqXbp0Y402UDNVzDMErnL+m60VdhDMtn1+ZB39n0Q="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.12":{"name":"frb","version":"0.2.12","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.23"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.12","dist":{"shasum":"b94b3936eb91d947675c2175b4052253a2d64f41","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.12.tgz","integrity":"sha512-cgvn1AjNJ/t+0ZNBVyxdiD+UhldISGa5NIKWkBR8wdDQXW7BABJXXsBnx4OIOxteKWKWFEMwBk1Wb5SMeRtjdw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDYvzHUqf7owf/CUUwqJpqtbIsuMgbXWPKxSWSiO+3FSAiBZodufdK50s9vCnqgk/qXXpGwBRCOuLZh10MboW1MlFw=="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.13":{"name":"frb","version":"0.2.13","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.1.23"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.13","dist":{"shasum":"8ba73314a01d4fb5208b7f191fceafe0287a9e32","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.13.tgz","integrity":"sha512-viyEpeOLMJzQJqfxVaoFrUCSHgrpEKithZ9b1gZbUFB715tdZE1qXCb10k3Ok32M7xMnKHc1Z4FdyWvcAnxM+w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFCf3l0KI8exaFFb8Of6vzsGbkJkigaWgye+gg/2XQpEAiBA8pKhIYoB1k9nCS+hxrsRsvWWKS7v1QJAb/XjeIsFcQ=="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.14":{"name":"frb","version":"0.2.14","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.2.0"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.14","dist":{"shasum":"ce12532b6e772a6264316629d17fa691df9c91bd","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.14.tgz","integrity":"sha512-u9miNEZbGRJQj4Yo2lqb1vqL5p3iY/rWx5RFLvkt+XTVMyMnZXWX5cpTCXj5Unp3daEhyO1sgehZ7B/QZLkEwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBMQfTplze08eaEXm+FCPbG/JtetFlKeGGwdRjRW9UQaAiEAkMKE8sIgH3ySfMx6SLG9XNAFuWTzhfZDy5UVfTa6cgY="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.15":{"name":"frb","version":"0.2.15","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.2.1"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.15","dist":{"shasum":"d1de59abd8d7906442f1eb92cf8189ed190f83b6","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.15.tgz","integrity":"sha512-XH7gl1+4dpKO1MTypqL9HlOabS2IOx1bnTcupVD++FgtHT77g6cMKatg8c1p50Z/akNEic/OnUcqzWoeRzIung==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDALHf/q+fcsL1L/Y5VYI3eytdN7zFUSIRd6lzhAPdp/wIgESaCGhZoxc/bR6fKhw3zzOBCL054a4W0zUTOKWboM/k="}]},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.16":{"name":"frb","version":"0.2.16","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.2.2"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.16","dist":{"shasum":"7008e96007cea86570cc6eaaaacf248761c69866","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.16.tgz","integrity":"sha512-F0WdSW0kDOZaZFROAKO1d6WQw8JzxBgcgmSfTY7Q/Nd4pOF455yXp0E4ybSyljdcerv62YMIgPEfdnT854l/wQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEeJ/xnggATLaJmyLUb61LN3RSPOOnI/P8NVUqzwvUlbAiABkTDlsiYBqKn/SqvkO/E9aUY+WqbmoB2jtkt/E7Z6dg=="}]},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.17":{"name":"frb","version":"0.2.17","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"~0.2.2"},"devDependencies":{"jasmine-node":"1.x.x","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"_id":"frb@0.2.17","dist":{"shasum":"54d03f3ae7b84a188fbf478e7d9af4c8dab0bf7e","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.17.tgz","integrity":"sha512-odgbx9srlzDPXQ/eyrXXOmrF1WhTZ3e7G6jJSjt7j6Np/XNGPWFjJAd/s55joWJVHC/ogEioIjDkai83TpDWow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWKwd7bT6mKdZEQrpnk3YR5JKTuHbBTWFXD4addm59MAiBZ1bdtuCCt7I4ueNBjPWqsbTo0kb8UXZS36P18R1sA6Q=="}]},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.18":{"name":"frb","version":"0.2.18","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"^1.2.1"},"devDependencies":{"jasmine-node":">=1.13.1 <1.14.0","pegjs":"git://github.com/dmajda/pegjs.git","memwatch":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"homepage":"https://github.com/kriskowal/frb","_id":"frb@0.2.18","dist":{"shasum":"547a6c8e860a0bfa1595dab579d4409280b8b17b","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.18.tgz","integrity":"sha512-rPh4aLRw+fCKHJazSuhHv6C0hYvtsFwR0OO6W3jJgkk3jHGljQlTNAn5R3zGr9EJIN9LHvQWyjcHg+MyLSPICA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID0G4j7iYivUc4isw6wMUQNIe71AMFiO/aZfufJu8JRiAiBqPxkay8Okn+BaqV2HYI8s16foZ/Xz1UG/0mqGuHdqGg=="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"directories":{}},"0.2.19":{"name":"frb","version":"0.2.19","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"}],"bugs":{"url":"http://github.com/kriskowal/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/kriskowal/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"http://github.com/kriskowal/frb.git"},"main":"bindings","dependencies":{"collections":"^1.2.1"},"devDependencies":{"jasmine-node":">=1.13.1 <1.14.0","pegjs":"git://github.com/dmajda/pegjs.git","memwatch":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"homepage":"https://github.com/kriskowal/frb","_id":"frb@0.2.19","_shasum":"93b121fcbfd2e5d539e6096b2590f50e5b967faf","_from":".","_npmVersion":"1.4.20","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"}],"dist":{"shasum":"93b121fcbfd2e5d539e6096b2590f50e5b967faf","tarball":"https://registry.npmjs.org/frb/-/frb-0.2.19.tgz","integrity":"sha512-UD2OMMOst6rVi8rw7x6fVBqxd5I0SIch6D+tGTOly14KMdTngZvgwalStbKPZyQfJtQf5E6WT6YY347pXSkdxQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF+PPOwtLRRnnI5EGsFtnDid+Kpc9c7TuD/5RhHJnVVXAiB5B/SPA4O/Bxq7VE8dLeufNdZTYN3gKravdGWmj2xN5A=="}]},"directories":{}},"3.0.0":{"name":"frb","version":"3.0.0","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"~5.0.x"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","pegjs":"git://github.com/dmajda/pegjs.git","memwatch-next":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"66ba657ae8e7ada7658df3beb6e924c500b7259c","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@3.0.0","_shasum":"b41bc799d203536880742b42781474f168d4f6c8","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.3","_npmUser":{"name":"marchant","email":"benoit@montagestudio.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"dist":{"shasum":"b41bc799d203536880742b42781474f168d4f6c8","tarball":"https://registry.npmjs.org/frb/-/frb-3.0.0.tgz","integrity":"sha512-ox47aeXDoXEMORZmH2Pr9zsX8wcQ3HKDfTZSADPeuHpC98NEU5wnIjSIwvjkYBAbx8ENNC//Jw72kX9PYiKO3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFwDcoB793xC/qbfncVsGHJv17cgQHG/OflU8S7KH4vpAiEAgrYKuOV2tQLdep/pr5i5f5fmz6Ph3awTqAbURFNJ/iY="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/frb-3.0.0.tgz_1465367878205_0.9123049890622497"},"directories":{}},"3.0.1":{"name":"frb","version":"3.0.1","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"~5.0.x"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","pegjs":"git://github.com/dmajda/pegjs.git","memwatch-next":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"b92313093e1111a5e69d9a162bf657a817b85133","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@3.0.1","_shasum":"7fc8192727b29fc8711baa2dc537604ae46eda66","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.3","_npmUser":{"name":"marchant","email":"benoit@montagestudio.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"dist":{"shasum":"7fc8192727b29fc8711baa2dc537604ae46eda66","tarball":"https://registry.npmjs.org/frb/-/frb-3.0.1.tgz","integrity":"sha512-7ttYECsc1USOwHOu7uTS2kVWTGgE+lsHb/4Vpg9xMFC8LaZBun6z4al3BHgxqNylEQlcgIbaZ7cdtAFKhsCtUQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaOTVB0p3ZlkdyjNlHBwv4ZvMPxpEsJ4XXAwWSY+GAaQIhAOP1TCqUA9BWgHCCMCop2cZAo1DydZM9S9yonuFOGXes"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/frb-3.0.1.tgz_1475532705347_0.007067984901368618"},"directories":{}},"4.0.0":{"name":"frb","version":"4.0.0","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"~5.0.x"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","pegjs":"git://github.com/dmajda/pegjs.git","memwatch-next":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"e289333cbc346b1d9585a00974d1ac8da301cdbc","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@4.0.0","_shasum":"b3d2a0cbb1929b4bf968c30123135729d6b9903b","_from":".","_npmVersion":"2.15.11","_nodeVersion":"4.7.0","_npmUser":{"name":"marchant","email":"benoit@montagestudio.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"dist":{"shasum":"b3d2a0cbb1929b4bf968c30123135729d6b9903b","tarball":"https://registry.npmjs.org/frb/-/frb-4.0.0.tgz","integrity":"sha512-kgZvu8wnejaz1r/74sNBhDpzewkIJr9+/p88HFRRbntFKw5i1/n4bomg658l/KgEqT7VeBdaaw1VY+kLAD00ow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBgfoFt31ZSeyNGNzkbSzKrzTVBC0OGZ6hLpAI9Y4ICIAiEA3aK3asccv1IG/q4DDmvkPF3+iRHbqVzIW5MRb6eBWHU="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/frb-4.0.0.tgz_1481787510412_0.961832657456398"},"directories":{}},"4.0.1":{"name":"frb","version":"4.0.1","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"~5.0.x"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","pegjs":"git://github.com/dmajda/pegjs.git","memwatch-next":"*"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"f308b188528debcc1eb36c040de7dac338b220df","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@4.0.1","_shasum":"cf463759615169e7b33ae2f66f6f52ada8aa01c7","_from":".","_npmVersion":"2.15.11","_nodeVersion":"4.7.0","_npmUser":{"name":"marchant","email":"benoit@montagestudio.com"},"maintainers":[{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"dist":{"shasum":"cf463759615169e7b33ae2f66f6f52ada8aa01c7","tarball":"https://registry.npmjs.org/frb/-/frb-4.0.1.tgz","integrity":"sha512-gZ4BG39rrnlDdtbJXpVEqE52Zy/4oCH1GjC+wrXoxAWrrSHb7vGek4sAcTrKfxE/EONZgBrQD7SRLYf59ASw1A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSo+AM3N72pP10m/ZobiUqUIBgHlBlRM/2XmTpWPriJQIgU0lo7Ui8mw9eLIAUB9aQyz2hX7pHBB+ELwb9Tznw1DY="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/frb-4.0.1.tgz_1490060215062_0.2427865113131702"},"directories":{}},"4.0.2":{"name":"frb","version":"4.0.2","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"license":"BSD-3-Clause","repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"^5.1.2"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","memwatch-next":"^0.3.0","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"830229702d67df02816cb2475f04549950550a37","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@4.0.2","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"hthetiot","email":"hthetiot@gmail.com"},"dist":{"integrity":"sha512-1cqmhYrhvypMYKhy5M5X9eOQDENKIsr2IPh3BJpyCJyT2IykbMg3CLpmVeZZ4cfp6t/pvbjZK5U1wQwex0Tzmg==","shasum":"aa75840dbffbfacd873fad3c42940d6b2317f7cb","tarball":"https://registry.npmjs.org/frb/-/frb-4.0.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDz108LZyzbo1HCMw1Gz57FztnP5glBFotWC43/Bf7aPgIhANqVh6slwV4d5N96GCSXzzTzAJlu5MIfO0xrh8i1+Ck8"}]},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/frb-4.0.2.tgz_1514461653847_0.5446251120883971"},"directories":{}},"4.0.3":{"name":"frb","version":"4.0.3","description":"Functional reactive bindings","keywords":["functional","reactive","bindings","observe","change"],"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"licenses":[{"type":"MIT","url":"http://github.com/montagejs/frb/raw/master/LICENSE.md"}],"license":"BSD-3-Clause","repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"main":"bindings","dependencies":{"collections":"^5.1.3"},"devDependencies":{"jasmine-node":"github:montagestudio/jasmine-node#master","memwatch-next":"^0.3.0","pegjs":"git://github.com/dmajda/pegjs.git"},"scripts":{"test":"jasmine-node spec","build-parser":"pegjs --allowed-start-rules expression,sheet grammar.pegjs"},"gitHead":"788e0e0192f39c0d7ef6cd6d03634c1e61de89ae","homepage":"https://github.com/montagejs/frb#readme","_id":"frb@4.0.3","_shasum":"1db827c1fbf8986fe5468a7467b353e5c3fabb4c","_from":".","_npmVersion":"2.15.11","_nodeVersion":"4.9.1","_npmUser":{"name":"hthetiot","email":"hthetiot@gmail.com"},"dist":{"shasum":"1db827c1fbf8986fe5468a7467b353e5c3fabb4c","tarball":"https://registry.npmjs.org/frb/-/frb-4.0.3.tgz","fileCount":38,"unpackedSize":455694,"integrity":"sha512-ZdRVqQM72pttQpvuae2GCGfoa5Z7zJUc7jGFSBZJhgeiC8lh2OlUwP0lEmRE2xlaFDrAVzTcyxFmuev/M5KzLg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDGB0RwwHxEx2MafbCTQqlHZ/h3zYmto/zdqBd+WM8OAiEA0RB81HhiUoc+/ZH6oMd7uwv8epES36MrpxJLbO+Vjac="}]},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":"kris.kowal@cixar.com"},{"name":"marchant","email":"benoit@montagestudio.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/frb_4.0.3_1531276506001_0.04729106338060873"},"_hasShrinkwrap":false}},"readme":"<img src=\"frb.png\" align=\"right\" alt=\"FRB Logo\">\n\n[![Build Status](https://travis-ci.org/montagejs/frb.png?branch=master)](http://travis-ci.org/montagejs/frb)\n\n# Functional Reactive Bindings\n\nIn their simplest form, bindings provide the illusion that two objects\nhave the same property.  Changing the property on one object causes the\nsame change in the other.  This is useful for coordinating state between\nviews and models, among other entangled objects.  For example, if you\nenter text into a text field, the same text might be added to the\ncorresponding database record.\n\n```javascript\nbind(object, \"a.b\", {\"<->\": \"c.d\"});\n```\n\nFunctional Reactive Bindings go farther.  They can gracefully bind long\nproperty paths and the contents of collections.  They can also\nincrementally update the results of chains of queries including maps,\nflattened arrays, sums, and averages.  They can also add and remove\nelements from sets based on the changes to a flag.  FRB makes it easy to\nincrementally ensure consistent state.\n\n```javascript\nbind(company, \"payroll\", {\"<-\": \"departments.map{employees.sum{salary}}.sum()\"});\nbind(document, \"body.classList.has('dark')\", {\"<-\": \"darkMode\", source: viewModel});\n```\n\nFRB is built from a combination of powerful functional and generic\nbuilding blocks, making it reliable, easy to extend, and easy to\nmaintain.\n\n\n## Getting Started\n\n`frb` is a CommonJS package, with JavaScript modules suitable for use\nwith [Node.js][] on the server side or [Mr][] on the client side.\n\n```\n❯ npm install frb\n```\n\n\n\n\n## Tutorial\n\nIn this example, we bind `model.content` to `document.body.innerHTML`.\n\n```javascript\nvar bind = require(\"frb/bind\");\nvar model = {content: \"Hello, World!\"};\nvar cancelBinding = bind(document, \"body.innerHTML\", {\n    \"<-\": \"content\",\n    \"source\": model\n});\n```\n\nWhen a source property is bound to a target property, the target gets\nreassigned to the source any time the source changes.\n\n```javascript\nmodel.content = \"Farewell.\";\nexpect(document.body.innerHTML).toBe(\"Farewell.\");\n```\n\nBindings can be recursively detached from the objects they observe with\nthe returned cancel function.\n\n```javascript\ncancelBinding();\nmodel.content = \"Hello again!\"; // doesn't take\nexpect(document.body.innerHTML).toBe(\"Farewell.\");\n```\n\n### Two-way Bindings\n\nBindings can go one way or in both directions.  Declare one-way\nbindings with the ```<-``` property, and two-way bindings with the\n```<->``` property.\n\nIn this example, the \"foo\" and \"bar\" properties of an object will be\ninexorably intertwined.\n\n```javascript\nvar object = {};\nvar cancel = bind(object, \"foo\", {\"<->\": \"bar\"});\n\n// <-\nobject.bar = 10;\nexpect(object.foo).toBe(10);\n\n// ->\nobject.foo = 20;\nexpect(object.bar).toBe(20);\n```\n\n### Right-to-left\n\nNote that even with a two-way binding, the right-to-left binding\nprecedes the left-to-right.  In this example, \"foo\" and \"bar\" are bound\ntogether, but both have initial values.\n\n```javascript\nvar object = {foo: 10, bar: 20};\nvar cancel = bind(object, \"foo\", {\"<->\": \"bar\"});\nexpect(object.foo).toBe(20);\nexpect(object.bar).toBe(20);\n```\n\nThe right-to-left assignment of `bar` to `foo` happens first, so the\ninitial value of `foo` gets lost.\n\n### Properties\n\nBindings can follow deeply nested chains, on both the left and the right\nside.\n\nIn this example, we have two object graphs, `foo`, and `bar`, with the\nsame structure and initial values.  This binds `bar.a.b` to `foo.a.b`\nand also the other way around.\n\n```javascript\nvar foo = {a: {b: 10}};\nvar bar = {a: {b: 10}};\nvar cancel = bind(foo, \"a.b\", {\n    \"<->\": \"a.b\",\n    source: bar\n});\n// <-\nbar.a.b = 20;\nexpect(foo.a.b).toBe(20);\n// ->\nfoo.a.b = 30;\nexpect(bar.a.b).toBe(30);\n```\n\n### Structure changes\n\nChanges to the structure of either side of the binding are no matter.\nAll of the orphaned event listeners will automatically be canceled, and\nthe binders and observers will reattach to the new object graph.\n\nContinuing from the previous example, we store and replace the `a`\nobject from one side of the binding.  The old `b` property is now\norphaned, and the old `b` property adopted in its place.\n\n```javascript\nvar a = foo.a;\nexpect(a.b).toBe(30); // from before\n\nfoo.a = {}; // orphan a and replace\nfoo.a.b = 40;\n// ->\nexpect(bar.a.b).toBe(40); // updated\n\nbar.a.b = 50;\n// <-\nexpect(foo.a.b).toBe(50); // new one updated\nexpect(a.b).toBe(30); // from before it was orphaned\n```\n\n### Strings\n\nString concatenation is straightforward.\n\n```javascript\nvar object = {name: \"world\"};\nbind(object, \"greeting\", {\"<-\": \"'hello ' + name + '!'\"});\nexpect(object.greeting).toBe(\"hello world!\");\n```\n\n### Sum\n\nSome advanced queries are possible with one-way bindings from\ncollections.  FRB updates sums incrementally.  When values are added or\nremoved from the array, the sum of only those values is taken and added\nor removed from the last known sum.\n\n```javascript\nvar object = {array: [1, 2, 3]};\nbind(object, \"sum\", {\"<-\": \"array.sum()\"});\nexpect(object.sum).toEqual(6);\n```\n\n### Average\n\nThe arithmetic mean of a collection can be updated incrementally.  Each\ntime the array changes, the added and removed values adjust the last\nknown sum and count of values in the array.\n\n```javascript\nvar object = {array: [1, 2, 3]};\nbind(object, \"average\", {\"<-\": \"array.average()\"});\nexpect(object.average).toEqual(2);\n```\n\n### Rounding\n\nThe `round`, `floor`, and `ceil` methods operate on numbers and return\nthe nearest integer, the nearest integer toward -infinity, and the\nnearest integer toward infinity respectively.\n\n```javascript\nvar object = {number: -0.5};\nBindings.defineBindings(object, {\n    \"round\": {\"<-\": \"number.round()\"},\n    \"floor\": {\"<-\": \"number.floor()\"},\n    \"ceil\": {\"<-\": \"number.ceil()\"}\n});\nexpect(object.round).toBe(0);\nexpect(object.floor).toBe(-1);\nexpect(object.ceil).toBe(0);\n```\n\n### Last\n\nFRB provides an operator for watching the last value in an Array.\n\n```javascript\nvar array = [1, 2, 3];\nvar object = {array: array, last: null};\nBindings.defineBinding(object, \"last\", {\"<-\": \"array.last()\"});\nexpect(object.last).toBe(3);\n\narray.push(4);\nexpect(object.last).toBe(4);\n```\n\nWhen the dust settles, `array.last()` is equivalent to\n`array[array.length - 1]`, but the `last` observer guarantees that it\nwill not jitter between the ultimate value and null or the penultimate\nvalue of the collection.  With `array[array.length]`, the underlying may\nnot change its content and length atomically.\n\n```javascript\nvar changed = jasmine.createSpy();\nPropertyChanges.addOwnPropertyChangeListener(object, \"last\", changed);\narray.unshift(0);\narray.splice(3, 0, 3.5);\nexpect(object.last).toBe(4);\nexpect(changed).not.toHaveBeenCalled();\n\narray.pop();\nexpect(object.last).toBe(3);\n\narray.clear();\nexpect(object.last).toBe(null);\n```\n\n### Only\n\nFRB provides an `only` operator, which can either observe or bind the\nonly element of a collection.  The `only` observer watches a collection\nfor when there is only one value in that collection and emits that\nvalue..  If there are multiple values, it emits null.\n\n```javascript\nvar object = {array: [], only: null};\nBindings.defineBindings(object, {\n    only: {\"<->\": \"array.only()\"}\n});\n\nobject.array = [1];\nexpect(object.only).toBe(1);\n\nobject.array.pop();\nexpect(object.only).toBe(undefined);\n\nobject.array = [1, 2, 3];\nexpect(object.only).toBe(undefined);\n```\n\nThe `only` binder watches a value.  When the value is null, it does\nnothing.  Otherwise, it will update the bound collection such that it\nonly contains that value.  If the collection was empty, it adds the\nvalue.  Otherwise, if the collection did not have the value, it replaces\nthe collection's content with the one value.  Otherwise, it removes\neverything but the value it already contains.  Regardless of the means,\nthe end result is the same.  If the value is non-null, it will be the\nonly value in the collection.\n\n```javascript\nobject.only = 2;\nexpect(object.array.slice()).toEqual([2]);\n// Note that slice() is necessary only because the testing scaffold\n// does not consider an observable array equivalent to a plain array\n// with the same content\n\nobject.only = null;\nobject.array.push(3);\nexpect(object.array.slice()).toEqual([2, 3]);\n```\n\n### One\n\nLike the `only` operator, there is also a `one` operator.  The `one`\noperator will observe one value from a collection, whatever value is\neasiest to obtain.  For an array, it's the first value; for a sorted\nset, it's whatever value was most recently found or added; for a heap,\nit's whatever is on top.  However, if the collection is null, undefined,\nor empty, the result is `undefined`.\n\n```javascript\nvar object = {array: [], one: null};\nBindings.defineBindings(object, {\n    one: {\"<-\": \"array.one()\"}\n});\n\nexpect(object.one).toBe(undefined);\n\nobject.array.push(1);\nexpect(object.one).toBe(1);\n\n// Still there...\nobject.array.push(2);\nexpect(object.one).toBe(1);\n```\n\nUnlike `only`, `one` is not bindable.\n\n### Map\n\nYou can also create mappings from one array to a new array and an\nexpression to evaluate on each value.  The mapped array is bound once,\nand all changes to the source array are incrementally updated in the\ntarget array.\n\n```javascript\nvar object = {objects: [\n    {number: 10},\n    {number: 20},\n    {number: 30}\n]};\nbind(object, \"numbers\", {\"<-\": \"objects.map{number}\"});\nexpect(object.numbers).toEqual([10, 20, 30]);\nobject.objects.push({number: 40});\nexpect(object.numbers).toEqual([10, 20, 30, 40]);\n```\n\nAny function, like `sum` or `average`, can be applied to the result of a\nmapping.  The straight-forward path would be\n`objects.map{number}.sum()`, but you can use a block with any function\nas a short hand, `objects.sum{number}`.\n\n### Filter\n\nA filter block generates an incrementally updated array filter.  The\nresulting array will contain only those elements from the source array\nthat pass the test deescribed in the block.  As values of the source\narray are added, removed, or changed such that they go from passing to\nfailing or failing to passing, the filtered array gets incrementally\nupdated to include or exclude those values in their proper positions, as\nif the whole array were regenerated with `array.filter` by brute force.\n\n```javascript\nvar object = {numbers: [1, 2, 3, 4, 5, 6]};\nbind(object, \"evens\", {\"<-\": \"numbers.filter{!(%2)}\"});\nexpect(object.evens).toEqual([2, 4, 6]);\nobject.numbers.push(7, 8);\nobject.numbers.shift();\nobject.numbers.shift();\nexpect(object.evens).toEqual([4, 6, 8]);\n```\n\n### Scope\n\nIn a binding, there is always a value in scope.  It is the implicit\nvalue for looking up properties and for applying operators, like\nmethods.  The value in scope can be called out explicitly as `this`.  On\nthe left side, the value in scope is called the target, on the right it\nis called the source.\n\nEach scope has a `this` value and may have a parent scope.  Inside a\nmap block, like the `number` in `numbers.map{number}`, the value in\nscope is one of the numbers, and the value in the parent scope is an\nobject with a `numbers` property.  To access the value in a parent\nscope, use the parent scope operator, `^`.\n\nSuppose you have an object with `numbers` and `maxNumber` properties.\nIn this example, we bind a property, `smallNumbers` to an array of all\nthe `numbers` less than or equal to the `maxNumber`.\n\n```javascript\nvar object = Bindings.defineBindings({\n    numbers: [1, 2, 3, 4, 5],\n    maxNumber: 3\n}, {\n    smallNumbers: {\n        \"<-\": \"numbers.filter{this <= ^maxNumber}\"\n    }\n});\n```\n\nKeywords like `this` overlap with the notation normally used for\nproperties of `this`.  If an object has a `this` property, you may use\nthe notation `.this`, `this.this`, or `this['this']`.  `.this` is the\nnormal form.\n\n```javascript\nvar object = Bindings.defineBindings({\n    \"this\": 10\n}, {\n    that: {\"<-\": \".this\"}\n});\nexpect(object.that).toBe(object[\"this\"]);\n```\n\nThe only other FRB keywords that collide with propery names are `true`,\n`false`, and `null`, and the same technique for disambiguation applies.\n\n### Some and Every\n\nA `some` block incrementally tracks whether some of the values in a\ncollection meet a criterion.\n\n```javascript\nvar object = Bindings.defineBindings({\n    options: [\n        {checked: true},\n        {checked: false},\n        {checked: false}\n    ]\n}, {\n    anyChecked: {\n        \"<-\": \"options.some{checked}\"\n    }\n});\nexpect(object.anyChecked).toBe(true);\n```\n\nAn `every` block incrementally tracks whether all of the values in a\ncollection meet a criterion.\n\n```javascript\nvar object = Bindings.defineBindings({\n    options: [\n        {checked: true},\n        {checked: false},\n        {checked: false}\n    ]\n}, {\n    allChecked: {\n        \"<-\": \"options.every{checked}\"\n    }\n});\nexpect(object.allChecked).toBe(false);\n```\n\nYou can use a two-way binding on `some` and `every` blocks.\n\n```javascript\nvar object = Bindings.defineBindings({\n    options: [\n        {checked: true},\n        {checked: false},\n        {checked: false}\n    ]\n}, {\n    allChecked: {\n        \"<->\": \"options.every{checked}\"\n    },\n    noneChecked: {\n        \"<->\": \"!options.some{checked}\"\n    }\n});\n\nobject.noneChecked = true;\nexpect(object.options.every(function (option) {\n    return !option.checked\n}));\n\nobject.allChecked = true;\nexpect(object.noneChecked).toBe(false);\n```\n\nThe caveat of an `equals` binding applies.  If the condition for every\nelement of the collection is set to true, the condition will be bound\nincrementally to true on each element.  When the condition is set to\nfalse, the binding will simply be canceled.\n\n```javascript\nobject.allChecked = false;\nexpect(object.options.every(function (option) {\n    return option.checked; // still checked\n}));\n```\n\n### Sorted\n\nA sorted block generates an incrementally updated sorted array.  The\nresulting array will contain all of the values from the source except in\nsorted order.\n\n```javascript\nvar object = {numbers: [5, 2, 7, 3, 8, 1, 6, 4]};\nbind(object, \"sorted\", {\"<-\": \"numbers.sorted{}\"});\nexpect(object.sorted).toEqual([1, 2, 3, 4, 5, 6, 7, 8]);\n```\n\nThe block may specify a property or expression by which to compare\nvalues.\n\n```javascript\nvar object = {arrays: [[1, 2, 3], [1, 2], [], [1, 2, 3, 4], [1]]};\nbind(object, \"sorted\", {\"<-\": \"arrays.sorted{-length}\"});\nexpect(object.sorted.map(function (array) {\n    return array.slice(); // to clone\n})).toEqual([\n    [1, 2, 3, 4],\n    [1, 2, 3],\n    [1, 2],\n    [1],\n    []\n]);\n```\n\nThe sorted binding responds to changes to the sorted property by\nremoving them at their former place and adding them back at their new\nposition.\n\n```javascript\nobject.arrays[0].push(4, 5);\nexpect(object.sorted.map(function (array) {\n    return array.slice(); // to clone\n})).toEqual([\n    [1, 2, 3, 4, 5], // new\n    [1, 2, 3, 4],\n    // old\n    [1, 2],\n    [1],\n    []\n]);\n```\n\n### Unique and Sorted\n\nFRB can create a sorted index of unique values using `sortedSet` blocks.\n\n```javascript\nvar object = Bindings.defineBindings({\n    folks: [\n        {id: 4, name: \"Bob\"},\n        {id: 2, name: \"Alice\"},\n        {id: 3, name: \"Bob\"},\n        {id: 1, name: \"Alice\"},\n        {id: 1, name: \"Alice\"} // redundant\n    ]\n}, {\n    inOrder: {\"<-\": \"folks.sortedSet{id}\"},\n    byId: {\"<-\": \"folks.map{[id, this]}.toMap()\"},\n    byName: {\"<-\": \"inOrder.toArray().group{name}.toMap()\"}\n});\n\nexpect(object.inOrder.toArray()).toEqual([\n    object.byId.get(1),\n    object.byId.get(2),\n    object.byId.get(3),\n    object.byId.get(4)\n]);\n\nexpect(object.byName.get(\"Alice\")).toEqual([\n    object.byId.get(1),\n    object.byId.get(2)\n]);\n```\n\nThe outcome is a `SortedSet` data structure, not an `Array`.  The sorted\nset is useful for fast lookups, inserts, and deletes on sorted, unique\ndata.  If you would prefer a sorted array of unique values, you can\ncombine other operators to the same effect.\n\n```javascript\nvar object = Bindings.defineBindings({\n    folks: [\n        {id: 4, name: \"Bob\"},\n        {id: 2, name: \"Alice\"},\n        {id: 3, name: \"Bob\"},\n        {id: 1, name: \"Alice\"},\n        {id: 1, name: \"Alice\"} // redundant\n    ]\n}, {\n    index: {\"<-\": \"folks.group{id}.sorted{.0}.map{.1.last()}\"}\n});\n\nexpect(object.index).toEqual([\n    {id: 1, name: \"Alice\"},\n    {id: 2, name: \"Alice\"},\n    {id: 3, name: \"Bob\"},\n    {id: 4, name: \"Bob\"}\n]);\n```\n\n\n### Min and Max\n\nA binding can observe the minimum or maximum of a collection.  FRB uses\na binary heap internally to incrementally track the minimum or maximum\nvalue of the collection.\n\n```javascript\nvar object = Bindings.defineBindings({}, {\n    min: {\"<-\": \"values.min()\"},\n    max: {\"<-\": \"values.max()\"}\n});\n\nexpect(object.min).toBe(undefined);\nexpect(object.max).toBe(undefined);\n\nobject.values = [2, 3, 2, 1, 2];\nexpect(object.min).toBe(1);\nexpect(object.max).toBe(3);\n\nobject.values.push(4);\nexpect(object.max).toBe(4);\n```\n\nMin and max blocks accept an expression on which to compare values from\nthe collection.\n\n```javascript\nvar object = Bindings.defineBindings({}, {\n    loser: {\"<-\": \"rounds.min{score}.player\"},\n    winner: {\"<-\": \"rounds.max{score}.player\"}\n});\n\nobject.rounds = [\n    {score: 0, player: \"Luke\"},\n    {score: 100, player: \"Obi Wan\"},\n    {score: 250, player: \"Vader\"}\n];\nexpect(object.loser).toEqual(\"Luke\");\nexpect(object.winner).toEqual(\"Vader\");\n\nobject.rounds[1].score = 300;\nexpect(object.winner).toEqual(\"Obi Wan\");\n```\n\n### Group\n\nFRB can incrementally track equivalence classes within in a collection.\nThe group block accepts an expression that determines the equivalence\nclass for each object in a collection.  The result is a nested data\nstructure: an array of [key, class] pairs, where each class is itself an\narray of all members of the collection that have the corresponding key.\n\n```javascript\nvar store = Bindings.defineBindings({}, {\n    \"clothingByColor\": {\"<-\": \"clothing.group{color}\"}\n});\nstore.clothing = [\n    {type: 'shirt', color: 'blue'},\n    {type: 'pants', color: 'red'},\n    {type: 'blazer', color: 'blue'},\n    {type: 'hat', color: 'red'}\n];\nexpect(store.clothingByColor).toEqual([\n    ['blue', [\n        {type: 'shirt', color: 'blue'},\n        {type: 'blazer', color: 'blue'}\n    ]],\n    ['red', [\n        {type: 'pants', color: 'red'},\n        {type: 'hat', color: 'red'}\n    ]]\n]);\n```\n\nTracking the positions of every key and every value in its equivalence\nclass can be expensive.  Internally, `group` blocks are implemented with\na `groupMap` block followed by an `entries()` observer.  The `groupMap`\nproduces a `Map` data structure and does not waste any time, but does\nnot produce range change events.  The `entries()` observer projects the\nmap of classes into the nested array data structure.\n\nYou can use the `groupMap` block directly.\n\n```javascript\nBindings.cancelBinding(store, \"clothingByColor\");\nBindings.defineBindings(store, {\n    \"clothingByColor\": {\"<-\": \"clothing.groupMap{color}\"}\n});\nvar blueClothes = store.clothingByColor.get('blue');\nexpect(blueClothes).toEqual([\n    {type: 'shirt', color: 'blue'},\n    {type: 'blazer', color: 'blue'}\n]);\n\nstore.clothing.push({type: 'gloves', color: 'blue'});\nexpect(blueClothes).toEqual([\n    {type: 'shirt', color: 'blue'},\n    {type: 'blazer', color: 'blue'},\n    {type: 'gloves', color: 'blue'}\n]);\n```\n\nThe `group` and `groupMap` blocks both respect the type of the source\ncollection.  If instead of an array you were to use a `SortedSet`, the\nequivalence classes would each be sorted sets.  This is useful because\nreplacing values in a sorted set can be performed with much less waste\nthan with a large array.\n\n### View\n\nSuppose that your source is a large data store, like a `SortedSet` from\nthe [Collections][] package.  You might need to view a sliding window\nfrom that collection as an array.  The `view` binding reacts to changes\nto the collection and the position and length of the window.\n\n```javascript\nvar SortedSet = require(\"collections/sorted-set\");\nvar controller = {\n    index: SortedSet([1, 2, 3, 4, 5, 6, 7, 8]),\n    start: 2,\n    length: 4\n};\nvar cancel = bind(controller, \"view\", {\n    \"<-\": \"index.view(start, length)\"\n});\n\nexpect(controller.view).toEqual([3, 4, 5, 6]);\n\n// change the window length\ncontroller.length = 3;\nexpect(controller.view).toEqual([3, 4, 5]);\n\n// change the window position\ncontroller.start = 5;\nexpect(controller.view).toEqual([6, 7, 8]);\n\n// add content behind the window\ncontroller.index.add(0);\nexpect(controller.view).toEqual([5, 6, 7]);\n```\n\n### Enumerate\n\nAn enumeration observer produces `[index, value]` pairs.  You can bind\nto the index or the value in subsequent stages.  The prefix dot\ndistinguishes the zeroeth property from the literal zero.\n\n```javascript\nvar object = {letters: ['a', 'b', 'c', 'd']};\nbind(object, \"lettersAtEvenIndexes\", {\n    \"<-\": \"letters.enumerate().filter{!(.0 % 2)}.map{.1}\"\n});\nexpect(object.lettersAtEvenIndexes).toEqual(['a', 'c']);\nobject.letters.shift();\nexpect(object.lettersAtEvenIndexes).toEqual(['b', 'd']);\n```\n\n### Range\n\nA range observes a given length and produces and incrementally updates\nan array of consecutive integers starting with zero with that given\nlength.\n\n```javascript\nvar object = Bindings.defineBinding({}, \"stack\", {\n    \"<-\": \"&range(length)\"\n});\nexpect(object.stack).toEqual([]);\n\nobject.length = 3;\nexpect(object.stack).toEqual([0, 1, 2]);\n\nobject.length = 1;\nexpect(object.stack).toEqual([0]);\n```\n\n### Flatten\n\nYou can flatten nested arrays.  In this example, we have an array of\narrays and bind it to a flat array.\n\n```javascript\nvar arrays = [[1, 2, 3], [4, 5, 6]];\nvar object = {};\nbind(object, \"flat\", {\n    \"<-\": \"flatten()\",\n    source: arrays\n});\nexpect(object.flat).toEqual([1, 2, 3, 4, 5, 6]);\n```\n\nNote that changes to the inner and outer arrays are both projected into\nthe flattened array.\n\n```javascript\narrays.push([7, 8, 9]);\narrays[0].unshift(0);\nexpect(object.flat).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);\n```\n\nAlso, as with all other bindings that produce arrays, the flattened\narray is never replaced, just incrementally updated.\n\n```javascript\nvar flat = object.flat;\narrays.splice(0, arrays.length);\nexpect(object.flat).toBe(flat); // === same object\n```\n\n### Concat\n\nYou can observe the concatenation of collection of dynamic arrays.\n\n```javascript\nvar object = Bindings.defineBinding({\n    head: 10,\n    tail: [20, 30]\n}, \"flat\", {\n    \"<-\": \"[head].concat(tail)\"\n});\nexpect(object.flat).toEqual([10, 20, 30]);\n```\n\nThe underlying mechanism is equivalent to `[[head], tail].flatten()`.\n\n### Reversed\n\nYou can bind the reversal of an array.\n\n```javascript\nvar object = {forward: [1, 2, 3]};\nbind(object, \"backward\", {\n    \"<->\": \"forward.reversed()\"\n});\nexpect(object.backward.slice()).toEqual([3, 2, 1]);\nobject.forward.push(4);\nexpect(object.forward.slice()).toEqual([1, 2, 3, 4]);\nexpect(object.backward.slice()).toEqual([4, 3, 2, 1]);\n```\n\nNote that you can do two-way bindings, ```<->``` with reversed arrays.\nChanges to either side are updated to the opposite side.\n\n```javascript\nobject.backward.pop();\nexpect(object.backward.slice()).toEqual([4, 3, 2]);\nexpect(object.forward.slice()).toEqual([2, 3, 4]);\n```\n\n### Has\n\nYou can bind a property to always reflect whether a collection contains\na particular value.\n\n```javascript\nvar object = {\n    haystack: [1, 2, 3],\n    needle: 3\n};\nbind(object, \"hasNeedle\", {\"<-\": \"haystack.has(needle)\"});\nexpect(object.hasNeedle).toBe(true);\nobject.haystack.pop(); // 3 comes off\nexpect(object.hasNeedle).toBe(false);\n```\n\nThe binding also reacts to changes to the value you seek.\n\n```javascript\n// Continued from above...\nobject.needle = 2;\nexpect(object.hasNeedle).toBe(true);\n```\n\n`has` bindings are not incremental, but with the right data-structure,\nupdates are cheap.  The [Collections][] package contains Lists, Sets,\nand OrderedSets that all can send ranged content change notifications and thus\ncan be bound.\n\n```javascript\n// Continued from above...\nvar Set = require(\"collections/set\");\nobject.haystack = new Set([1, 2, 3]);\nexpect(object.hasNeedle).toBe(true);\n```\n\nLikewise, Maps implement `addMapChangeListener`, so you can use a `has` binding\nto observe whether an entry exists with the given key.\n\n```javascript\n// Continued from above...\nvar Map = require(\"collections/map\");\nobject.haystack = new Map([[1, \"a\"], [2, \"b\"]]);\nobject.needle = 2;\nexpect(object.hasNeedle).toBe(true);\nobject.needle = 3;\nexpect(object.hasNeedle).toBe(false);\n```\n\n`has` bindings can also be left-to-right and bi-directional.\n\n```javascript\nbind(object, \"hasNeedle\", {\"<->\": \"haystack.has(needle)\"});\nobject.hasNeedle = false;\nexpect(object.haystack.has(2)).toBe(false);\n```\n\nThe collection on the left-hand-side must implement `has` or `contains`,\n`add`, and `delete` or `remove`.  FRB shims `Array` to have `has`,\n`add`, and `delete`, just like all the collections in [Collections][].\nIt happens that the `classList` properties of DOM elements, when they\nare supported, implement `add`, `remove`, and `contains`.\n\n```javascript\nvar model = {darkMode: false};\nbind(document.body, \"classList.has('dark')\", {\n    \"<-\": \"darkMode\",\n    source: model\n});\n```\n\nThe DOM `classList` does not however implement\n`addRangeChangeListener` or `removeRangeChangeListener`, so it\ncannot be used on the right-hand-side of a binding, and such bindings\ncannot be bidirectional.  With some DOM [Mutation Observers][], you\nmight be able to help FRB overcome this limitation in the future.\n\n### Get\n\nA binding can observe changes in key-to-value mappings in arrays and map\n[Collections][].\n\n```javascript\nvar object = {\n    array: [1, 2, 3],\n    second: null\n};\nvar cancel = bind(object, \"second\", {\n    \"<->\": \"array.get(1)\"\n});\nexpect(object.array.slice()).toEqual([1, 2, 3]);\nexpect(object.second).toBe(2);\n\nobject.array.shift();\nexpect(object.array.slice()).toEqual([2, 3]);\nexpect(object.second).toBe(3);\n\nobject.second = 4;\nexpect(object.array.slice()).toEqual([2, 4]);\n\ncancel();\nobject.array.shift();\nexpect(object.second).toBe(4); // still\n```\n\nThe source collection can be a Map, Dict, MultiMap, SortedMap,\nSortedArrayMap, or anything that implements `get` and\n`addMapChangeListener` as specified in [Collections][].  The key can\nalso be a variable.\n\n```javascript\nvar Map = require(\"collections/map\");\nvar a = {id: 0}, b = {id: 1};\nvar object = {\n    source: new Map([[a, 10], [b, 20]]),\n    key: null,\n    selected: null\n};\n\nvar cancel = bind(object, \"selected\", {\n    \"<-\": \"source.get(key)\"\n});\nexpect(object.selected).toBe(undefined);\n\nobject.key = a;\nexpect(object.selected).toBe(10);\n\nobject.key = b;\nexpect(object.selected).toBe(20);\n\nobject.source.set(b, 30);\nexpect(object.selected).toBe(30);\n\nvar SortedMap = require(\"collections/sorted-map\");\nobject.source = SortedMap();\nexpect(object.selected).toBe(undefined);\n\nobject.source.set(b, 40);\nexpect(object.selected).toBe(40);\n\ncancel();\nobject.key = a; // no effect\nexpect(object.selected).toBe(40);\n```\n\nYou can also bind the entire content of a map-like collection to the\ncontent of another.  Bear in mind that the content of the source\nreplaces the content of the target initially.\n\n```javascript\nvar Map = require(\"collections/map\");\nvar object = {\n    a: new Map({a: 10}),\n    b: new Map()\n};\nvar cancel = bind(object, \"a.mapContent()\", {\"<->\": \"b.mapContent()\"});\nexpect(object.a.toObject()).toEqual({});\nexpect(object.b.toObject()).toEqual({});\n\nobject.a.set('a', 10);\nexpect(object.a.toObject()).toEqual({a: 10});\nexpect(object.b.toObject()).toEqual({a: 10});\n\nobject.b.set('b', 20);\nexpect(object.a.toObject()).toEqual({a: 10, b: 20});\nexpect(object.b.toObject()).toEqual({a: 10, b: 20});\n```\n\nIn this case, the source of the binding is a different object than the\ntarget, so the binding descriptor specifies the alternate source.\n\n### Keys, Values, Entries\n\nIf the source of a binding is a map, FRB can also translate changes to\nthe map into changes on an array.  The `keys`, `values`, and `entries`\nobservers produce incrementally updated projections of the\nkey-value-mappings onto an array.\n\n```javascript\nvar Map = require(\"collections/map\");\nvar object = Bindings.defineBindings({}, {\n    keys: {\"<-\": \"map.keysArray()\"},\n    values: {\"<-\": \"map.valuesArray()\"},\n    entries: {\"<-\": \"map.entriesArray()\"}\n});\nobject.map = new Map({a: 10, b: 20, c: 30});\nexpect(object.keys).toEqual(['a', 'b', 'c']);\nexpect(object.values).toEqual([10, 20, 30]);\nexpect(object.entries).toEqual([['a', 10], ['b', 20], ['c', 30]]);\n\nobject.map.set('d', 40);\nobject.map.delete('a');\nexpect(object.keys).toEqual(['b', 'c', 'd']);\nexpect(object.values).toEqual([20, 30, 40]);\nexpect(object.entries).toEqual([['b', 20], ['c', 30], ['d', 40]]);\n```\n\n### Coerce to Map\n\nRecords (Objects with a fixed shape), arrays of entries, and Maps\nthemselves can be coerced to an incrementally updated `Map` with the\n`toMap` operator.\n\n```javascript\nvar object = Bindings.defineBindings({}, {\n    map: {\"<-\": \"entries.toMap()\"}\n});\n\n// map property will persist across changes to entries\nvar map = object.map;\nexpect(map).not.toBe(null);\n\nobject.entries = {a: 10};\nexpect(map.keysArray()).toEqual(['a']);\nexpect(map.has('a')).toBe(true);\nexpect(map.get('a')).toBe(10);\n```\n\nThe `toMap` observer maintains the insertion order of the keys.\n\n```javascript\n// Continued...\nobject.entries = [['b', 20], ['c', 30]];\nexpect(map.keysArray()).toEqual(['b', 'c']);\n\nobject.entries.push(object.entries.shift());\nexpect(map.keysArray()).toEqual(['c', 'b']);\n```\n\nIf the entries do not have unique keys, the last entry wins.  This is\nmanaged internally by observing, `entries.group{.0}.map{.1.last()}`.\n\n```javascript\n// Continued...\nobject.entries = [['a', 10], ['a', 20]];\nexpect(map.get('a')).toEqual(20);\nobject.entries.pop();\nexpect(map.get('a')).toEqual(10);\n```\n\n`toMap` binds the content of the output map to the content of the input\nmap and will clear and repopulate the output map if the input map is\nreplaced.\n\n```\n// Continued...\nobject.entries = new Map({a: 10});\nexpect(map.keysArray()).toEqual(['a']);\n```\n\n### Equals\n\nYou can bind to whether expressions are equal.\n\n```javascript\nvar fruit = {apples: 1, oranges: 2};\nbind(fruit, \"equal\", {\"<-\": \"apples == oranges\"});\nexpect(fruit.equal).toBe(false);\nfruit.orange = 1;\nexpect(fruit.equal).toBe(true);\n```\n\nEquality can be bound both directions.  In this example, we do a two-way\nbinding between whether a radio button is checked and a corresponding\nvalue in our model.\n\n```javascript\nvar component = {\n    orangeElement: {checked: false},\n    appleElement: {checked: true}\n};\nBindings.defineBindings(component, {\n    \"orangeElement.checked\": {\"<->\": \"fruit == 'orange'\"},\n    \"appleElement.checked\": {\"<->\": \"fruit == 'apple'\"},\n});\n\ncomponent.orangeElement.checked = true;\nexpect(component.fruit).toEqual(\"orange\");\n\ncomponent.appleElement.checked = true;\nexpect(component.fruit).toEqual(\"apple\");\n```\n\nBecause equality and assignment are interchanged in this language, you\ncan use either `=` or `==`.\n\nFRB also supports a comparison operator, `<=>`, which uses\n`Object.compare` to determines how two operands should be sorted in\nrelation to each other.\n\n### Array and Map Content\n\nIn JavaScript, arrays behave both like objects (in the sense that every\nindex is a property, but also like a map collection of index-to-value\npairs.  The [Collections][] package goes so far as to patch up the\n`Array` prototype so arrays can masquerade as maps, with the caveat that\n`delete(value)` behaves like a Set instead of a Map.\n\nThis duplicity is reflected in FRB.  You can access the values in an\narray using the object property notation or the mapped key notation.\n\n```javascript\nvar object = {\n    array: [1, 2, 3]\n};\nBindings.defineBindings(object, {\n    first: {\"<-\": \"array.0\"},\n    second: {\"<-\": \"array.get(1)\"}\n});\nexpect(object.first).toBe(1);\nexpect(object.second).toBe(2);\n```\n\nTo distinguish a numeric property of the source from a number literal,\nuse a dot.  To distingish a mapped index from an array literal, use an\nempty expression.\n\n```javascript\nvar array = [1, 2, 3];\nvar object = {};\nBindings.defineBindings(object, {\n    first: {\n        \"<-\": \".0\",\n        source: array\n    },\n    second: {\n        \"<-\": \"get(1)\",\n        source: array\n    }\n});\nexpect(object.first).toBe(1);\nexpect(object.second).toBe(2);\n```\n\nUnlike property notation, map notation can observe a variable index.\n\n```javascript\nvar object = {\n    array: [1, 2, 3],\n    index: 0\n};\nBindings.defineBinding(object, \"last\", {\n    \"<-\": \"array.get(array.length - 1)\"\n});\nexpect(object.last).toBe(3);\n\nobject.array.pop();\nexpect(object.last).toBe(2);\n```\n\nYou can also bind *all* of the content of an array by range or by\nmapping.  The notation for binding ranged content is `rangeContent()`.\nEvery change to an Array or SortedSet dispatches range changes and any\ncollection that implements `splice` and `swap` can be a target for such\nchanges.\n\n```javascript\nvar SortedSet = require(\"collections/sorted-set\");\nvar object = {\n    set: SortedSet(),\n    array: []\n};\nBindings.defineBindings(object, {\n    \"array.rangeContent()\": {\"<-\": \"set\"}\n});\nobject.set.addEach([5, 2, 6, 1, 4, 3]);\nexpect(object.array).toEqual([1, 2, 3, 4, 5, 6]);\n```\n\nThe notation for binding the content of any mapping collection using map\nchanges is `mapContent()`.  On the target of a binding, this will note\nwhen values are added or removed on each key of the source collection\nand apply the same change to the target.  The target and source can be\narrays or map collections.\n\n```javascript\nvar Map = require(\"collections/map\");\nvar object = {\n    map: new Map(),\n    array: []\n};\nBindings.defineBinding(object, \"map.mapContent()\", {\n    \"<-\": \"array\"\n});\nobject.array.push(1, 2, 3);\nexpect(object.map.toObject()).toEqual({\n    0: 1,\n    1: 2,\n    2: 3\n});\n```\n\n### Value\n\nA note about the source value: an empty path implies the source value.\nUsing empty paths and empty expressions is useful in some situations.\n\nIf a value is ommitted on either side of an operator, it implies the\nsource value.  The expression `sorted{}` indicates a sorted array, where\neach value is sorted by its own numeric value.  The expression\n`filter{!!}` would filter falsy values.  The operand is implied.\nSimilarly, `filter{!(%2)}` produces only even values.\n\nThis is why you can use `.0` to get the zeroth property of an array, to\ndistingiush the form from `0` which would be a numeric literal, and why\nyou can use `()[0]` to map the zeroeth key of a map or array, to\ndistinguish the form from `[0]` which would be an array literal.\n\n### With Context Value\n\nExpressions can be evaluated in the context of another value using a\nvariant of property notation.  A parenthesized expression can follow a\npath.\n\n```javascript\nvar object = {\n    context: {a: 10, b: 20}\n};\nBindings.defineBinding(object, \"sum\", {\n    \"<-\": \"context.(a + b)\"\n});\nexpect(object.sum).toBe(30);\n\nBindings.cancelBinding(object, \"sum\");\nobject.context.a = 20;\nexpect(object.sum).toBe(30); // unchanged\n```\n\nTo observe a constructed array or object literal, the expression does\nnot need parentheses.\n\n```javascript\nvar object = {\n    context: {a: 10, b: 20}\n};\nBindings.defineBindings(object, {\n    \"duple\": {\"<-\": \"context.[a, b]\"},\n    \"pair\": {\"<-\": \"context.{key: a, value: b}\"}\n});\nexpect(object.duple).toEqual([10, 20]);\nexpect(object.pair).toEqual({key: 10, value: 20});\n\nBindings.cancelBindings(object);\n```\n\n### Operators\n\nFRB can also recognize many operators.  These are in order of precedence\nunary `-` negation, `+` numeric coercion, and `!` logical negation and\nthen binary `**` power, `//` root, `%%` logarithm, `*`, `/`, `%` modulo,\n`%%` remainder, `+`, `-`, ```<```, ```>```, ```<=```, ```>=```, `=` or\n`==`, `!=`, `&&` and `||`.\n\n```javascript\nvar object = {height: 10};\nbind(object, \"heightPx\", {\"<-\": \"height + 'px'\"});\nexpect(object.heightPx).toEqual(\"10px\");\n```\n\nThe unary `+` operator coerces a value to a number. It is handy for\nbinding a string to a number.\n\n```javascript\nvar object = {\n    number: null,\n    string: null,\n};\nBindings.defineBinding(object, \"+number\", {\n    \"<-\": \"string\"\n});\nobject.string = '10';\nexpect(object.number).toBe(10);\n```\n\n### Functions\n\nFRB supports some common functions.  `startsWith`, `endsWith`, and\n`contains` all operate on strings.  `join` concatenates an array of\nstrings with a given delimiter (or empty string).  `split` breaks a\nstring between every delimiter (or just between every character).\n`join` and `split` are algebraic and can be bound as well as observed.\n\n### Conditional\n\nFRB supports the ternary conditional operator, if `?` then `:` else.\n\n```javascript\nvar object = Bindings.defineBindings({\n    condition: null,\n    consequent: 10,\n    alternate: 20\n}, {\n    choice: {\"<->\": \"condition ? consequent : alternate\"}\n});\n\nexpect(object.choice).toBe(undefined); // no choice made\n\nobject.condition = true;\nexpect(object.choice).toBe(10);\n\nobject.condition = false;\nexpect(object.choice).toBe(20);\n```\n\nThe ternary operator can bind in both directions.\n\n```javascript\nobject.choice = 30;\nexpect(object.alternate).toBe(30);\n\nobject.condition = true;\nobject.choice = 40;\nexpect(object.consequent).toBe(40);\n```\n\n### And\n\nThe logical **and** operator, `&&`, observes either the left or right\nargument depending on whether the first argument is both defined and\ntrue.  If the first argument is null, undefined, or false, it will stand\nfor the whole expression.  Otherwise, the second argument will stand for\nthe whole expression.\n\nIf we assume that the first and second argument are always defined and\neither true or false, the **and** operator serves strictly as a logical\ncombinator.  However, with bindings, it is common for a value to at\nleast initially be null or undefined.  Logical operators are the\nexception to the rule that an expression will necessarily terminate if\nany operand is null or undefined.\n\nIn this example, the left and right sides are initially undefined.  We\nset the right operand to `10` and the bound value remains undefined.\n\n```javascript\nvar object = Bindings.defineBindings({\n    left: undefined,\n    right: undefined\n}, {\n    and: {\"<-\": \"left && right\"}\n});\n\nobject.right = 10;\nexpect(object.and).toBe(undefined);\n```\n\nWe set the left operand to `20`.  The bound value becomes the value of\nthe right operand, `10`.\n\n```javascript\n// Continued...\nobject.left = 20;\nexpect(object.and).toBe(10);\n```\n\n---\n\nInterestingly, logical **and** is bindable.  The objective of the\nbinding is to do whatever is necessary, if possible, to make the logical\nexpression equal the bound value.\n\nSupposing that both the left and right operands are false, and the\nresult is or becomes true, to satisfy the equality `left && right ==\ntrue`, both left and right must be set and bound to `true`.\n\n```javascript\nvar object = Bindings.defineBindings({}, {\n    \"left && right\": {\n        \"<-\": \"leftAndRight\"\n    }\n});\n\nobject.leftAndRight = true;\nexpect(object.left).toBe(true);\nexpect(object.right).toBe(true);\n```\n\nAs with the equals binder, logic bindings will prefer to alter the left\noperand if altering either operand would suffice to validate the\nexpression.  So, if the expression then becomes false, it is sufficient\nto set the left side to false to satisfy the equality.\n\n```javascript\n// Continued...\nobject.leftAndRight = false;\nexpect(object.left).toBe(false);\nexpect(object.right).toBe(true);\n```\n\nThis can facilitate some interesting, tri-state logic.  For example, if\nyou have a checkbox that can be checked, unchecked, or disabled, and you\nwant it to be unchecked if it is disabled, you can use logic bindings to\nensure this.\n\n```javascript\nvar controller = Bindings.defineBindings({\n    checkbox: {\n        checked: false,\n        disabled: false\n    },\n    model: {\n        expanded: false,\n        children: [1, 2, 3]\n    }\n}, {\n    \"checkbox.checked\": {\"<->\": \"model.expanded && expandable\"},\n    \"checkbox.disabled\": {\"<-\": \"!expandable\"},\n    \"expandable\": {\"<-\": \"model.children.length > 0\"}\n});\n\nexpect(controller.checkbox.checked).toBe(false);\nexpect(controller.checkbox.disabled).toBe(false);\n\n// check the checkbox\ncontroller.checkbox.checked = true;\nexpect(controller.model.expanded).toBe(true);\n\n// alter the model such that the checkbox is unchecked and disabled\ncontroller.model.children.clear();\nexpect(controller.checkbox.checked).toBe(false);\nexpect(controller.checkbox.disabled).toBe(true);\n```\n\n### Or\n\nAs with the **and** operator, the logical **or** is an exception to the\nrule that an expression is null, undefined, or empty if any of the\noperands are null or undefined.  If both operands are defined and\nboolean, **or** expressions behave strictly within the realm of logic.\nHowever, if the values are non-boolean or even non-values, they serve to\nselect either the left or right side based on whether the left side is\ndefined and true.\n\nIf the first argument is undefined or false, the aggregate expression\nwill evaluate to the second argument, even if that argument is null or\nundefined.\n\nSuppose we bind `or` to `left || right` on some object.  `or` will be\n`undefined` initially, but if we set the `right` to `10`, `or` will\nbecome `10`, bypassing the still undefined left side.\n\n```javascript\nvar object = Bindings.defineBindings({\n    left: undefined,\n    right: undefined\n}, {\n    or: {\"<-\": \"left || right\"}\n});\n\nobject.right = 10;\nexpect(object.or).toBe(10);\n```\n\nHowever, the left hand side takes precedence over the right if it is\ndefined and true.\n\n```javascript\n// Continued...\nobject.left = 20;\nexpect(object.or).toBe(20);\n```\n\nAnd it will remain bound, even if the right hand side becomes undefined.\n\n```javascript\nobject.right = undefined;\nexpect(object.or).toBe(20);\n```\n\n> Aside: JavaScript’s `delete` operator performs a configuration change,\n> and desugars to `Object.defineProperty`, and is not interceptable with\n> an ES5 setter.  So, don't use it on any property that is involved in a\n> binding.  Setting to null or undefined should suffice.\n\n---\n\nLogical **or** is bindable.  As with logical **and**, the binding\nperforms the minimum operation necessary to ensure that the expression\nis equal.  If the expression becomes true, and either of the operands\nare true, the nothing needs to change.  If the expression becomes false,\nhowever, both operands must be bound to false.  If the expression\nbecomes true again, it is sufficient to bind the left operand to true to\nensure that the expression as a whole is true.  Rather than belabor the\npoint, I leave as an exercise to the reader to apply DeMorgan’s Theorem\nto the documentation for logical **and** bindings.\n\n\n### Default\n\nThe **default** operator, `??`, is similar to the **or**, `||` operator,\nexcept that it decides whether to use the left or right solely based on\nwhether the left is defined.  If the left is null or undefined, the\naggregate expression will evaluate to the right expression.  If the left\nis defined, even if it is false, the result will be the left expression.\n\n```javascript\nvar object = Bindings.defineBindings({\n    left: undefined,\n    right: undefined\n}, {\n    or: {\"<-\": \"left ?? right\"}\n});\n\nobject.right = 10;\nexpect(object.or).toBe(10);\n\nobject.left = false;\nexpect(object.or).toBe(false);\n```\n\nThe default operator is not bindable, but weirder things have happened.\n\n### Defined\n\nThe `defined()` operator serves a similar role to the default operator.\nIf the value in scope is null or undefined, it the result will be false,\nand otherwise it will be true.  This will allow a term that may be\nundefined to propagate.\n\n```javascript\nvar object = Bindings.defineBindings({}, {\n    ready: {\n        \"<-\": \"value.defined()\"\n    }\n});\nexpect(object.ready).toBe(false);\n\nobject.value = 10;\nexpect(object.ready).toBe(true);\n```\n\nThe defined operator is also bindable.  If the source is or becomes\nfalse, the target will be bound to `null`.  If the source is null or\nfalse, the binding has no effect.\n\n```javascript\nvar object = Bindings.defineBindings({\n    value: 10,\n    operational: true\n}, {\n    \"value.defined()\": {\"<-\": \"operational\"}\n});\nexpect(object.value).toBe(10);\n\nobject.operational = false;\nexpect(object.value).toBe(undefined);\n```\n\nIf the source becomes null or undefined, it will cancel the previous\nbinding but does not set or restore the bound value.  Vaguely becoming\n“defined” is not enough information to settle on a particular value.\n\n```javascript\nobject.operational = true;\nexpect(object.value).toBe(undefined);\n```\n\nHowever, another binding might settle the issue.\n\n```javascript\nBindings.defineBindings(object, {\n    \"value == 10\": {\n        \"<-\": \"operational\"\n    }\n});\nexpect(object.value).toBe(10);\n```\n\n### Algebra\n\nFRB can automatically invert algebraic operators as long as they operate\nstrictly on the left-most expressions on both the source and target are\nbindable properties.\n\nIn this example, the primary binding is ```notToBe <- !toBe```, and the\ninverse binding is automatically computed ```toBe <- !notToBe```.\n\n```javascript\nvar caesar = {toBe: false};\nbind(caesar, \"notToBe\", {\"<->\": \"!toBe\"});\nexpect(caesar.toBe).toEqual(false);\nexpect(caesar.notToBe).toEqual(true);\n\ncaesar.notToBe = false;\nexpect(caesar.toBe).toEqual(true);\n```\n\nFRB does algebra by rotating the expressions on one side of a binding to\nthe other until only one independent property remains (the left most\nexpression) on the target side of the equation.\n\n```\nconvert: y <- !x\nrevert: x <- !y\n```\n\n```\nconvert: y <- x + a\nrevert: x <- y - a\n```\n\nThe left-most independent variable on the right hand side becomes the\ndependent variable on the inverted binding.  At present, this only works\nfor numbers and when the left-most expression is a bindable property\nbecause it cannot assign a new value to the literal 10.  For example,\nFRB cannot yet implicitly revert ```y <-> 10 + x```.\n\n### Literals\n\nYou may have noticed literals in the previous examples.  String literals\ntake the form of any characters between single quotes.  Any character\ncan be escaped with a back slash.\n\n```javascript\nvar object = {};\nbind(object, \"greeting\", {\"<-\": \"'Hello, World!'\"});\nexpect(object.greeting).toBe(\"Hello, World!\");\n```\n\nNumber literals are digits with an optional mantissa.\n\n```javascript\nbind(object, 'four', {\"<-\": \"2 + 2\"});\n```\n\n### Tuples\n\nBindings can produce fixed-length arrays.  These are most useful in\nconjunction with mappings.  Tuples are comma-delimited and\nparantheses-enclosed.\n\n```javascript\nvar object = {array: [[1, 2, 3], [4, 5]]};\nbind(object, \"summary\", {\"<-\": \"array.map{[length, sum()]}\"});\nexpect(object.summary).toEqual([\n    [3, 6],\n    [2, 9]\n]);\n```\n\n### Records\n\nBindings can also produce fixed-shape objects.  The notation is\ncomma-delimited, colon-separated entries, enclosed by curly-braces.\n\n```javascript\nvar object = {array: [[1, 2, 3], [4, 5]]};\nbind(object, \"summary\", {\n    \"<-\": \"array.map{{length: length, sum: sum()}}\"\n});\nexpect(object.summary).toEqual([\n    {length: 3, sum: 6},\n    {length: 2, sum: 9}\n]);\n```\n\nThe left hand side of an entry in a record is any combination of letters\nor numbers.  The right side is any expression.\n\n### Parameters\n\nBindings can also involve parameters.  The source of parameters is by\ndefault the same as the source.  The source, in turn, defaults to the\nsame as the target object.  It can be specified on the binding\ndescriptor.  Parameters are declared by any expression following a\ndollar sign.\n\n```javascript\nvar object = {a: 10, b: 20, c: 30};\nbind(object, \"foo\", {\n    \"<-\": \"[$a, $b, $c]\"},\n    parameters: object\n});\n```\n\nBindings also react to changes to the parameters.\n\n```javascript\nobject.a = 0;\nobject.b = 1;\nobject.c = 2;\nexpect(object.foo).toEqual([0, 1, 2]);\n```\n\nThe degenerate case of the property language is an empty string.  This\nis a valid property path that observes the value itself.  So, as an\nemergent pattern, a `$` expression by itself corresponds to the whole\nparameters object.\n\n```javascript\nvar object = {};\nbind(object, \"ten\", {\"<-\": \"$\", parameters: 10});\nexpect(object.ten).toEqual(10);\n```\n\n### Elements and Components\n\nFRB provides a `#` notation for reaching into the DOM for an element.\nThis is handy for binding views and models on a controller object.\n\nThe `defineBindings` method accepts an optional final argument,\n`parameters`, which is shared by all bindings (unless shadowed by a more\nspecific parameters object on an individual descriptor).\n\nThe `parameters` can include a `document`.  The `document` may be any\nobject that implements `getElementById`.\n\nAdditionally, the `frb/dom` is an experiment that monkey-patches the DOM\nto make some properties of DOM elements observable, like the `value` or\n`checked` attribute of an `input` or `textarea element`.\n\n```javascript\nvar Bindings = require(\"frb\");\nrequire(\"frb/dom\");\n\nvar controller = Bindings.defineBindings({}, {\n\n    \"fahrenheit\": {\"<->\": \"celsius * 1.8 + 32\"},\n    \"celsius\": {\"<->\": \"kelvin - 272.15\"},\n\n    \"#fahrenheit.value\": {\"<->\": \"+fahrenheit\"},\n    \"#celsius.value\": {\"<->\": \"+celsius\"},\n    \"#kelvin.value\": {\"<->\": \"+kelvin\"}\n\n}, {\n    document: document\n});\n\ncontroller.celsius = 0;\n```\n\nOne caveat of this approach is that it can cause a lot of DOM repaint\nand reflow events.  The [Montage][] framework uses a synchronized draw\ncycle and a component object model to minimize the cost of computing CSS\nproperties on the DOM and performing repaints and reflows, deferring\nsuch operations to individual animation frames.\n\nFor a future release of Montage, FRB provides an alternate notation for\nreaching into the component object model, using its deserializer.  The\n`@` prefix refers to another component by its label.  Instead of\nproviding a `document`, Montage provides a `serialization`, which in\nturn implements `getObjectForLabel`.\n\n```javascript\nvar Bindings = require(\"frb\");\n\nvar controller = Bindings.defineBindings({}, {\n\n    \"fahrenheit\": {\"<->\": \"celsius * 1.8 + 32\"},\n    \"celsius\": {\"<->\": \"kelvin - 272.15\"},\n\n    \"@fahrenheit.value\": {\"<->\": \"+fahrenheit\"},\n    \"@celsius.value\": {\"<->\": \"+celsius\"},\n    \"@kelvin.value\": {\"<->\": \"+kelvin\"}\n\n}, {\n    serializer: serializer\n});\n\ncontroller.celsius = 0;\n```\n\n### Observers\n\nFRB’s bindings use observers and binders internally.  You can create an\nobserver from a property path with the `observe` function exported by\nthe `frb/observe` module.\n\n```javascript\nvar results = [];\nvar object = {foo: {bar: 10}};\nvar cancel = observe(object, \"foo.bar\", function (value) {\n    results.push(value);\n});\n\nobject.foo.bar = 10;\nexpect(results).toEqual([10]);\n\nobject.foo.bar = 20;\nexpect(results).toEqual([10, 20]);\n```\n\nFor more complex cases, you can specify a descriptor instead of the\ncallback.  For example, to observe a property’s value *before it\nchanges*, you can use the `beforeChange` flag.\n\n```javascript\nvar results = [];\nvar object = {foo: {bar: 10}};\nvar cancel = observe(object, \"foo.bar\", {\n    change: function (value) {\n        results.push(value);\n    },\n    beforeChange: true\n});\n\nexpect(results).toEqual([10]);\n\nobject.foo.bar = 20;\nexpect(results).toEqual([10, 10]);\n\nobject.foo.bar = 30;\nexpect(results).toEqual([10, 10, 20]);\n```\n\nIf the product of an observer is an array, that array is always updated\nincrementally.  It will only get emitted once.  If you want it to get\nemitted every time its content changes, you can use the `contentChange`\nflag.\n\n```javascript\nvar lastResult;\nvar array = [[1, 2, 3], [4, 5, 6]];\nobserve(array, \"map{sum()}\", {\n    change: function (sums) {\n        lastResult = sums.slice();\n        // 1. [6, 15]\n        // 2. [6, 15, 0]\n        // 3. [10, 15, 0]\n    },\n    contentChange: true\n});\n\nexpect(lastResult).toEqual([6, 15]);\n\narray.push([0]);\nexpect(lastResult).toEqual([6, 15, 0]);\n\narray[0].push(4);\nexpect(lastResult).toEqual([10, 15, 0]);\n```\n\n### Nested Observers\n\nTo get the same effect as the previous example, you would have to nest\nyour own content change observer.\n\n```javascript\nvar i = 0;\nvar array = [[1, 2, 3], [4, 5, 6]];\nvar cancel = observe(array, \"map{sum()}\", function (array) {\n    function contentChange() {\n        if (i === 0) {\n            expect(array.slice()).toEqual([6, 15]);\n        } else if (i === 1) {\n            expect(array.slice()).toEqual([6, 15, 0]);\n        } else if (i === 2) {\n            expect(array.slice()).toEqual([10, 15, 0]);\n        }\n        i++;\n    }\n    contentChange();\n    array.addRangeChangeListener(contentChange);\n    return function cancelRangeChange() {\n        array.removeRangeChangeListener(contentChange);\n    };\n});\narray.push([0]);\narray[0].push(4);\ncancel();\n```\n\nThis illustrates one crucial aspect of the architecture.  Observers\nreturn cancelation functions.  You can also return a cancelation\nfunction inside a callback observer.  That canceler will get called each\ntime a new value is observed, or when the parent observer is canceled.\nThis makes it possible to nest observers.\n\n```javascript\nvar object = {foo: {bar: 10}};\nvar cancel = observe(object, \"foo\", function (foo) {\n    return observe(foo, \"bar\", function (bar) {\n        expect(bar).toBe(10);\n    });\n});\n```\n\n### Bindings\n\nFRB provides utilities for declaraing and managing multiple bindings on\nobjects.  The `frb` (`frb/bindings`) module exports this interface.\n\n```javascript\nvar Bindings = require(\"frb\");\n```\n\nThe `Bindings` module provides `defineBindings` and `cancelBindings`,\n`defineBinding` and `cancelBinding`, as well as binding inspector\nmethods `getBindings` and `getBinding`.  All of these take a target\nobject as the first argument.\n\nThe `Bindings.defineBinding(target, descriptors)` method returns the\ntarget object for convenience.\n\n```javascript\nvar target = Bindings.defineBindings({}, {\n    \"fahrenheit\": {\"<->\": \"celsius * 1.8 + 32\"},\n    \"celsius\": {\"<->\": \"kelvin - 272.15\"}\n});\ntarget.celsius = 0;\nexpect(target.fahrenheit).toEqual(32);\nexpect(target.kelvin).toEqual(272.15);\n```\n\n`Bindings.getBindings` in that case would return an object with\n`fahrenheit` and `celsius` keys.  The values would be identical to the\ngiven binding descriptor objects, like `{\"<->\": \"kelvin - 272.15\"}`, but\nit also gets annotated with a `cancel` function and the default values\nfor any ommitted properties like `source` (same as `target`),\n`parameters` (same as `source`), and others.\n\n`Bindings.cancelBindings` cancels all bindings attached to an object and\nremoves them from the bindings descriptors object.\n\n```javascript\nBindings.cancelBindings(target);\nexpect(Bindings.getBindings(object)).toEqual({});\n```\n\n### Binding Descriptors\n\nBinding descriptors describe the source of a binding and additional\nparameters.  `Bindings.defineBindings` can set up bindings (```<-``` or\n```<->```), computed (```compute```) properties, and falls back to\ndefining ES5 properties with permissive defaults (`enumerable`,\n`writable`, and `configurable` all on by default).\n\nIf a descriptor has a ```<-``` or ```<->```, it is a binding descriptor.\nFRB creates a binding, adds the canceler to the descriptor, and adds the\ndescriptor to an internal table that tracks all of the bindings defined\non that object.\n\n```javascript\nvar object = Bindings.defineBindings({\n    darkMode: false,\n    document: document\n}, {\n    \"document.body.classList.has('dark')\": {\n        \"<-\": \"darkMode\"\n    }\n});\n```\n\nYou can get all the binding descriptors with `Bindings.getBindings`, or a\nsingle binding descriptor with `Bindings.getBinding`.  `Bindings.cancel` cancels\nall the bindings to an object and `Bindings.cancelBinding` will cancel just\none.\n\n```javascript\n// Continued from above...\nvar bindings = Bindings.getBindings(object);\nvar descriptor = Bindings.getBinding(object, \"document.body.classList.has('dark')\");\nBindings.cancelBinding(object, \"document.body.classList.has('dark')\");\nBindings.cancelBindings(object);\nexpect(Object.keys(bindings)).toEqual([]);\n```\n\n### Converters\n\nA binding descriptor can have a `convert` function, a `revert` function,\nor alternately a `converter` object.  Converters are useful for\ntransformations that cannot be expressed in the property language, or\nare not reversible in the property language.\n\nIn this example, `a` and `b` are synchronized such that `a` is always\nhalf of `b`, regardless of which property gets updated.\n\n```javascript\nvar object = Bindings.defineBindings({\n    a: 10\n}, {\n    b: {\n        \"<->\": \"a\",\n        convert: function (a) {\n            return a * 2;\n        },\n        revert: function (b) {\n            return b / 2;\n        }\n    }\n});\nexpect(object.b).toEqual(20);\n\nobject.b = 10;\nexpect(object.a).toEqual(5);\n```\n\nConverter objects are useful for reusable or modular converter types and\nconverters that track additional state.\n\n```javascript\nfunction Multiplier(factor) {\n    this.factor = factor;\n}\nMultiplier.prototype.convert = function (value) {\n    return value * this.factor;\n};\nMultiplier.prototype.revert = function (value) {\n    return value / this.factor;\n};\n\nvar doubler = new Multiplier(2);\n\nvar object = Bindings.defineBindings({\n    a: 10\n}, {\n    b: {\n        \"<->\": \"a\",\n        converter: doubler\n    }\n});\nexpect(object.b).toEqual(20);\n\nobject.b = 10;\nexpect(object.a).toEqual(5);\n```\n\nReusable converters have an implied direction, from some source type to\na particular target type.  Sometimes the types on your binding are the\nother way around.  For that case, you can use the converter as a\nreverter.  This merely swaps the `convert` and `revert` methods.\n\n```javascript\nvar uriConverter = {\n    convert: encodeURI,\n    revert: decodeURI\n};\nvar model = Bindings.defineBindings({}, {\n    \"title\": {\n        \"<->\": \"location\",\n        reverter: uriConverter\n    }\n});\n\nmodel.title = \"Hello, World!\";\nexpect(model.location).toEqual(\"Hello,%20World!\");\n\nmodel.location = \"Hello,%20Dave.\";\nexpect(model.title).toEqual(\"Hello, Dave.\");\n```\n\n### Computed Properties\n\nA computed property is one that gets updated with a function call when\none of its arguments changes.  Like a converter, it is useful in cases\nwhere a transformation or computation cannot be expressed in the\nproperty language, but can additionally accept multiple arguments as\ninput.  A computed property can be used as the source for another\nbinding.\n\nIn this example, we create an object as the root of multiple bindings.\nThe object synchronizes the properties of a \"form\" object with the\nwindow’s search string, effectively navigating to a new page whenever\nthe \"q\" or \"charset\" values of the form change.\n\n```javascript\nBindings.defineBindings({\n    window: window,\n    form: {\n        q: \"\",\n        charset: \"utf-8\"\n    }\n}, {\n    queryString: {\n        args: [\"form.q\", \"form.charset\"],\n        compute: function (q, charset) {\n            return \"?\" + QS.stringify({\n                q: q,\n                charset: charset\n            });\n        }\n    },\n    \"window.location.search\": {\n        \"<-\": \"queryString\"\n    }\n});\n```\n\n### Debugging with Traces\n\nA binding can be configured to log when it changes and why.  The `trace`\nproperty on a descriptor instructs the binder to log changes to the\nconsole.\n\n```javascript\nBindings.defineBindings({\n    a: 10\n}, {\n    b: {\n        \"<-\": \"a + 1\",\n    }\n});\n```\n\n### Polymorphic Extensibility\n\nBindings support three levels of polymorphic extensibility depending on\nthe needs of a method that FRB does not anticipate.\n\nIf an operator is pure, meaning that all of its operands are value types\nthat will necessarily need to be replaced outright if they every change,\nmeaning that they are all effectively stateless, and if all of the\noperands must be defined in order for the output to be defined, it is\nsufficient to just use a plain JavaScript method.  For example,\n`string.toUpperCase()` will work fine.\n\nIf an operator responds to state changes of its one and only operand, an\nobject may implement an observer method.  If the operator is `foo` in\nFRB, the JavaScript method is `observeFoo(emit)`.  The observer must\nreturn a cancel function if it will emit new values after it returns, or\nif it uses observers itself.  It must stop emitting new values if FRB\ncalls its canceler.  The emitter may return a canceler itself, and the\nobserver must call that canceler before it emits a new value.\n\nThis is an example of a clock.  The `clock.time()` is an observable\noperator of the clock in FRB, implemented by `observeTime`.  It will\nemit a new value once a second.\n\n```javascript\nfunction Clock() {\n}\n\nClock.prototype.observeTime = function (emit) {\n    var cancel, timeoutHandle;\n    function tick() {\n        if (cancel) {\n            cancel();\n        }\n        cancel = emit(Date.now());\n        timeoutHandle = setTimeout(tick, 1000);\n    }\n    tick();\n    return function cancelTimeObserver() {\n        clearTimeout(timeoutHandle);\n        if (cancel) {\n            cancel();\n        }\n    };\n};\n\nvar object = Bindings.defineBindings({\n    clock: new Clock()\n}, {\n    \"time\": {\"<-\": \"clock.time()\"}\n});\n\nexpect(object.time).not.toBe(undefined);\n\nBindings.cancelBindings(object);\n```\n\nIf an operator responds to state changes of its operands, you will need\nto implement an observer maker.  An observer maker is a function that\nreturns an observer function, and accepts observer functions for all of\nthe arguments you are expected to observe.  The observer must also\nhandle a scope argument, usually just passing it on at run-time,\n`observe(emit, scope)`.  Otherwise it is much the same.\n\nFRB would delegate to `makeTimeObserver(observeResolution)` for a\n`clock.time(ms)` FRB expression.\n\nThis is an updated rendition of the clock example except that it will\nobserve changes to a resolution operand and adjust its tick frequency\naccordingly.\n\n```javascript\nfunction Clock() {\n}\n\nClock.prototype.observeTime = function (emit, resolution) {\n    var cancel, timeoutHandle;\n    function tick() {\n        if (cancel) {\n            cancel();\n        }\n        cancel = emit(Date.now());\n        timeoutHandle = setTimeout(tick, resolution);\n    }\n    tick();\n    return function cancelTimeObserver() {\n        clearTimeout(timeoutHandle);\n        if (cancel) {\n            cancel();\n        }\n    };\n};\n\nClock.prototype.makeTimeObserver = function (observeResolution) {\n    var self = this;\n    return function observeTime(emit, scope) {\n        return observeResolution(function replaceResolution(resolution) {\n            return self.observeTime(emit, resolution);\n        }, scope);\n    };\n};\n\nvar object = Bindings.defineBindings({\n    clock: new Clock()\n}, {\n    \"time\": {\"<-\": \"clock.time(1000)\"}\n});\n\nexpect(object.time).not.toBe(undefined);\n\nBindings.cancelBindings(object);\n```\n\nPolymorphic binders are not strictly impossible, but you would be mad to\ntry them.\n\n\n## Reference\n\nFunctional Reactive Bindings is an implementation of synchronous,\nincremental object-property and collection-content bindings for\nJavaScript.  It was ripped from the heart of the [Montage][] web\napplication framework and beaten into this new, slightly magical form.\nIt must prove itself worthy before it can return.\n\n-   **functional**: The implementation uses functional building blocks\n    to compose observers and binders.\n-   **generic**: The implementation uses generic methods on collections,\n    like `addRangeChangeListener`, so any object can implement the\n    same interface and be used in a binding.\n-   **reactive**: The values of properties and contents of collections\n    react to changes in the objects and collections on which they\n    depend.\n-   **synchronous**: All bindings are made consistent in the statement\n    that causes the change.  The alternative is asynchronous, where\n    changes are queued up and consistency is restored in a later event.\n-   **incremental**: If you update an array, it produces a content\n    change which contains the values you added, removed, and the\n    location of the change.  Most bindings can be updated using only\n    these values.  For example, a sum is updated by decreasing by the\n    sum of the values removed, and increasing by the sum of the values\n    added.  FRB can incrementally update `map`, `reversed`, `flatten`,\n    `sum`, and `average` observers.  It can also incrementally update\n    `has` bindings.\n-   **unwrapped**: Rather than wrap objects and arrays with observable\n    containers, FRB modifies existing arrays and objects to make them\n    dispatch property and content changes.  For objects, this involves\n    installing getters and setters using the ES5 `Object.defineProperty`\n    method.  For arrays, this involves replacing all of the mutation\n    methods, like `push` and `pop`, with variants that dispatch change\n    notifications.  The methods are either replaced by swapping the\n    `__proto__` or adding the methods to the instance with\n    `Object.defineProperties`.  These techniques should [work][Define\n    Property] starting in Internet Explorer 9, Firefox 4, Safari 5,\n    Chrome 7, and Opera 12.\n\n\n### Architecture\n\n-   [Collections][] provides **property, mapped content, and ranged\n    content change events** for objects, arrays, and other collections.\n    For objects, this adds a property descriptor to the observed object.\n    For arrays, this either swaps the prototype or mixes methods into\n    the array so that all methods dispatch change events.  \n    Caveats: you have to use a `set` method on Arrays to dispatch\n    property and content change events.  Does not work in older Internet\n    Explorers since they support neither prototype assignment or ES5\n    property setters.\n-   **observer** functions for watching an entire object graph for\n    incremental changes, and gracefully rearranging and canceling those\n    observers as the graph changes.  Observers can be constructed\n    directly or with a very small query language that compiles to a tree\n    of functions so no parsing occurs wh","maintainers":[{"email":"hthetiot@gmail.com","name":"hthetiot"},{"email":"marchant@mac.com","name":"marchant"},{"email":"kris.kowal@cixar.com","name":"kriskowal"},{"email":"codebost@gmail.com","name":"cdebost"}],"time":{"modified":"2022-06-18T03:31:08.338Z","created":"2012-09-22T00:33:29.886Z","0.0.0":"2012-09-22T00:33:31.768Z","0.0.1":"2012-09-22T00:56:58.938Z","0.0.2":"2012-09-23T03:55:50.994Z","0.0.3":"2012-09-23T04:06:42.287Z","0.0.4":"2012-09-28T06:22:54.540Z","0.0.5":"2012-10-01T02:39:17.318Z","0.0.6":"2012-10-13T08:51:58.489Z","0.0.7":"2012-10-13T23:06:29.757Z","0.0.8":"2012-10-22T21:29:52.714Z","0.0.9":"2012-10-29T01:46:52.083Z","0.1.0":"2012-11-06T22:37:19.619Z","0.1.1":"2012-11-07T19:17:58.869Z","0.1.2":"2012-11-13T21:03:46.926Z","0.1.3":"2012-11-15T01:59:25.544Z","0.1.4":"2012-11-18T05:41:21.447Z","0.1.5":"2012-11-26T03:17:55.084Z","0.1.6":"2013-01-08T01:15:05.504Z","0.1.7":"2013-01-10T05:21:27.489Z","0.1.8":"2013-01-17T23:40:34.202Z","0.1.9":"2013-01-21T07:59:27.290Z","0.1.10":"2013-01-21T08:34:13.816Z","0.1.11":"2013-01-22T07:26:11.867Z","0.1.12":"2013-01-22T07:36:08.963Z","0.1.13":"2013-01-25T00:31:11.392Z","0.1.14":"2013-01-29T01:33:08.274Z","0.1.15":"2013-01-29T23:01:25.185Z","0.1.16":"2013-01-30T04:36:27.578Z","0.1.17":"2013-02-12T20:34:59.197Z","0.1.18":"2013-02-15T00:35:02.225Z","0.1.19":"2013-02-15T22:39:00.365Z","0.1.20":"2013-02-22T02:09:06.394Z","0.1.21":"2013-02-22T19:56:45.973Z","0.1.22":"2013-02-25T19:08:27.690Z","0.1.23":"2013-02-25T20:00:47.549Z","0.1.24":"2013-02-26T22:57:47.267Z","0.1.25":"2013-02-27T03:22:18.655Z","0.1.26":"2013-03-14T20:12:52.003Z","0.1.27":"2013-04-10T20:41:42.232Z","0.1.28":"2013-05-21T23:15:22.801Z","0.2.0":"2013-05-23T00:28:23.554Z","0.2.1":"2013-06-05T18:10:52.664Z","0.2.2":"2013-06-07T00:23:23.884Z","0.2.3":"2013-06-08T01:23:46.511Z","0.2.4":"2013-06-19T04:10:30.449Z","0.2.5":"2013-06-20T22:58:51.517Z","0.2.6":"2013-06-25T20:17:57.762Z","0.2.7":"2013-06-27T00:01:43.681Z","0.2.8":"2013-07-09T00:07:22.554Z","0.2.9":"2013-07-23T23:03:03.569Z","0.2.10":"2013-07-24T21:01:11.986Z","0.2.11":"2013-07-26T23:27:30.204Z","0.2.12":"2013-08-01T01:38:37.930Z","0.2.13":"2013-08-21T03:21:15.333Z","0.2.14":"2013-09-30T03:18:45.951Z","0.2.15":"2013-10-19T18:03:33.521Z","0.2.16":"2013-11-19T03:00:54.322Z","0.2.17":"2014-01-07T19:36:23.295Z","0.2.18":"2014-07-11T02:40:33.463Z","0.2.19":"2014-07-23T01:21:56.255Z","3.0.0":"2016-06-08T06:38:00.204Z","3.0.1":"2016-10-03T22:11:45.634Z","4.0.0":"2016-12-15T07:38:30.674Z","4.0.1":"2017-03-21T01:36:57.058Z","4.0.2":"2017-12-28T11:47:35.365Z","4.0.3":"2018-07-11T02:35:06.081Z"},"author":{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},"repository":{"type":"git","url":"git+ssh://git@github.com/montagejs/frb.git"},"users":{"kriskowal":true,"rockymadden":true},"readmeFilename":"README.md","homepage":"https://github.com/montagejs/frb#readme","keywords":["functional","reactive","bindings","observe","change"],"contributors":[{"name":"Kris Kowal","email":"kris@cixar.com","url":"http://github.com/kriskowal/"},{"name":"Benoit Marchant","email":"benoit@montagestudio.com","url":"http://github.com/marchant/"}],"bugs":{"url":"http://github.com/montagejs/frb/issues"},"license":"BSD-3-Clause"}