{"_id":"sanctuary","_rev":"58-002b9ab2ae406b2e81e6b21d8bc2ffca","name":"sanctuary","description":"Refuge from unsafe JavaScript","dist-tags":{"latest":"3.1.0"},"versions":{"0.1.0":{"name":"sanctuary","version":"0.1.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"340adaf98f651f784bacb8d91b6d38d6bd76a7a1","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.1.0","scripts":{},"_shasum":"4b3826dcf12cf69099825ea2e66da4cc073a2ac2","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"4b3826dcf12cf69099825ea2e66da4cc073a2ac2","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.1.0.tgz","integrity":"sha512-8+62wCoBDifsSyrATaFZ++o+OQ9lUHvHSs1L4OX3mnv/1n0deEhbxFV03Sci45VCdEs9uObcrvx4YIUCMbpKqA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8BdnZfkuY3td4Pzb5Exni2s+WIkWxbFu/XaHlJcgxAwIgRMkhp8VG2nqyuu0hlbTEGok+hn4TY4muClYteU03KnE="}]},"directories":{}},"0.2.0":{"name":"sanctuary","version":"0.2.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"c69003c4aab8b88f93408fe3d6272b165c627856","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.2.0","scripts":{},"_shasum":"839e5dafe241fbf184d3055d71e1871a1ef5013c","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"839e5dafe241fbf184d3055d71e1871a1ef5013c","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.2.0.tgz","integrity":"sha512-Gf4O/GCzL4N7OF7bESJg06qVkigfOXXcmqa/tDyU3tlFtp93oboQCVKudfISy5P+Ztz8QzHFDdxBNlpf4sx7gQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEuLV7jshoRmR4erjsQzZ9HdlnTBhWx96i/B9fmokLzoAiB2tdxuotYPMEm8Hj6XEpeXzu4Ycyu6/1ppxTRFVNA2VA=="}]},"directories":{}},"0.3.0":{"name":"sanctuary","version":"0.3.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"858ac97a7cff0c3935cb99ad35c7935d8b99ad0a","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.3.0","scripts":{},"_shasum":"19de4ab8f462cae15477e0866849c1cc8c4e014c","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"19de4ab8f462cae15477e0866849c1cc8c4e014c","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.3.0.tgz","integrity":"sha512-2Rr2015xj9AGpOA1UuQN4tF1n6lBtKFONIG91oQRyZKE8NVa4lxiKpOFo+MGUsxpMtSONrNbpXKrNOm8Ibn0cw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaYE/zBZDYa7KCEI7TyL4GJyQV4VEWTn0iG9BXiVe21QIhAOScMh1ADNAcbNASRm5J9azkdCX727zoFKk4lb1J3QSq"}]},"directories":{}},"0.4.0":{"name":"sanctuary","version":"0.4.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"0e8455a10990d1b4acb9e043b288fd07ed925bfa","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.4.0","scripts":{},"_shasum":"dc5eca0ffe8bac09433e897cacecea3a0d5afca5","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"dc5eca0ffe8bac09433e897cacecea3a0d5afca5","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.4.0.tgz","integrity":"sha512-uZkwp2npdFxF7d+ErFB+bINTtkCRm0KxJzroRWdZI2kMLBfkb+5jCTnTKu4OKbn52qGWYC9kdXyZZGJdORo7TA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQCByFUURpxcg8dsofSpc+HYwuFzWTuHxoUn/wriwngragIfTC2VL00UUftnD68SvdwHslI6w52Xa9MmX4WxYksf3Q=="}]},"directories":{}},"0.5.0":{"name":"sanctuary","version":"0.5.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.14.x"},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"f1dc0253fa7977b03811e1412cd507454e4c7072","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.5.0","scripts":{},"_shasum":"e06bc56b52bb5141f1dc171e6b83b7518178c5cb","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"e06bc56b52bb5141f1dc171e6b83b7518178c5cb","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.5.0.tgz","integrity":"sha512-+48KYYrTeeV4gAcubZkEZ99UGPtSl5kcu0s4s/CoACLubrO7723s2Ts+O6neo4ld5pHSFkqrfPf4+wfGOzQR1g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4Nqx5CD7L60m5iN0m7MwyCtBKUyn/rzGdfb3eO2q0jAiADG6NYXlZBLNwiaV5l8wS/UumtTNQQ1lG5V+d78eRAXw=="}]},"directories":{}},"0.6.0":{"name":"sanctuary","version":"0.6.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.15.x"},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/README.md","/index.js","/package.json"],"gitHead":"9dccdaee6e2a8f12b6678b69a203e757d5f1341f","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary","_id":"sanctuary@0.6.0","scripts":{},"_shasum":"85cafb024637d8f0dd47344707915375cd83f1bf","_from":".","_npmVersion":"2.7.1","_nodeVersion":"1.6.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"dist":{"shasum":"85cafb024637d8f0dd47344707915375cd83f1bf","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.6.0.tgz","integrity":"sha512-LQg53+upF2cvfB02AtcjNG/LcPPaBA5NLdV6+XjdNbAREecYrr7hAbecSqBA1yrdX3GItoybhaTfDYfRGtmodw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICOnksImMGMSbNfTKy7F1gxHu6h7Wu8O52U90dZ4mYZfAiEAzMP5sF8Kx2oUPxPV0efcNcz2fnWFcLyhHIcdzbAg5gM="}]},"directories":{}},"0.7.0":{"name":"sanctuary","version":"0.7.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.17.x"},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"7a594588635e7c903949d3d6f260d1250dad93ca","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.7.0","scripts":{},"_shasum":"61ff59ce8b3b6d2bda8bf84439ebe4aa420aa4c2","_from":".","_npmVersion":"2.14.3","_nodeVersion":"0.12.7","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"61ff59ce8b3b6d2bda8bf84439ebe4aa420aa4c2","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.7.0.tgz","integrity":"sha512-vAZfqqpUs2QodYDJouzAA1/uG51mQWC1dJU3afPb9vD7OM37ArxnkssiLCxeJhRTta+yIP8vY1WSgGqFw88S3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEOSe80WzhkV+dCmlsyrgS3v/6qZxefYhp07onA+naZwIgEskCNp6Br2Ww5g9xQUtKM7q5itZLwZTllKfne+dtCD0="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"directories":{}},"0.7.1":{"name":"sanctuary","version":"0.7.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.17.x"},"devDependencies":{"istanbul":"0.3.x","jscs":"1.10.x","jshint":"2.5.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"59c71d92374eb976fc6e5b88970b0c37e60054d0","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.7.1","scripts":{},"_shasum":"76961ae291666f339419526ccdd2266618edc293","_from":".","_npmVersion":"2.14.3","_nodeVersion":"0.12.7","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"76961ae291666f339419526ccdd2266618edc293","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.7.1.tgz","integrity":"sha512-SErIXJ7rG62UUMot9fExRWNLBqdjScPTm0CQpDuEdUWzDV3LXnBz3M/qNADiLdWXIVkCSPbGIE3AhGqwKKXYeQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC35WOHc8MhnYdb/f8n6SHsefpwH8GDHZtEc2SwjtZe/AiAjneFpprNZ3HzWeJ+f5n5xpW9cRqN1+5u6za7W9eus9A=="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"directories":{}},"0.8.0":{"name":"sanctuary","version":"0.8.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.19.x","sanctuary-def":"0.3.x"},"devDependencies":{"doctest":"0.10.x","istanbul":"0.4.x","jscs":"1.10.x","jshint":"2.5.x","jsverify":"0.7.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"b4e3b973a87b58b813e82e865c5fcf61f10bf15a","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.8.0","scripts":{},"_shasum":"f2d2a2635a5b374cfeb2a77bb753c23d58513985","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.6","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"f2d2a2635a5b374cfeb2a77bb753c23d58513985","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.8.0.tgz","integrity":"sha512-tSDraBHUNQ7LGwTvmcF6n/K1ZRwf1YySj6KhJ0RWdtPnV+2mUeZwNKZoSXXI8hbOrZT7CH2kdcp3at4AVMv8KA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICm298ObA3D3/W2vqpcAmQRbMbNb7zYZZrM9PrlNPUzzAiBqw1Ce+3/xNoQhFQYYITj9hii6KssN6PeDoD9Y8iiMxQ=="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"directories":{}},"0.9.0":{"name":"sanctuary","version":"0.9.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"dependencies":{"ramda":"0.19.x","sanctuary-def":"0.4.x"},"devDependencies":{"doctest":"0.10.x","istanbul":"0.4.x","jscs":"1.10.x","jshint":"2.5.x","jsverify":"0.7.x","mocha":"2.x.x","transcribe":"0.3.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"f7080a3f13156d06e888e563375d64075370c3dc","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.9.0","scripts":{},"_shasum":"9e130426bb9f264a89a40302d8653861aac3c2eb","_from":".","_npmVersion":"2.14.19","_nodeVersion":"4.3.1","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"9e130426bb9f264a89a40302d8653861aac3c2eb","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.9.0.tgz","integrity":"sha512-9QLGoqSioyyAaGZaT7HagM/NQTItlDxXbpCwUc3H/F3ffnXl+vV9k6Kw4D9LuJPwCdrEZy3cEMcY/2buvje1Tg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAc463/94Qd/je7WKnzKbO4DmOdqsqjXdQJekU16YozOAiBvjVzTMvWpYzFPIIklDMVOczqJuuvue+JNHjdA0MjCVQ=="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-9-west.internal.npmjs.com","tmp":"tmp/sanctuary-0.9.0.tgz_1456427565694_0.6323359780944884"},"directories":{}},"0.9.1":{"name":"sanctuary","version":"0.9.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"scripts":{"test":"make test lint"},"dependencies":{"ramda":"0.19.x","sanctuary-def":"0.4.x"},"devDependencies":{"doctest":"0.10.x","istanbul":"0.4.x","jscs":"1.10.x","jshint":"2.5.x","jsverify":"0.7.x","mocha":"2.x.x","transcribe":"0.4.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"cf77e4f7b96608c17120afde54f64a052f040c27","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.9.1","_shasum":"f7cead56293b61c4b607eeb86d0197c964c4c1d8","_from":".","_npmVersion":"2.14.21","_nodeVersion":"4.4.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"f7cead56293b61c4b607eeb86d0197c964c4c1d8","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.9.1.tgz","integrity":"sha512-mbqDZwWbASxd7iSLw/9iC6l5XcIdFcTbP1u9HA+OhJ3Ws3LfMBJU9oHmKwzMvwbQrwgpTk4dZROwr31VIUMseQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwOSR4/weOMNyOhVxqUZ0iGjEOlMFoy/kyq7wteuT9+gIhANNfhq36JdheNo81akMrTAbblevFXWUvI7Q3xFkEQqtc"}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/sanctuary-0.9.1.tgz_1457650349208_0.9353712238371372"},"directories":{}},"0.10.0":{"name":"sanctuary","version":"0.10.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/plaid/sanctuary.git"},"scripts":{"test":"make test lint"},"dependencies":{"ramda":"0.21.x","sanctuary-def":"0.5.x"},"devDependencies":{"doctest":"0.10.x","istanbul":"0.4.x","jscs":"1.10.x","jshint":"2.5.x","jsverify":"0.7.x","mocha":"2.x.x","transcribe":"0.4.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"a6b73d2c6b11996f8624bfd28f9ef36c8b44bc1c","bugs":{"url":"https://github.com/plaid/sanctuary/issues"},"homepage":"https://github.com/plaid/sanctuary#readme","_id":"sanctuary@0.10.0","_shasum":"9b16e8016cc2e2c56ba00745a46572eeb2fc6d2e","_from":".","_npmVersion":"2.15.2","_nodeVersion":"4.4.2","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"9b16e8016cc2e2c56ba00745a46572eeb2fc6d2e","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.10.0.tgz","integrity":"sha512-sKhYc0T5rQaAJcU7TyA3+xadw52HqC+lW7Kwh0SsBxU78uXaVPfZlrwM0lXC8FImuyZlIr5ijx1jN/Ce5T8NfQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClrPB2JI0YEvdWtbEeg0gjvjZtxXEYinIIbLtmeXMZ0QIgQ/RhzW+gAjDgmld573bTkdGdN4d9AoYwC7XPyy5GnuY="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/sanctuary-0.10.0.tgz_1460335245081_0.7909894559998065"},"directories":{}},"0.11.0":{"name":"sanctuary","version":"0.11.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"ramda":"0.21.x","sanctuary-def":"0.6.x"},"devDependencies":{"doctest":"0.10.x","eslint":"2.9.x","istanbul":"0.4.x","jsverify":"0.7.x","mocha":"2.x.x","sanctuary-style":"0.1.x","transcribe":"0.4.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"93f6d9f876371a7cd1f705179b288e95b4949eaa","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.11.0","_shasum":"fa56c242c068ffa767914e9ef9e007927a933bc2","_from":".","_npmVersion":"2.15.3","_nodeVersion":"4.4.3","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"fa56c242c068ffa767914e9ef9e007927a933bc2","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.11.0.tgz","integrity":"sha512-FSnSyhfGV3wPbRe5XZRVeI5s+q4ipYYDlWWHbhFEX841SneVJvhMsOdAHqKR8zaHAQzur0HaOk9ptPMs8mDydA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEubfZ90cu0u1h3KFtMnCK3Y54cl5WUOELhZaxl3uDSJAiEA5cByqMYvpLBo6Rd4xFgbER2QKhyB1ST4AlMwZYbnflY="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/sanctuary-0.11.0.tgz_1464672762683_0.07990177371539176"},"directories":{}},"0.11.1":{"name":"sanctuary","version":"0.11.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"ramda":"0.21.x","sanctuary-def":"0.6.x"},"devDependencies":{"doctest":"0.10.x","eslint":"2.9.x","istanbul":"0.4.x","jsverify":"0.7.x","mocha":"2.x.x","sanctuary-style":"0.1.x","transcribe":"0.4.x","xyz":"0.5.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"9051b883f1ec78aad4a011ae901042c023b91c96","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.11.1","_shasum":"7ee874e973e03074f57f34b5773b11089484b85a","_from":".","_npmVersion":"2.15.3","_nodeVersion":"4.4.3","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"7ee874e973e03074f57f34b5773b11089484b85a","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.11.1.tgz","integrity":"sha512-zuhYPp6jiYGlKjRL9cT9oWKOQ9r0l57vw4x/Jqui5iXvhY94sXaxEtLaAHUOTq4q+tGvioneZRbbEw6xEAWUjQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWKA16NDUyKMpYzwOeKw3yHXn1H0e+Mw4Z8csRbwrrBQIhAPwYI8A/48fbZ0YvT9WoTYZi8jkF5X2s5hzk666m2wiW"}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/sanctuary-0.11.1.tgz_1464677908844_0.5578710166737437"},"directories":{}},"0.12.0":{"name":"sanctuary","version":"0.12.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.9.0","sanctuary-type-classes":"3.0.1","sanctuary-type-identifiers":"1.0.0"},"devDependencies":{"browserify":"13.1.x","doctest":"0.11.x","eslint":"2.9.x","fantasy-land":"3.0.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remember-bower":"0.1.x","sanctuary-style":"0.4.x","transcribe":"0.5.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"cbcba367f6f5e579a77ca18f421ebd9b4300172b","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.12.0","_shasum":"676bdec10d5705c7781ef597430cedf18d3699b5","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"676bdec10d5705c7781ef597430cedf18d3699b5","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.12.0.tgz","integrity":"sha512-ln5V0JeP1q7NEBylpansYq1dVxt+LggncUW8vdXYZRpnAvEiqL5RNXIfnzr0S8tZv70NwJa6ETrXk43OodBTcw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDRhk7o48b5BTkfw6HSVFfJLnXQXLPedsMJbiFm3De+KAiEAwgoWHb9pRbsWsmmG9OjlEJnS9pBurKXou1fVoKFYEBE="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/sanctuary-0.12.0.tgz_1486933398662_0.140457003377378"},"directories":{}},"0.12.1":{"name":"sanctuary","version":"0.12.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.9.0","sanctuary-type-classes":"3.0.1","sanctuary-type-identifiers":"1.0.0"},"devDependencies":{"browserify":"13.1.x","doctest":"0.11.x","eslint":"2.9.x","fantasy-land":"3.0.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remember-bower":"0.1.x","sanctuary-style":"0.4.x","transcribe":"0.5.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"88d1af05c69d77b31d8be77c5f49acbf68a262b2","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.12.1","_shasum":"22277454b42e4a41e6efef8d841482e7eac89aed","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"22277454b42e4a41e6efef8d841482e7eac89aed","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.12.1.tgz","integrity":"sha512-R3IpTbQc4pZbg9z3fa46AbnS3H52JxjdFB0e2JlLYKSITMyp9mfuF6wfNOvozo7yweuC00xfdKgFfQD/usjqQg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID+e+9ZXyRSaXOmeJUKvJqZ2Fm2gIiDkFgozU3uio7BXAiEA/uzmymZ8PqCqYvpEV5UF488detxT8qZDTDbS+GOe6B0="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/sanctuary-0.12.1.tgz_1487164482098_0.29531605495139956"},"directories":{}},"0.12.2":{"name":"sanctuary","version":"0.12.2","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.9.0","sanctuary-type-classes":"3.0.1","sanctuary-type-identifiers":"1.0.0"},"devDependencies":{"browserify":"13.1.x","doctest":"0.11.x","eslint":"2.9.x","fantasy-land":"3.0.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remember-bower":"0.1.x","sanctuary-style":"0.4.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"0853d0a592233fd602e8167760e33812d1870fa8","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.12.2","_shasum":"70ae648aff04787b403402093caa963b873a4ea5","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"70ae648aff04787b403402093caa963b873a4ea5","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.12.2.tgz","integrity":"sha512-hr5YL2m8oA9/FnaeYVH+L2S7o9d/I4anYXuSAzEVvUTPP+UOoaVyUTGlWREzj7FMBOCgEl2GusHdOxSmU/iGJQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICioi/ojDqkwIOzusA6C9JsMh1oyQ5oEedG+HTEe757IAiB+r2ASZfhQAAcJSbo7EYNZSrXtsHgGJkvC7kOkUcEKRQ=="}]},"maintainers":[{"name":"davidchambers","email":"dc@davidchambers.me"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/sanctuary-0.12.2.tgz_1488129050995_0.6341007952578366"},"directories":{}},"0.13.0":{"name":"sanctuary","version":"0.13.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.12.0","sanctuary-type-classes":"6.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"13.1.x","doctest":"0.12.x","eslint":"3.19.x","fantasy-land":"3.3.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remark-cli":"3.x.x","remark-lint-no-undefined-references":"1.x.x","remark-lint-no-unused-definitions":"1.x.x","remember-bower":"0.1.x","sanctuary-style":"0.5.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"7a4aeace93b0ea753490aec0fc6bce1028546684","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.13.0","_shasum":"2e3e24579d707a469a365b632e88b97ade48294f","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"2e3e24579d707a469a365b632e88b97ade48294f","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.13.0.tgz","integrity":"sha512-YKB9rD1Kmlfr+NraI9kvTCbbIcpqs1rthkLeDZ/ZEE51zq8ER3ML41nZ1Bsu0eOgUw2dNmOO4HdpcGOYbCIDxg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICiZ0isdm5v4mvXfjXLT6s1hhgwDU6y7esGVYbsH88KTAiA1KlTxeYh5csVzE9/yq1tctRQRBtTMgEyEPWAJy5tyHg=="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary-0.13.0.tgz_1496245126197_0.12823050026781857"},"directories":{}},"0.13.1":{"name":"sanctuary","version":"0.13.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.12.0","sanctuary-type-classes":"6.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"13.1.x","doctest":"0.12.x","eslint":"3.19.x","fantasy-land":"3.3.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remark-cli":"3.x.x","remark-lint-no-undefined-references":"1.x.x","remark-lint-no-unused-definitions":"1.x.x","remember-bower":"0.1.x","sanctuary-style":"0.5.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"1d29853baf460bd512a6fdc53b2d215959e6c943","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.13.1","_shasum":"b63d1f76a09daa4897d988dc526883ebba18a767","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"b63d1f76a09daa4897d988dc526883ebba18a767","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.13.1.tgz","integrity":"sha512-KapB+8pIStnKqDsy1TyVSkAqSIJwQc806KuU44vUhAQhkEvKbPoFF0tsKzHGp4C5qGi24A29DdgK91mqtio/WQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAh9X+py6fKtJ/mnvKnUc9fhBfxrodV5NjcO5YMeRuYjAiEAs+97CfSu3Q5R36TJCNFnrG9m8FiC6Fe/M7Hw5+FeGTw="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary-0.13.1.tgz_1496256416923_0.20590351079590619"},"directories":{}},"0.13.2":{"name":"sanctuary","version":"0.13.2","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.12.1","sanctuary-type-classes":"6.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"13.1.x","doctest":"0.12.x","eslint":"3.19.x","fantasy-land":"3.3.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remark-cli":"3.x.x","remark-lint-no-undefined-references":"1.x.x","remark-lint-no-unused-definitions":"1.x.x","remember-bower":"0.1.x","sanctuary-style":"0.5.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"d6c6a2cf7fab790c60545e649269a5cf5f8e0799","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.13.2","_shasum":"ed1c9c2f2b1745d659ee3457954c8b1154f8d4a8","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.5.0","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"shasum":"ed1c9c2f2b1745d659ee3457954c8b1154f8d4a8","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.13.2.tgz","integrity":"sha512-qRyvZ25ANG2kIO7blYe/ImjaL0bp/Jy03HrzSwf6k3nh5TaeCXYvPk/HwEYU8lS2yVjp0Bds+uOsAx+1FsvVDA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzCbJyA5NM+2/39trAw8a8hc7h2mUz1fX2i6N7PFMbhQIgWRn0ZTravW43/m8tkIw5frKgoLkWJdE7GRpiZRGbJO8="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary-0.13.2.tgz_1496800223363_0.4959515284281224"},"directories":{}},"0.14.0":{"name":"sanctuary","version":"0.14.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.14.0","sanctuary-type-classes":"7.1.1","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"13.1.x","doctest":"0.12.x","eslint":"4.9.x","fantasy-land":"3.4.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remark-cli":"3.x.x","remark-lint-no-undefined-references":"1.x.x","remark-lint-no-unused-definitions":"1.x.x","remember-bower":"0.1.x","sanctuary-style":"1.0.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"8a8e7e7af5b32a7f33a0f1b9b7a258696e42a851","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.14.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-5P40fFkMtMJ0nq8ZEes2qNNakZetRpWdhw1k9wgGmfR93Hmvt3YbKHPzBfMFMo1i9RfdiYB0Bxutp0Msx8zXhA==","shasum":"1f1b37348c7fc3351c66990d103b923c9d3bf51f","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.14.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIHpX8h3rJb22SjVvftH8iy053MdOsh7hxDK9SFxu/QRUAh9FNbvh2/80qJn8m0wMOK/KUX+BlEBqlua82etnyq/F"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary-0.14.0.tgz_1513634971343_0.17195444949902594"},"directories":{}},"0.14.1":{"name":"sanctuary","version":"0.14.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"test":"make lint test"},"dependencies":{"sanctuary-def":"0.14.0","sanctuary-type-classes":"7.1.1","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"13.1.x","doctest":"0.13.x","eslint":"4.9.x","fantasy-land":"3.4.0","istanbul":"0.4.x","jsverify":"0.7.x","karma":"1.3.x","karma-browserify":"5.1.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.1.x","mocha":"3.x.x","remark-cli":"3.x.x","remark-lint-no-undefined-references":"1.x.x","remark-lint-no-unused-definitions":"1.x.x","remember-bower":"0.1.x","sanctuary-style":"1.0.x","transcribe":"1.0.x","xyz":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"6e9fc9fffe10e61f61a7e778522f1042886b1958","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.14.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-+oWyyObmQUVzx99YdVj4XGKRWGXWYGZM/R/HEO6VtiSZuJ5FpmPa9HHw9NYYk1Gru5Bgu2IB/mlR+vj8IisxNw==","shasum":"3bf7613ec79ad28e5997b2901992e5992d3a047b","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.14.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+WrafUYTdCGrSxsLehU3UvuRFjXUnU8ZNbjqwe1iwIAIhAPG7T2ZmNSSUFXUbMYrQZ9Izi07D1r0dmGGJ22E7fHRA"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary-0.14.1.tgz_1513989472775_0.32613559160381556"},"directories":{}},"0.15.0":{"name":"sanctuary","version":"0.15.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.18.1","sanctuary-either":"1.0.0","sanctuary-maybe":"1.0.0","sanctuary-pair":"1.0.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"9.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"16.2.x","fantasy-land":"3.5.0","fantasy-laws":"1.1.x","jsverify":"0.8.x","karma":"2.0.x","karma-browserify":"5.2.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.2.x","sanctuary-descending":"1.0.0","sanctuary-identity":"1.0.x","sanctuary-scripts":"2.0.x"},"files":["/LICENSE","/README.md","/index.js","/package.json"],"gitHead":"36a052df57b4672b21941b8a658701462a7489ba","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.15.0","_npmVersion":"5.6.0","_nodeVersion":"8.11.1","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-cyrFHazodEFlv6qVX/+qujO+jly2MXRMyNXR61jaqJG42JlCJnKpgQGvebYINaiRUbZ+P5Dr2Ai3Tg+vzNYCUw==","shasum":"a4b9bf7a43bad928dce3e7aa590fbf30681b9ebd","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.15.0.tgz","fileCount":4,"unpackedSize":233303,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFUSvCRA9TVsSAnZWagAA3R8P/02Eod/JKXRvu0F99c+Q\ntSScG/BN8t3Hk2Jh3zkh1W+IwfV40KZLA+wsDPE5p7D2coWhzy/PkZfYwoMf\nJ32RhODRvQLj5ZBs04gQQoznEvX9/WocWQIaQCkYWtS5Ya9fAw1d5wIrQmI4\nb7B3hXCJFaB0rThZhdzkayk1t4Ntba6iJ7kgPBm8mFrr3yJdxn30QCfHpsv/\nLFcuo1msNVik8Qqgw6zKz13/D7r2KmB0yQ8trs399D3mzb5ZeRp84Df2VMOq\nEdmamDu/dUZEdHWMLgFqTM1jeyGOF1+6MTVXwf1/WVRNdtf/7cqu+f2WYqBH\nU8920R1mQLMamZS2p4DcDTa0sXtiTB/9s6TFeY8Mht5E34EpDCR7FOxJEIhB\nqFcQU7hZAjWjCs33vHQJPB/m98WC3AX7lLKYyAg81mDYl+ydrDEDoAJfA6YM\nf+QQY0HdCOsOhKaAZ4WAKIbHQedFAShE1UHCXk4Yxm3OjB5MNHO5m9lPnF3n\n6U+uM5NXxaXK3vyTx5L/g4cUD+bFgckUwplVlknm5jSeolInSRamRI7JJFjL\n45xGJUEOk15XS3YvvmDv8YxJnf1zbHgffcErUxMTaX8OF0K4YGTA7kK8GA+t\nEA+1X68lU+WAkFzHGOtXoNR4qvVUExFAeulm+lWfXwQ5QY8jwxtiPDTh8Zfo\nT7xl\r\n=zvng\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzYvWfRmghLOA8y84SpKzP+Cvr5Ld4xO6+ZTJuteJ2+AIgCrr8rlSrwdwQduE0cccVwGYuwZC9EDNxxa+ZdgCDAuU="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_0.15.0_1528120493081_0.6450570813681786"},"_hasShrinkwrap":false},"0.15.1":{"name":"sanctuary","version":"0.15.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.18.1","sanctuary-either":"1.0.0","sanctuary-maybe":"1.0.0","sanctuary-pair":"1.0.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"9.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"browserify":"16.2.x","fantasy-land":"3.5.0","fantasy-laws":"1.1.x","jsverify":"0.8.x","karma":"2.0.x","karma-browserify":"5.2.x","karma-mocha":"1.3.x","karma-sauce-launcher":"1.2.x","sanctuary-descending":"1.0.0","sanctuary-identity":"1.0.x","sanctuary-scripts":"2.0.x"},"gitHead":"69cd5c94aa9399c9153450afc7e99489df3b672f","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@0.15.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-guMq+RqXcABprELHRJJF0iHaqb1ErUkbyYN5KviAeQ2OM3WvaDz1GoKWQyj+lHUrprbMXCiJjrk3QVfiSeAERg==","shasum":"c5f0efdc28f8698af63615ae02b052fa902def22","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-0.15.1.tgz","fileCount":4,"unpackedSize":234406,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcaSKbCRA9TVsSAnZWagAAt6sP/jIINMUquXeVP+b0eDbd\n9606dBoE1VuiMmFJWyGGpY3uM1tl/5QVoRzmx2Fd5/kie3avY7HvW3J/A+F9\njE9oBWE/owJ6L7nLY8a7enAxLbGEiMwY0LjNEFwMB5Wgc7tnL0Fu53QatCXf\ntOMsQLx0mwj/P5M5JqkHrbVS2C3NrqsbirB4c/LhJI8Jc0Yo9sSCCvRjdApu\nVxUtj4p3iizlirRq2a0wzmWVLPeUERGzNRsEXMhb4sYU5KlwB8BBBn8kpxeK\nr90+F4y4mcdVz5SHibo+mUZ/Ehpq+rbSM/9bmYOskJX1zPhot0ZH2tvvthGu\nuTb2nbUme+ZsWclpg2N6qiwPl9uRYTf2HI+kXS6TJ3PV9J8Uo9tizXML24s+\nk77NLm50WKW7kYMgSXfU6zFhIVu69AdOKGl+TUZqDJhf3y0Pped3+LWx5Zcc\nWptVQXyVvBYnNJb8OW9mc+j4mjzWZNQ3Pmep0Iq7vtCdQH1T6iQyu3XV7SBq\n3OkeCTa5Oe5PyWuWHu0JxTiqIs6TYGwtEKnxtkv+kl3HCqX7Z+p0ezi/7mmi\n+YeVcrZkTvt6sMvINMlabIKLCh/rJRzSmcWEA2htYOTp6gd/iN66vzlb/vXe\nziMuPKNuOkhZfElbSrkJJ3RFtdFdUe9t2zHWr97+BeCynAUT6COH4u9tuZxv\nG0xk\r\n=l84N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCku/nDp70AbqTsOYz1U9wASOEL62GPgISaO4XSFhrrFwIgEXJhKdcLbHCwpip8ZIKTBmflBFMqjTQUuk/NHSkYw1w="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_0.15.1_1550394010231_0.6702837518140894"},"_hasShrinkwrap":false},"1.0.0":{"name":"sanctuary","version":"1.0.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.19.0","sanctuary-either":"1.1.0","sanctuary-maybe":"1.1.0","sanctuary-pair":"1.1.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"10.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"1.1.0","sanctuary-identity":"1.1.x","sanctuary-scripts":"3.0.x"},"gitHead":"c928ab12ed49ddab51bd408bc1367ed6f7e6d7bc","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@1.0.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-H+C80DadljM0gyWe5Y3R8bDIDW8MU8/XBg0h0V2zwusmljRAVrBQshd6XU3zFxk+lHj04e9xoUvBscRfl8vO8g==","shasum":"ecddfd453290b4e269fdc4bb8314e3c25febc79d","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-1.0.0.tgz","fileCount":4,"unpackedSize":242067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchEVNCRA9TVsSAnZWagAAwJgP/RGFyePVH0I9y97mfAVp\n8m5NrxYzK0eELOMk4nGhvi+HIqNu+KGmsSqthKfyiEe7WIfQdy6GpWWswHfP\n+PKfuUUx71kOCoIw/kiJu8exlvzDqR+K6bKEXR60dq726kITKwanNXS2HQGP\nR8VWowlVRwWOVX3gm7qfN3jEUfEZadFSofbASxWFCV9VD7a1Jj5+TZzDvqNo\n/atI2I9LDNp6xZS0EhWVK4I4X8jZQ/ROUmSdk6rPRRilT3qzs2aShW/DM3Ma\nfSEUyJlo3LNBs43EY+jtjzmXFMXYHTqeHmAR48M5p77+zdKA8fVUBnnV6zi/\nWItDnrDqvFXpQOQSc8E0oaJiz2mBlptKtbyZVAeP6+44mOXn//+CHBZk/4kR\nuHcf9YWZT+8AaORt/wqyb2sbDxik8Ai/ho6TQJn3aVWnQMTyj5gtTqCav7IB\nMxSHoUXeIspfGHVp4l3nu9GYTfDCrBZYJH3aShawKR2OWjjE2lVZbIDfuVSe\nhHq3vgva/aTx2UmQNOCjxphWfwi8Mm4uJKXmPt2pmi9KuS9eQ65usygG5BRR\nave7Ki0awPI4kqnRsZTZs9q4tLu+AQKQ9mRtPFwl4zc32tnEC2/QHfdu2gro\nmfh4AEkz7115+OT0oKDutUbbuw+pMwwaMGgCMnhMX/mojqGIMSO3xseQ22cx\ncFO5\r\n=cPHT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkCR9vZTKxMjI4rip9RUL05om2u3v22go/NaxhLjFUwwIhALkmmueTuzoRdy3ZNH5v1lQEgJkXoiylPEWzOy+5S+Bb"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_1.0.0_1552172364659_0.3673005640649827"},"_hasShrinkwrap":false},"1.1.0":{"name":"sanctuary","version":"1.1.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.19.0","sanctuary-either":"1.1.0","sanctuary-maybe":"1.1.0","sanctuary-pair":"1.1.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"10.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"1.1.0","sanctuary-identity":"1.1.x","sanctuary-scripts":"3.2.x"},"gitHead":"5d82380af8ebece210d432f8fc155fbe318057ea","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@1.1.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-GnZoSJ0tlNneowz+shFYLd1+wQ0g9bR3TeBbDi0rwEdpspu6mQPxEghskJrGww2rBNjyPclEL5pzNC0oCUYHAQ==","shasum":"b1e66dd0746377e89bfd1ec0916e010e3f4dc4d3","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-1.1.0.tgz","fileCount":4,"unpackedSize":246669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcp0a0CRA9TVsSAnZWagAAEwgQAINROdciUuWi7XStnYVx\nb1XlB5nn3ex0O/rpf3ZvoWx5kbtrIIYcv3yRiSzKdvHriVLzYnV8WFeZDCji\nLsmwWS2GtNwaFAgra4yEZ2kglefbAIjoiOJFLz5ipOmUIHHzlttu7S9ABURm\n6bZ6vq7wcyAclnJB2HkBwhhqQlcGY872h39NzbEpJhg5ZB1wdtxjW2STPYmJ\nhph9C7oQfjUNsux3z0kdXnuQt+pyNou9L7Sx0/dsE49BizdWoG0/4+C0NfBA\n0ozV8OY9vikLM6AnQFBGIx94o6pPT5Nrb/BC5vCXQ2kRxIU9uspH4AWKkKgA\nT7vM0PpavbyegNvIq23udbs0reXsnIeqkvFN00XM6ViW76AAq29BdBXcFXVu\n+uWYdpIjIomuHESVdFYYr7yaxme1/6iADOiGxglEFtvF+gSWaYRBDqxvxH6l\n+BCCCsdV9IJBv5ed3fr1LT1TxTox2yC4LEvSCZY9kc7JtcK0ODbZsc27PVQx\n/FJE6nMsC0e/zW75cxaoq1GcZ32ifY9Rr2nVWDfPgW53HtIdstumgtXKhVdl\nE4/Dboy8rdhxMXYSlVXN+l7UctghONhHQmKtF9Qz8n5X871h1DM/4J6DF6Vh\n51O4vnRcBPBmb3rVImRnDLM8RsS7pdf0Wlmb0G5EXUYMymRZi1btk1fq/66g\nsqh3\r\n=LhaN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHX9kx3ekRne2g9nMVfaxUsp/c5Dw9EWi25vZnFEONOLAiBqTXiw91FwFXndzcHKBHFGxEFl2NyKRwMAPh4Twk5cOA=="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_1.1.0_1554466482993_0.5513269932077494"},"_hasShrinkwrap":false},"2.0.0":{"name":"sanctuary","version":"2.0.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.20.0","sanctuary-either":"1.2.0","sanctuary-maybe":"1.2.0","sanctuary-pair":"1.2.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"11.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"1.2.0","sanctuary-identity":"1.2.x","sanctuary-scripts":"3.2.x"},"gitHead":"b4617e887f78952cc94644d8a1babb60a62caa88","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@2.0.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"dist":{"integrity":"sha512-FYjhCKBS7meY4Lrjsx7CL+2+qnCsgUqJUvFYoLU7ahiGM8LqTOkhAtdGZGG+bhCIP0iCEfDWRq35pQJTfmtFrg==","shasum":"71c2e8af7cfe034ece2c7a932232ba917a03dd0f","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-2.0.0.tgz","fileCount":4,"unpackedSize":231743,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcxLVMCRA9TVsSAnZWagAAGroP/11vfSiSqvKPNfgp4QHR\n2OcjwwNgMPYO187WBQbLCZyntzSP5l5EN98HeKpuMsh9ZdQHwfr9PHE3rzby\np792haADg0KsbZ/vXrvp314CF+AID+0S79zJtLnrgt4BE+LJevjJ7iM25M6h\naTEx6+XFZrG9sIUjQIgr2eBa1rOVI4mZCYgyeT9vsrBTVOaecRniKl1O797H\nvj7v/iQC/1Cl0bzxcDYmPDDmds38xrLpihyCf/LIkcybfiS3VfMfIIuLzsA0\nxpeDE7oirAhO4t5/bMNVNGYLLoIbwU+zV9yLKsWzvar6WhYrG9ah5WYPFk/d\nnRGgyGG3VokU3OkJd8z/nNkXG1lShE8EJc+zG1goirXYGZjFudjGGerbde8v\n3RVweudTdCmMQmYv71dynIOUx63NiS2hkr9h6gHy1MgEvavxcrUv2SGDczcK\nO70PO6LbIHtldVZrwlGRHlYnbRKpjAf4BcrL/iO70DyBVhgZPUHyuaolVqXN\nHQpffPHmBcV8DaFmNeH/xqf8iGSQdStr9gX6O3bNvxC7lBMd9iyhaL1Ryfoc\nlQckZhUKeoXDNQj7Y/zNdEgz0VCPfDmbiA4i+QApW0HXpN5EZ/f4ocC0tSb/\nAGqm9aJYgr6P0ikbYh1FF/JpDzfqo9NOVxbyEoangqBCBXVg5J5XdIpU6/4d\nvDok\r\n=aIBz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDAFIQtW0jCLhsa2QRHMZAQXAELEmscSouXmQanYqkoBAiBs0Ufjrg5TjnQAwIlywYCg41l3KFPpiyOO8KtdqMmfzA=="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_2.0.0_1556395339593_0.2392415245383357"},"_hasShrinkwrap":false},"2.0.1":{"name":"sanctuary","version":"2.0.1","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.20.1","sanctuary-either":"1.2.0","sanctuary-maybe":"1.2.0","sanctuary-pair":"1.2.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"11.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"1.2.0","sanctuary-identity":"1.2.x","sanctuary-scripts":"3.2.x"},"gitHead":"89ff7f20f1441ad1ca2bbf55c60fbb305e2fd10b","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@2.0.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-CQWjFRzSYrq8g16RCdfV4v1iJwyRRw3dhLizA/rKkKSu1L+5tTlBjQuZl25mKSd4S5oLdVTIJ1RlVktvns9R9g==","shasum":"cf19548bb8df2f52c9367faf8f7a7a4cf52af0ee","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-2.0.1.tgz","fileCount":4,"unpackedSize":231776,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvyCyCRA9TVsSAnZWagAAskEP/i4BU9Nd7zj1RWNvIjgE\naif4etGqRZ0Z7wABlQPBT3u3SSpjRLbbwkgIhgb691htPcYiRpfnRhV8nax/\nLgDn8nMpctknjHVcUBez/ARYN5LsIKiQ6zoxs4Wlui6xZFAfWR0rB5bEB/LP\nnFm7hIoSi2TDvAYAl1EAZSvgP9mqHoFT5pAyuLrK8ZzEdiWlRlIsPtWlFHee\nibMjvDW/RfoHMH6zMEAqCXGQrHCII+dqAtorp+ycrjLF6GxbxtUqw6D2ryhg\nms9Kmrgo6DEk3/sHksf5V3HxMHeg7wqX0Bmg4g+RSCmTBogCU2NViSKpB36I\ndpwSIZ4vhwBKhYKWe3dEBdgEmaKXeuC5gjYHJGkfvQcxiLuS+pw1DO4YPSzZ\nFv3BhXwsSQia41YhkD6/w/IPe8wWA6AccFnbE3ZTjvIjTAa0vgyWoNiNAsZN\n2+ijQJWeq5ll7/Q9TwXcTtNK/McPMVe/17Ekbe5XVf0YUlA/p13pEqvgr7sH\nyqZDB2yYOwf1GODe/8oa2/wS4qqxfF5dY2dg3N/L6cBt6LBobCmORfvmE2yH\ntirUBDZ8cuJB1v8VhbJ91FqEyHJoW9Zd33HwUsCzwG3w/kGiyyOc2yH5Mu0h\n/M1mlu4QkX5U1sQZtaGtX/6Zy0bsjjl/8u7ceIeJQIiyWr4BXybqrJrIbZZl\n+Uzb\r\n=Oi2n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7SiY8nwlAmXSCjkGq+lv/fGMevF1DTZG9Hr36BxTPMQIhANskdJihi4d0xLXv/LvXAvkfxsZmpTW+LcHWBNOLffPk"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_2.0.1_1572806833517_0.8932577013713194"},"_hasShrinkwrap":false},"2.0.2":{"name":"sanctuary","version":"2.0.2","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.20.1","sanctuary-either":"1.2.0","sanctuary-maybe":"1.2.0","sanctuary-pair":"1.2.0","sanctuary-show":"1.0.0","sanctuary-type-classes":"11.0.0","sanctuary-type-identifiers":"2.0.1"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"1.2.0","sanctuary-identity":"1.2.x","sanctuary-scripts":"4.0.x"},"gitHead":"85064b4fcbc63abd246104de9a0b5aad22a1b304","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@2.0.2","_nodeVersion":"12.14.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-KoXg2Q2Pzz4cn0MMn2V9HX5/RPatIzMkjlYHVtx3mhL09k3joNJlBGatwh8sCxF6m0liFvaN89JaM0VPWw/qAg==","shasum":"4fa3707ed639b0e21588a0ae332846cc6ff300cd","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-2.0.2.tgz","fileCount":4,"unpackedSize":233129,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHN/3CRA9TVsSAnZWagAA/vUQAJUm3m+YhVusvIKq2YDc\nQ8qXhogHzovN12uxlU8BppK8XS3ZQfm9LtZD7GYbwSlhVfPXUNO6lwgPVh6K\nRFCzeeXhX2mchKOGEa7KDGm3DbI1yfvu9klIhtrF5/ScTbw9A+/VfPTJ7K9q\n0fTKQ8RehyA3YZFtDWENMQ6zVFOj52wQqqmcn645u0NHi0V/7Sm7Ug8fwGhb\nUmVgDX0PRaBJM7dpXvyJNuGeOva6y93BcyGQVhXIJosa9PK4QtQuv1nPhRJQ\niVmsTH9iK5RIfEKSlCyy+g9OzFnNVnUMPPjcmRs1UWwUaGrXXEQrdZlgemhP\n9Ey1mbb0ks1UgiJjI6JJYKi7rIq9TPNkSfRt/NiGFpXDWBC1w2k8MMIixAtv\nmeIvdY4zlJuNBekoAoWStkbMwVjIoTox9ON3V1nY6OYVjwaGX0MhF26LJomO\niBxlR9VtV4pLRh9mkPAw++/dmahRR6W3PH7ChY7YIKCiQNTxZKJTwpf4VqTU\nQvO6XPVU7aEyVxVmXwNKWywUNQ3e5y6i4u0ar23ECcQzsplNI6OWKpDPAI5c\n8INfppit8IALPnQA1465jy69cnVud0tiFDkC1hdGxJBfTu3ttr4l596ctZSS\nsk3eQxrAwRtoc/BMtIHYrH1vax5rmLOlmyT3eGRJUsC9K1t3mhEUBDOqaYb6\nZnqZ\r\n=3jJD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzSAOIHwNY0AWHa5QRFKx4NBpZi3+fEbuF9VgTwJkU1AIhAN+p8R2QK8D00uND3AXUUUFLH7S0YQaIEp4To8WgGqqp"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_2.0.2_1578950646784_0.9302182742457494"},"_hasShrinkwrap":false},"3.0.0":{"name":"sanctuary","version":"3.0.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.21.1","sanctuary-either":"2.1.0","sanctuary-maybe":"2.1.0","sanctuary-pair":"2.1.0","sanctuary-show":"2.0.0","sanctuary-type-classes":"12.1.0","sanctuary-type-identifiers":"3.0.0"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"2.1.0","sanctuary-identity":"2.1.0","sanctuary-scripts":"4.0.x"},"gitHead":"3047999feac7079cda35888ea79854d4be49f909","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@3.0.0","_nodeVersion":"12.14.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-SUenKFdibPWHXT398gIGoBTY2RHcSf8lHwU8TuDDUtE+U8wXMhrRCLqQDbBLGf0mi//zS52e6LGfNVR1z3Zb7w==","shasum":"7ef7ae42cf682af524c0e2bd0a2e0723e0988692","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-3.0.0.tgz","fileCount":4,"unpackedSize":235151,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJN5qCRA9TVsSAnZWagAAdLEP/juybTlH9L48zcvaohWx\nlsd2hqG0Sx4WCehya5bjqIpSp2TftoeXwX2Kg9kTdgC96vMO3D8PAG8eGBdp\nO5cRTa08wTmUdvsirIyxQZfT9J6orGODxdd7C6Firnip4WRnbkUM8e8Gzu1k\n5BkYIsLPRuq2tQxnHGc1bM3SEjWAfW2rj56S3drA3fZA7f/i+z7tyFpk4eKc\nfUhtE6IxYwUvKdOOrJP6SrWO9rVLuTAQlKShMoRb5nqsSwpdlWauNg7fl7gD\n0Onjattx3cLmO+k695Hc3447PR33wtv+aPie+CduXTYwR+FaqsibuIbY8HKy\n6UXLSZ6xrrmZNen1FCQ5UfU1ocUt7LMdXRoPRVFNoeo0K9XALJni2LroNwPu\nN/6KB4+C1+7f5Zu85M6Azb4ntOiHmMTt1r6tkAgdyZnOvj4FBsjIoxFaN4SL\nZ2rUOkgucmF+lnRhC0YD6HUtSQpPCG7IMFXx4Ylck6ykjwJ3sAgtr4I2pNdx\npSKdeCA0ZGUpNHNAFDxFIB1D9bwItzJCx8GRh/0A8xPebAoPYQ4cdu2Z/Loh\nVvZUigFy3B8/ReZGT8/wR/HnFpKrBHB/GMDsASHaMSG1oIoHmF3U6xBMvb4H\nTAAz0fiAgfrHm5W8nUla24qHeGs28VL4iqZC1Y1JL0zN3KYJ9/1/A1ABXUIU\nAK0A\r\n=RTUB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbTs6XYYs+tvjBjzd0opfWydn9Vu1lhPntwKkfKZOpDQIhAM38iYlz86yrDI89jEAiWOA/sgovyU2KPoig4ap68INg"}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_3.0.0_1579474538101_0.7793013411996006"},"_hasShrinkwrap":false},"3.1.0":{"name":"sanctuary","version":"3.1.0","description":"Refuge from unsafe JavaScript","license":"MIT","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"scripts":{"doctest":"sanctuary-doctest","lint":"sanctuary-lint","release":"sanctuary-release","test":"npm run lint && sanctuary-test && npm run doctest"},"dependencies":{"sanctuary-def":"0.22.0","sanctuary-either":"2.1.0","sanctuary-maybe":"2.1.0","sanctuary-pair":"2.1.0","sanctuary-show":"2.0.0","sanctuary-type-classes":"12.1.0","sanctuary-type-identifiers":"3.0.0"},"devDependencies":{"fantasy-land":"4.0.1","jsverify":"0.8.x","sanctuary-descending":"2.1.0","sanctuary-identity":"2.1.0","sanctuary-scripts":"4.0.x"},"gitHead":"71f138cbe02382f9b3f46bdd387919cfa8bc2f39","bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","_id":"sanctuary@3.1.0","_nodeVersion":"12.14.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-yTpWmslb5Q2jXcHYeIfCzJksIpe3pngBaFBDpjdPXONWyVSB3hBVDZZ8EmitohaMZqjLB+JREeEL0YOVtdxILA==","shasum":"2a03f02483eb9a22013130ae9ed7d2f9d432a542","tarball":"https://registry.npmjs.org/sanctuary/-/sanctuary-3.1.0.tgz","fileCount":4,"unpackedSize":238497,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfL9LSCRA9TVsSAnZWagAAdrAP/A61/+oKKpJKOCQpfMrm\n8I0puFjFHxPrpw4FyAmjeiOqmK+VH3MRYoNLpYLuzLb4cP9GkIm9eCSWJE/x\nOw0dloNs1J14RHkPWFnkiW1EQJiOG1KfB4oGk8F+bK5pFr8SSdSI8mNbs38/\nDFhwqiyomB9KHUKVnWZk/ZqUPny26Nj2b7F3pQSsZBttLLJ4k1kdi6puTyxK\n8NRd5Wol6yge1985wXluNDKeb6S2/BnF2Cn7RLQIGPkActu96sV3ppjDlD2K\nY+GCXFa7yd6XpW/D3IwHG86l/dMa/U7DmJXal2M0g39tNYbtfqthUGyTsCQt\n/Bd9ddFvn1g9hjXmXIuqAZLDDe5xZ5Za9RZe7/VO2IRr6/17bjovIyko37LO\nOhfvu1COfehjB/dPq2+6zN9xO+iz9DDULePZk567GAje08Eynt43078pWoec\nNURa2pngX4gyiWTvnDZ7UE5Rh9kt8TDK+DJVtYMSk0QAmBsMvAn/UcAZC94X\nh0FOGiZBICwIftXGBdP6svxLdApKTYRtz1nV+is+6CLzkWOJ9dnFOUpq0ban\n4kcyhtocYs6GGYFY1hq5bU14JZLm4bdXnDLtExZJsCzyM5Mdvu13EIYYQ/u4\nbOohzaP+IsOrx7+S1XuenqqLI67R2iPNckktD7YTw4jPL9WpQjv3lsvnZixW\nZ24K\r\n=0jMq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGD1frUU2ank+LrSZOEX7Dn1Ldbi3SRzIAMvsNuIXMxJAiAWBUqGLjhCus2hfvB9gnyaL0TzJlSR7/pgMz4LmTKHvw=="}]},"maintainers":[{"name":"avaq","email":"aldwin.vlasblom@gmail.com"},{"name":"bperez","email":"ben@plaid.com"},{"name":"davidchambers","email":"dc@davidchambers.me"},{"name":"gabejohnson","email":"gijohnson105@gmail.com"},{"name":"jaforbes","email":"james.a.forbes@gmail.com"},{"name":"joneshf","email":"jones3.hardy@gmail.com"},{"name":"kedashoe","email":"kwallace@gmail.com"},{"name":"rjmk","email":"rafekennedy@gmail.com"},{"name":"safareli","email":"i.safareli@gmail.com"},{"name":"scott-christopher","email":"schristopher@konputa.com"},{"name":"shard","email":"mark@afrotoss.com"},{"name":"svozza","email":"svozza@gmail.com"}],"_npmUser":{"name":"davidchambers","email":"dc@davidchambers.me"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sanctuary_3.1.0_1596969682230_0.6046947690905526"},"_hasShrinkwrap":false}},"readme":"# <span id=\"section:sanctuary\">❑ Sanctuary</span>\n\n[![npm](https://img.shields.io/npm/v/sanctuary.svg)](https://www.npmjs.com/package/sanctuary)\n[![CircleCI](https://img.shields.io/circleci/project/github/sanctuary-js/sanctuary/master.svg)](https://circleci.com/gh/sanctuary-js/sanctuary/tree/master)\n[![Gitter](https://img.shields.io/gitter/room/badges/shields.svg)](https://gitter.im/sanctuary-js/sanctuary)\n\nSanctuary is a JavaScript functional programming library inspired by\n[Haskell][] and [PureScript][]. It's stricter than [Ramda][], and\nprovides a similar suite of functions.\n\nSanctuary promotes programs composed of simple, pure functions. Such\nprograms are easier to comprehend, test, and maintain &ndash; they are\nalso a pleasure to write.\n\nSanctuary provides two data types, [Maybe][] and [Either][], both of\nwhich are compatible with [Fantasy Land][]. Thanks to these data types\neven Sanctuary functions that may fail, such as [`head`](#head), are\ncomposable.\n\nSanctuary makes it possible to write safe code without null checks.\nIn JavaScript it's trivial to introduce a possible run-time type error:\n\n    words[0].toUpperCase()\n\nIf `words` is `[]` we'll get a familiar error at run-time:\n\n    TypeError: Cannot read property 'toUpperCase' of undefined\n\nSanctuary gives us a fighting chance of avoiding such errors. We might\nwrite:\n\n    S.map (S.toUpper) (S.head (words))\n\nSanctuary is designed to work in Node.js and in ES5-compatible browsers.\n\n## <span id=\"section:folktale\">❑ Folktale</span>\n\n[Folktale][], like Sanctuary, is a standard library for functional\nprogramming in JavaScript. It is well designed and well documented.\nWhereas Sanctuary treats JavaScript as a member of the ML language\nfamily, Folktale embraces JavaScript's object-oriented programming\nmodel. Programming with Folktale resembles programming with Scala.\n\n## <span id=\"section:ramda\">❑ Ramda</span>\n\n[Ramda][] provides several functions that return problematic values\nsuch as `undefined`, `Infinity`, or `NaN` when applied to unsuitable\ninputs. These are known as [partial functions][]. Partial functions\nnecessitate the use of guards or null checks. In order to safely use\n`R.head`, for example, one must ensure that the array is non-empty:\n\n    if (R.isEmpty (xs)) {\n      // ...\n    } else {\n      return f (R.head (xs));\n    }\n\nUsing the Maybe type renders such guards (and null checks) unnecessary.\nChanging functions such as `R.head` to return Maybe values was proposed\nin [ramda/ramda#683][], but was considered too much of a stretch for\nJavaScript programmers. Sanctuary was released the following month,\nin January 2015, as a companion library to Ramda.\n\nIn addition to broadening in scope in the years since its release,\nSanctuary's philosophy has diverged from Ramda's in several respects.\n\n### <span id=\"section:totality\">❑ Totality</span>\n\nEvery Sanctuary function is defined for every value that is a member of\nthe function's input type. Such functions are known as [total functions][].\nRamda, on the other hand, contains a number of [partial functions][].\n\n### <span id=\"section:information-preservation\">❑ Information preservation</span>\n\nCertain Sanctuary functions preserve more information than their Ramda\ncounterparts. Examples:\n\n    |> R.tail ([])                      |> S.tail ([])\n    []                                  Nothing\n\n    |> R.tail (['foo'])                 |> S.tail (['foo'])\n    []                                  Just ([])\n\n    |> R.replace (/^x/) ('') ('abc')    |> S.stripPrefix ('x') ('abc')\n    'abc'                               Nothing\n\n    |> R.replace (/^x/) ('') ('xabc')   |> S.stripPrefix ('x') ('xabc')\n    'abc'                               Just ('abc')\n\n### <span id=\"section:invariants\">❑ Invariants</span>\n\nSanctuary performs rigorous [type checking][] of inputs and outputs, and\nthrows a descriptive error if a type error is encountered. This allows bugs\nto be caught and fixed early in the development cycle.\n\nRamda operates on the [garbage in, garbage out][GIGO] principle. Functions\nare documented to take arguments of particular types, but these invariants\nare not enforced. The problem with this approach in a language as\npermissive as JavaScript is that there's no guarantee that garbage input\nwill produce garbage output ([ramda/ramda#1413][]). Ramda performs ad hoc\ntype checking in some such cases ([ramda/ramda#1419][]).\n\nSanctuary can be configured to operate in garbage in, garbage out mode.\nRamda cannot be configured to enforce its invariants.\n\n### <span id=\"section:currying\">❑ Currying</span>\n\nSanctuary functions are curried. There is, for example, exactly one way to\napply `S.reduce` to `S.add`, `0`, and `xs`:\n\n  - `S.reduce (S.add) (0) (xs)`\n\nRamda functions are also curried, but in a complex manner. There are four\nways to apply `R.reduce` to `R.add`, `0`, and `xs`:\n\n  - `R.reduce (R.add) (0) (xs)`\n  - `R.reduce (R.add) (0, xs)`\n  - `R.reduce (R.add, 0) (xs)`\n  - `R.reduce (R.add, 0, xs)`\n\nRamda supports all these forms because curried functions enable partial\napplication, one of the library's tenets, but `f(x)(y)(z)` is considered\ntoo unfamiliar and too unattractive to appeal to JavaScript programmers.\n\nSanctuary's developers prefer a simple, unfamiliar construct to a complex,\nfamiliar one. Familiarity can be acquired; complexity is intrinsic.\n\nThe lack of breathing room in `f(x)(y)(z)` impairs readability. The simple\nsolution to this problem, proposed in [#438][], is to include a space when\napplying a function: `f (x) (y) (z)`.\n\nRamda also provides a special placeholder value, [`R.__`][], that removes\nthe restriction that a function must be applied to its arguments in order.\nThe following expressions are equivalent:\n\n  - `R.reduce (R.__, 0, xs) (R.add)`\n  - `R.reduce (R.add, R.__, xs) (0)`\n  - `R.reduce (R.__, 0) (R.add) (xs)`\n  - `R.reduce (R.__, 0) (R.add, xs)`\n  - `R.reduce (R.__, R.__, xs) (R.add) (0)`\n  - `R.reduce (R.__, R.__, xs) (R.add, 0)`\n\n### <span id=\"section:variadic-functions\">❑ Variadic functions</span>\n\nRamda provides several functions that take any number of arguments. These\nare known as [variadic functions][]. Additionally, Ramda provides several\nfunctions that take variadic functions as arguments. Although natural in\na dynamically typed language, variadic functions are at odds with the type\nnotation Ramda and Sanctuary both use, leading to some indecipherable type\nsignatures such as this one:\n\n    R.lift :: (*... -> *...) -> ([*]... -> [*])\n\nSanctuary has no variadic functions, nor any functions that take variadic\nfunctions as arguments. Sanctuary provides two \"lift\" functions, each with\na helpful type signature:\n\n    S.lift2 :: Apply f => (a -> b -> c) -> f a -> f b -> f c\n    S.lift3 :: Apply f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d\n\n### <span id=\"section:implicit-context\">❑ Implicit context</span>\n\nRamda provides [`R.bind`][] and [`R.invoker`][] for working with methods.\nAdditionally, many Ramda functions use `Function#call` or `Function#apply`\nto preserve context. Sanctuary makes no allowances for `this`.\n\n### <span id=\"section:transducers\">❑ Transducers</span>\n\nSeveral Ramda functions act as transducers. Sanctuary provides no support\nfor transducers.\n\n### <span id=\"section:modularity\">❑ Modularity</span>\n\nWhereas Ramda has no dependencies, Sanctuary has a modular design:\n[sanctuary-def][] provides type checking, [sanctuary-type-classes][]\nprovides Fantasy Land functions and type classes, [sanctuary-show][]\nprovides string representations, and algebraic data types are provided\nby [sanctuary-either][], [sanctuary-maybe][], and [sanctuary-pair][].\nNot only does this approach reduce the complexity of Sanctuary itself,\nbut it allows these components to be reused in other contexts.\n\n## <span id=\"section:types\">❑ Types</span>\n\nSanctuary uses Haskell-like type signatures to describe the types of\nvalues, including functions. `'foo'`, for example, is a member of `String`;\n`[1, 2, 3]` is a member of `Array Number`. The double colon (`::`) is used\nto mean \"is a member of\", so one could write:\n\n    'foo' :: String\n    [1, 2, 3] :: Array Number\n\nAn identifier may appear to the left of the double colon:\n\n    Math.PI :: Number\n\nThe arrow (`->`) is used to express a function's type:\n\n    Math.abs :: Number -> Number\n\nThat states that `Math.abs` is a unary function that takes an argument\nof type `Number` and returns a value of type `Number`.\n\nSome functions are parametrically polymorphic: their types are not fixed.\nType variables are used in the representations of such functions:\n\n    S.I :: a -> a\n\n`a` is a type variable. Type variables are not capitalized, so they\nare differentiable from type identifiers (which are always capitalized).\nBy convention type variables have single-character names. The signature\nabove states that `S.I` takes a value of any type and returns a value of\nthe same type. Some signatures feature multiple type variables:\n\n    S.K :: a -> b -> a\n\nIt must be possible to replace all occurrences of `a` with a concrete type.\nThe same applies for each other type variable. For the function above, the\ntypes with which `a` and `b` are replaced may be different, but needn't be.\n\nSince all Sanctuary functions are curried (they accept their arguments\none at a time), a binary function is represented as a unary function that\nreturns a unary function: `* -> * -> *`. This aligns neatly with Haskell,\nwhich uses curried functions exclusively. In JavaScript, though, we may\nwish to represent the types of functions with arities less than or greater\nthan one. The general form is `(<input-types>) -> <output-type>`, where\n`<input-types>` comprises zero or more comma–space (<code>, </code>)\n-separated type representations:\n\n  - `() -> String`\n  - `(a, b) -> a`\n  - `(a, b, c) -> d`\n\n`Number -> Number` can thus be seen as shorthand for `(Number) -> Number`.\n\nSanctuary embraces types. JavaScript doesn't support algebraic data types,\nbut these can be simulated by providing a group of data constructors that\nreturn values with the same set of methods. A value of the Either type, for\nexample, is created via the Left constructor or the Right constructor.\n\nIt's necessary to extend Haskell's notation to describe implicit arguments\nto the *methods* provided by Sanctuary's types. In `x.map(y)`, for example,\nthe `map` method takes an implicit argument `x` in addition to the explicit\nargument `y`. The type of the value upon which a method is invoked appears\nat the beginning of the signature, separated from the arguments and return\nvalue by a squiggly arrow (`~>`). The type of the `fantasy-land/map` method\nof the Maybe type is written `Maybe a ~> (a -> b) -> Maybe b`. One could\nread this as:\n\n_When the `fantasy-land/map` method is invoked on a value of type `Maybe a`\n(for any type `a`) with an argument of type `a -> b` (for any type `b`),\nit returns a value of type `Maybe b`._\n\nThe squiggly arrow is also used when representing non-function properties.\n`Maybe a ~> Boolean`, for example, represents a Boolean property of a value\nof type `Maybe a`.\n\nSanctuary supports type classes: constraints on type variables. Whereas\n`a -> a` implicitly supports every type, `Functor f => (a -> b) -> f a ->\nf b` requires that `f` be a type that satisfies the requirements of the\nFunctor type class. Type-class constraints appear at the beginning of a\ntype signature, separated from the rest of the signature by a fat arrow\n(`=>`).\n\n## <span id=\"section:type-checking\">❑ Type checking</span>\n\nSanctuary functions are defined via [sanctuary-def][] to provide run-time\ntype checking. This is tremendously useful during development: type errors\nare reported immediately, avoiding circuitous stack traces (at best) and\nsilent failures due to type coercion (at worst). For example:\n\n```javascript\nS.add (2) (true);\n// ! TypeError: Invalid value\n//\n//   add :: FiniteNumber -> FiniteNumber -> FiniteNumber\n//                          ^^^^^^^^^^^^\n//                               1\n//\n//   1)  true :: Boolean\n//\n//   The value at position 1 is not a member of ‘FiniteNumber’.\n//\n//   See https://github.com/sanctuary-js/sanctuary-def/tree/v0.22.0#FiniteNumber for information about the FiniteNumber type.\n```\n\nCompare this to the behaviour of Ramda's unchecked equivalent:\n\n```javascript\nR.add (2) (true);\n// => 3\n```\n\nThere is a performance cost to run-time type checking. Type checking is\ndisabled by default if `process.env.NODE_ENV` is `'production'`. If this\nrule is unsuitable for a given program, one may use [`create`](#create)\nto create a Sanctuary module based on a different rule. For example:\n\n```javascript\nconst S = sanctuary.create ({\n  checkTypes: localStorage.getItem ('SANCTUARY_CHECK_TYPES') === 'true',\n  env: sanctuary.env,\n});\n```\n\nOccasionally one may wish to perform an operation that is not type safe,\nsuch as mapping over an object with heterogeneous values. This is possible\nvia selective use of [`unchecked`](#unchecked) functions.\n\n## <span id=\"section:installation\">❑ Installation</span>\n\n`npm install sanctuary` will install Sanctuary for use in Node.js.\n\nTo add Sanctuary to a website, add the following `<script>` element,\nreplacing `X.Y.Z` with a version number greater than or equal to `2.0.2`:\n\n```html\n<script src=\"https://cdn.jsdelivr.net/gh/sanctuary-js/sanctuary@X.Y.Z/dist/bundle.js\"></script>\n```\n\nOptionally, define aliases for various modules:\n\n```javascript\nconst S = window.sanctuary;\nconst $ = window.sanctuaryDef;\n// ...\n```\n\n## <span id=\"section:api\">❑ API</span>\n\n### <span id=\"section:configure\">❑ Configure</span>\n\n#### <a name=\"create\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L506\">`create :: { checkTypes :: Boolean, env :: Array Type } -⁠> Module`</a>\n\nTakes an options record and returns a Sanctuary module. `checkTypes`\nspecifies whether to enable type checking. The module's polymorphic\nfunctions (such as [`I`](#I)) require each value associated with a\ntype variable to be a member of at least one type in the environment.\n\nA well-typed application of a Sanctuary function will produce the same\nresult regardless of whether type checking is enabled. If type checking\nis enabled, a badly typed application will produce an exception with a\ndescriptive error message.\n\nThe following snippet demonstrates defining a custom type and using\n`create` to produce a Sanctuary module that is aware of that type:\n\n```javascript\nconst {create, env} = require ('sanctuary');\nconst $ = require ('sanctuary-def');\nconst type = require ('sanctuary-type-identifiers');\n\n//    Identity :: a -> Identity a\nconst Identity = x => {\n  const identity = Object.create (Identity$prototype);\n  identity.value = x;\n  return identity;\n};\n\n//    identityTypeIdent :: String\nconst identityTypeIdent = 'my-package/Identity@1';\n\nconst Identity$prototype = {\n  '@@type': identityTypeIdent,\n  '@@show': function() { return `Identity (${S.show (this.value)})`; },\n  'fantasy-land/map': function(f) { return Identity (f (this.value)); },\n};\n\n//    IdentityType :: Type -> Type\nconst IdentityType = $.UnaryType\n  ('Identity')\n  ('http://example.com/my-package#Identity')\n  ([])\n  (x => type (x) === identityTypeIdent)\n  (identity => [identity.value]);\n\nconst S = create ({\n  checkTypes: process.env.NODE_ENV !== 'production',\n  env: env.concat ([IdentityType ($.Unknown)]),\n});\n\nS.map (S.sub (1)) (Identity (43));\n// => Identity (42)\n```\n\nSee also [`env`](#env).\n\n#### <a name=\"env\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L582\">`env :: Array Type`</a>\n\nThe Sanctuary module's environment (`(S.create ({checkTypes, env})).env`\nis a reference to `env`). Useful in conjunction with [`create`](#create).\n\n```javascript\n> S.env\n[ $.AnyFunction,\n. $.Arguments,\n. $.Array ($.Unknown),\n. $.Array2 ($.Unknown) ($.Unknown),\n. $.Boolean,\n. $.Buffer,\n. $.Date,\n. $.Descending ($.Unknown),\n. $.Either ($.Unknown) ($.Unknown),\n. $.Error,\n. $.Fn ($.Unknown) ($.Unknown),\n. $.HtmlElement,\n. $.Identity ($.Unknown),\n. $.JsMap ($.Unknown) ($.Unknown),\n. $.JsSet ($.Unknown),\n. $.Maybe ($.Unknown),\n. $.Module,\n. $.Null,\n. $.Number,\n. $.Object,\n. $.Pair ($.Unknown) ($.Unknown),\n. $.RegExp,\n. $.StrMap ($.Unknown),\n. $.String,\n. $.Symbol,\n. $.Type,\n. $.TypeClass,\n. $.Undefined ]\n```\n\n#### <a name=\"unchecked\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L619\">`unchecked :: Module`</a>\n\nA complete Sanctuary module that performs no type checking. This is\nuseful as it permits operations that Sanctuary's type checking would\ndisallow, such as mapping over an object with heterogeneous values.\n\nSee also [`create`](#create).\n\n```javascript\n> S.unchecked.map (S.show) ({x: 'foo', y: true, z: 42})\n{x: '\"foo\"', y: 'true', z: '42'}\n```\n\nOpting out of type checking may cause type errors to go unnoticed.\n\n```javascript\n> S.unchecked.add (2) ('2')\n'22'\n```\n\n### <span id=\"section:classify\">❑ Classify</span>\n\n#### <a name=\"type\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L641\">`type :: Any -⁠> { namespace :: Maybe String, name :: String, version :: NonNegativeInteger }`</a>\n\nReturns the result of parsing the [type identifier][] of the given value.\n\n```javascript\n> S.type (S.Just (42))\n{namespace: Just ('sanctuary-maybe'), name: 'Maybe', version: 1}\n\n> S.type ([1, 2, 3])\n{namespace: Nothing, name: 'Array', version: 0}\n```\n\n#### <a name=\"is\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L666\">`is :: Type -⁠> Any -⁠> Boolean`</a>\n\nReturns `true` [iff][] the given value is a member of the specified type.\nSee [`$.test`][] for details.\n\n```javascript\n> S.is ($.Array ($.Integer)) ([1, 2, 3])\ntrue\n\n> S.is ($.Array ($.Integer)) ([1, 2, 3.14])\nfalse\n```\n\n### <span id=\"section:showable\">❑ Showable</span>\n\n#### <a name=\"show\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L681\">`show :: Any -⁠> String`</a>\n\nAlias of [`show`][].\n\n```javascript\n> S.show (-0)\n'-0'\n\n> S.show (['foo', 'bar', 'baz'])\n'[\"foo\", \"bar\", \"baz\"]'\n\n> S.show ({x: 1, y: 2, z: 3})\n'{\"x\": 1, \"y\": 2, \"z\": 3}'\n\n> S.show (S.Left (S.Right (S.Just (S.Nothing))))\n'Left (Right (Just (Nothing)))'\n```\n\n### <span id=\"section:fantasy-land\">❑ Fantasy Land</span>\n\nSanctuary is compatible with the [Fantasy Land][] specification.\n\n#### <a name=\"equals\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L708\">`equals :: Setoid a => a -⁠> a -⁠> Boolean`</a>\n\nCurried version of [`Z.equals`][] that requires two arguments of the\nsame type.\n\nTo compare values of different types first use [`create`](#create) to\ncreate a Sanctuary module with type checking disabled, then use that\nmodule's `equals` function.\n\n```javascript\n> S.equals (0) (-0)\ntrue\n\n> S.equals (NaN) (NaN)\ntrue\n\n> S.equals (S.Just ([1, 2, 3])) (S.Just ([1, 2, 3]))\ntrue\n\n> S.equals (S.Just ([1, 2, 3])) (S.Just ([1, 2, 4]))\nfalse\n```\n\n#### <a name=\"lt\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L741\">`lt :: Ord a => a -⁠> a -⁠> Boolean`</a>\n\nReturns `true` [iff][] the *second* argument is less than the first\naccording to [`Z.lt`][].\n\n```javascript\n> S.filter (S.lt (3)) ([1, 2, 3, 4, 5])\n[1, 2]\n```\n\n#### <a name=\"lte\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L761\">`lte :: Ord a => a -⁠> a -⁠> Boolean`</a>\n\nReturns `true` [iff][] the *second* argument is less than or equal to\nthe first according to [`Z.lte`][].\n\n```javascript\n> S.filter (S.lte (3)) ([1, 2, 3, 4, 5])\n[1, 2, 3]\n```\n\n#### <a name=\"gt\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L781\">`gt :: Ord a => a -⁠> a -⁠> Boolean`</a>\n\nReturns `true` [iff][] the *second* argument is greater than the first\naccording to [`Z.gt`][].\n\n```javascript\n> S.filter (S.gt (3)) ([1, 2, 3, 4, 5])\n[4, 5]\n```\n\n#### <a name=\"gte\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L801\">`gte :: Ord a => a -⁠> a -⁠> Boolean`</a>\n\nReturns `true` [iff][] the *second* argument is greater than or equal\nto the first according to [`Z.gte`][].\n\n```javascript\n> S.filter (S.gte (3)) ([1, 2, 3, 4, 5])\n[3, 4, 5]\n```\n\n#### <a name=\"min\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L821\">`min :: Ord a => a -⁠> a -⁠> a`</a>\n\nReturns the smaller of its two arguments (according to [`Z.lte`][]).\n\nSee also [`max`](#max).\n\n```javascript\n> S.min (10) (2)\n2\n\n> S.min (new Date ('1999-12-31')) (new Date ('2000-01-01'))\nnew Date ('1999-12-31')\n\n> S.min ('10') ('2')\n'10'\n```\n\n#### <a name=\"max\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L843\">`max :: Ord a => a -⁠> a -⁠> a`</a>\n\nReturns the larger of its two arguments (according to [`Z.lte`][]).\n\nSee also [`min`](#min).\n\n```javascript\n> S.max (10) (2)\n10\n\n> S.max (new Date ('1999-12-31')) (new Date ('2000-01-01'))\nnew Date ('2000-01-01')\n\n> S.max ('10') ('2')\n'2'\n```\n\n#### <a name=\"clamp\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L865\">`clamp :: Ord a => a -⁠> a -⁠> a -⁠> a`</a>\n\nTakes a lower bound, an upper bound, and a value of the same type.\nReturns the value if it is within the bounds; the nearer bound otherwise.\n\nSee also [`min`](#min) and [`max`](#max).\n\n```javascript\n> S.clamp (0) (100) (42)\n42\n\n> S.clamp (0) (100) (-1)\n0\n\n> S.clamp ('A') ('Z') ('~')\n'Z'\n```\n\n#### <a name=\"id\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L888\">`id :: Category c => TypeRep c -⁠> c`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.id`][].\n\n```javascript\n> S.id (Function) (42)\n42\n```\n\n#### <a name=\"concat\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L902\">`concat :: Semigroup a => a -⁠> a -⁠> a`</a>\n\nCurried version of [`Z.concat`][].\n\n```javascript\n> S.concat ('abc') ('def')\n'abcdef'\n\n> S.concat ([1, 2, 3]) ([4, 5, 6])\n[1, 2, 3, 4, 5, 6]\n\n> S.concat ({x: 1, y: 2}) ({y: 3, z: 4})\n{x: 1, y: 3, z: 4}\n\n> S.concat (S.Just ([1, 2, 3])) (S.Just ([4, 5, 6]))\nJust ([1, 2, 3, 4, 5, 6])\n\n> S.concat (Sum (18)) (Sum (24))\nSum (42)\n```\n\n#### <a name=\"empty\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L928\">`empty :: Monoid a => TypeRep a -⁠> a`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.empty`][].\n\n```javascript\n> S.empty (String)\n''\n\n> S.empty (Array)\n[]\n\n> S.empty (Object)\n{}\n\n> S.empty (Sum)\nSum (0)\n```\n\n#### <a name=\"invert\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L951\">`invert :: Group g => g -⁠> g`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.invert`][].\n\n```javascript\n> S.invert (Sum (5))\nSum (-5)\n```\n\n#### <a name=\"filter\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L965\">`filter :: Filterable f => (a -⁠> Boolean) -⁠> f a -⁠> f a`</a>\n\nCurried version of [`Z.filter`][]. Discards every element that does not\nsatisfy the predicate.\n\nSee also [`reject`](#reject).\n\n```javascript\n> S.filter (S.odd) ([1, 2, 3])\n[1, 3]\n\n> S.filter (S.odd) ({x: 1, y: 2, z: 3})\n{x: 1, z: 3}\n\n> S.filter (S.odd) (S.Nothing)\nNothing\n\n> S.filter (S.odd) (S.Just (0))\nNothing\n\n> S.filter (S.odd) (S.Just (1))\nJust (1)\n```\n\n#### <a name=\"reject\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L999\">`reject :: Filterable f => (a -⁠> Boolean) -⁠> f a -⁠> f a`</a>\n\nCurried version of [`Z.reject`][]. Discards every element that satisfies\nthe predicate.\n\nSee also [`filter`](#filter).\n\n```javascript\n> S.reject (S.odd) ([1, 2, 3])\n[2]\n\n> S.reject (S.odd) ({x: 1, y: 2, z: 3})\n{y: 2}\n\n> S.reject (S.odd) (S.Nothing)\nNothing\n\n> S.reject (S.odd) (S.Just (0))\nJust (0)\n\n> S.reject (S.odd) (S.Just (1))\nNothing\n```\n\n#### <a name=\"map\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1033\">`map :: Functor f => (a -⁠> b) -⁠> f a -⁠> f b`</a>\n\nCurried version of [`Z.map`][].\n\n```javascript\n> S.map (Math.sqrt) ([1, 4, 9])\n[1, 2, 3]\n\n> S.map (Math.sqrt) ({x: 1, y: 4, z: 9})\n{x: 1, y: 2, z: 3}\n\n> S.map (Math.sqrt) (S.Just (9))\nJust (3)\n\n> S.map (Math.sqrt) (S.Right (9))\nRight (3)\n\n> S.map (Math.sqrt) (S.Pair (99980001) (99980001))\nPair (99980001) (9999)\n```\n\nReplacing `Functor f => f` with `Function x` produces the B combinator\nfrom combinatory logic (i.e. [`compose`](#compose)):\n\n    Functor f => (a -> b) -> f a -> f b\n    (a -> b) -> Function x a -> Function x b\n    (a -> c) -> Function x a -> Function x c\n    (b -> c) -> Function x b -> Function x c\n    (b -> c) -> Function a b -> Function a c\n    (b -> c) -> (a -> b) -> (a -> c)\n\n```javascript\n> S.map (Math.sqrt) (S.add (1)) (99)\n10\n```\n\n#### <a name=\"flip\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1079\">`flip :: Functor f => f (a -⁠> b) -⁠> a -⁠> f b`</a>\n\nCurried version of [`Z.flip`][]. Maps over the given functions, applying\neach to the given value.\n\nReplacing `Functor f => f` with `Function x` produces the C combinator\nfrom combinatory logic:\n\n    Functor f => f (a -> b) -> a -> f b\n    Function x (a -> b) -> a -> Function x b\n    Function x (a -> c) -> a -> Function x c\n    Function x (b -> c) -> b -> Function x c\n    Function a (b -> c) -> b -> Function a c\n    (a -> b -> c) -> b -> a -> c\n\n```javascript\n> S.flip (S.concat) ('!') ('foo')\n'foo!'\n\n> S.flip ([Math.floor, Math.ceil]) (1.5)\n[1, 2]\n\n> S.flip ({floor: Math.floor, ceil: Math.ceil}) (1.5)\n{floor: 1, ceil: 2}\n\n> S.flip (Cons (Math.floor) (Cons (Math.ceil) (Nil))) (1.5)\nCons (1) (Cons (2) (Nil))\n```\n\n#### <a name=\"bimap\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1118\">`bimap :: Bifunctor f => (a -⁠> b) -⁠> (c -⁠> d) -⁠> f a c -⁠> f b d`</a>\n\nCurried version of [`Z.bimap`][].\n\n```javascript\n> S.bimap (S.toUpper) (Math.sqrt) (S.Pair ('foo') (64))\nPair ('FOO') (8)\n\n> S.bimap (S.toUpper) (Math.sqrt) (S.Left ('foo'))\nLeft ('FOO')\n\n> S.bimap (S.toUpper) (Math.sqrt) (S.Right (64))\nRight (8)\n```\n\n#### <a name=\"mapLeft\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1138\">`mapLeft :: Bifunctor f => (a -⁠> b) -⁠> f a c -⁠> f b c`</a>\n\nCurried version of [`Z.mapLeft`][]. Maps the given function over the left\nside of a Bifunctor.\n\n```javascript\n> S.mapLeft (S.toUpper) (S.Pair ('foo') (64))\nPair ('FOO') (64)\n\n> S.mapLeft (S.toUpper) (S.Left ('foo'))\nLeft ('FOO')\n\n> S.mapLeft (S.toUpper) (S.Right (64))\nRight (64)\n```\n\n#### <a name=\"promap\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1159\">`promap :: Profunctor p => (a -⁠> b) -⁠> (c -⁠> d) -⁠> p b c -⁠> p a d`</a>\n\nCurried version of [`Z.promap`][].\n\n```javascript\n> S.promap (Math.abs) (S.add (1)) (Math.sqrt) (-100)\n11\n```\n\n#### <a name=\"alt\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1173\">`alt :: Alt f => f a -⁠> f a -⁠> f a`</a>\n\nCurried version of [`Z.alt`][] with arguments flipped to facilitate\npartial application.\n\n```javascript\n> S.alt (S.Just ('default')) (S.Nothing)\nJust ('default')\n\n> S.alt (S.Just ('default')) (S.Just ('hello'))\nJust ('hello')\n\n> S.alt (S.Right (0)) (S.Left ('X'))\nRight (0)\n\n> S.alt (S.Right (0)) (S.Right (1))\nRight (1)\n```\n\n#### <a name=\"zero\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1202\">`zero :: Plus f => TypeRep f -⁠> f a`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.zero`][].\n\n```javascript\n> S.zero (Array)\n[]\n\n> S.zero (Object)\n{}\n\n> S.zero (S.Maybe)\nNothing\n```\n\n#### <a name=\"reduce\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1222\">`reduce :: Foldable f => (b -⁠> a -⁠> b) -⁠> b -⁠> f a -⁠> b`</a>\n\nTakes a curried binary function, an initial value, and a [Foldable][],\nand applies the function to the initial value and the Foldable's first\nvalue, then applies the function to the result of the previous\napplication and the Foldable's second value. Repeats this process\nuntil each of the Foldable's values has been used. Returns the initial\nvalue if the Foldable is empty; the result of the final application\notherwise.\n\nSee also [`reduce_`](#reduce_).\n\n```javascript\n> S.reduce (S.add) (0) ([1, 2, 3, 4, 5])\n15\n\n> S.reduce (xs => x => S.prepend (x) (xs)) ([]) ([1, 2, 3, 4, 5])\n[5, 4, 3, 2, 1]\n```\n\n#### <a name=\"reduce_\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1256\">`reduce_ :: Foldable f => (a -⁠> b -⁠> b) -⁠> b -⁠> f a -⁠> b`</a>\n\nVariant of [`reduce`](#reduce) that takes a reducing function with\narguments flipped.\n\n```javascript\n> S.reduce_ (S.append) ([]) (Cons (1) (Cons (2) (Cons (3) (Nil))))\n[1, 2, 3]\n\n> S.reduce_ (S.prepend) ([]) (Cons (1) (Cons (2) (Cons (3) (Nil))))\n[3, 2, 1]\n```\n\n#### <a name=\"traverse\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1274\">`traverse :: (Applicative f, Traversable t) => TypeRep f -⁠> (a -⁠> f b) -⁠> t a -⁠> f (t b)`</a>\n\nCurried version of [`Z.traverse`][].\n\n```javascript\n> S.traverse (Array) (S.words) (S.Just ('foo bar baz'))\n[Just ('foo'), Just ('bar'), Just ('baz')]\n\n> S.traverse (Array) (S.words) (S.Nothing)\n[Nothing]\n\n> S.traverse (S.Maybe) (S.parseInt (16)) (['A', 'B', 'C'])\nJust ([10, 11, 12])\n\n> S.traverse (S.Maybe) (S.parseInt (16)) (['A', 'B', 'C', 'X'])\nNothing\n\n> S.traverse (S.Maybe) (S.parseInt (16)) ({a: 'A', b: 'B', c: 'C'})\nJust ({a: 10, b: 11, c: 12})\n\n> S.traverse (S.Maybe) (S.parseInt (16)) ({a: 'A', b: 'B', c: 'C', x: 'X'})\nNothing\n```\n\n#### <a name=\"sequence\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1303\">`sequence :: (Applicative f, Traversable t) => TypeRep f -⁠> t (f a) -⁠> f (t a)`</a>\n\nCurried version of [`Z.sequence`][]. Inverts the given `t (f a)`\nto produce an `f (t a)`.\n\n```javascript\n> S.sequence (Array) (S.Just ([1, 2, 3]))\n[Just (1), Just (2), Just (3)]\n\n> S.sequence (S.Maybe) ([S.Just (1), S.Just (2), S.Just (3)])\nJust ([1, 2, 3])\n\n> S.sequence (S.Maybe) ([S.Just (1), S.Just (2), S.Nothing])\nNothing\n\n> S.sequence (S.Maybe) ({a: S.Just (1), b: S.Just (2), c: S.Just (3)})\nJust ({a: 1, b: 2, c: 3})\n\n> S.sequence (S.Maybe) ({a: S.Just (1), b: S.Just (2), c: S.Nothing})\nNothing\n```\n\n#### <a name=\"ap\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1330\">`ap :: Apply f => f (a -⁠> b) -⁠> f a -⁠> f b`</a>\n\nCurried version of [`Z.ap`][].\n\n```javascript\n> S.ap ([Math.sqrt, x => x * x]) ([1, 4, 9, 16, 25])\n[1, 2, 3, 4, 5, 1, 16, 81, 256, 625]\n\n> S.ap ({x: Math.sqrt, y: S.add (1), z: S.sub (1)}) ({w: 4, x: 4, y: 4})\n{x: 2, y: 5}\n\n> S.ap (S.Just (Math.sqrt)) (S.Just (64))\nJust (8)\n```\n\nReplacing `Apply f => f` with `Function x` produces the S combinator\nfrom combinatory logic:\n\n    Apply f => f (a -> b) -> f a -> f b\n    Function x (a -> b) -> Function x a -> Function x b\n    Function x (a -> c) -> Function x a -> Function x c\n    Function x (b -> c) -> Function x b -> Function x c\n    Function a (b -> c) -> Function a b -> Function a c\n    (a -> b -> c) -> (a -> b) -> (a -> c)\n\n```javascript\n> S.ap (s => n => s.slice (0, n)) (s => Math.ceil (s.length / 2)) ('Haskell')\n'Hask'\n```\n\n#### <a name=\"lift2\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1365\">`lift2 :: Apply f => (a -⁠> b -⁠> c) -⁠> f a -⁠> f b -⁠> f c`</a>\n\nPromotes a curried binary function to a function that operates on two\n[Apply][]s.\n\n```javascript\n> S.lift2 (S.add) (S.Just (2)) (S.Just (3))\nJust (5)\n\n> S.lift2 (S.add) (S.Just (2)) (S.Nothing)\nNothing\n\n> S.lift2 (S.and) (S.Just (true)) (S.Just (true))\nJust (true)\n\n> S.lift2 (S.and) (S.Just (true)) (S.Just (false))\nJust (false)\n```\n\n#### <a name=\"lift3\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1389\">`lift3 :: Apply f => (a -⁠> b -⁠> c -⁠> d) -⁠> f a -⁠> f b -⁠> f c -⁠> f d`</a>\n\nPromotes a curried ternary function to a function that operates on three\n[Apply][]s.\n\n```javascript\n> S.lift3 (S.reduce) (S.Just (S.add)) (S.Just (0)) (S.Just ([1, 2, 3]))\nJust (6)\n\n> S.lift3 (S.reduce) (S.Just (S.add)) (S.Just (0)) (S.Nothing)\nNothing\n```\n\n#### <a name=\"apFirst\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1407\">`apFirst :: Apply f => f a -⁠> f b -⁠> f a`</a>\n\nCurried version of [`Z.apFirst`][]. Combines two effectful actions,\nkeeping only the result of the first. Equivalent to Haskell's `(<*)`\nfunction.\n\nSee also [`apSecond`](#apSecond).\n\n```javascript\n> S.apFirst ([1, 2]) ([3, 4])\n[1, 1, 2, 2]\n\n> S.apFirst (S.Just (1)) (S.Just (2))\nJust (1)\n```\n\n#### <a name=\"apSecond\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1428\">`apSecond :: Apply f => f a -⁠> f b -⁠> f b`</a>\n\nCurried version of [`Z.apSecond`][]. Combines two effectful actions,\nkeeping only the result of the second. Equivalent to Haskell's `(*>)`\nfunction.\n\nSee also [`apFirst`](#apFirst).\n\n```javascript\n> S.apSecond ([1, 2]) ([3, 4])\n[3, 4, 3, 4]\n\n> S.apSecond (S.Just (1)) (S.Just (2))\nJust (2)\n```\n\n#### <a name=\"of\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1449\">`of :: Applicative f => TypeRep f -⁠> a -⁠> f a`</a>\n\nCurried version of [`Z.of`][].\n\n```javascript\n> S.of (Array) (42)\n[42]\n\n> S.of (Function) (42) (null)\n42\n\n> S.of (S.Maybe) (42)\nJust (42)\n\n> S.of (S.Either) (42)\nRight (42)\n```\n\n#### <a name=\"chain\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1477\">`chain :: Chain m => (a -⁠> m b) -⁠> m a -⁠> m b`</a>\n\nCurried version of [`Z.chain`][].\n\n```javascript\n> S.chain (x => [x, x]) ([1, 2, 3])\n[1, 1, 2, 2, 3, 3]\n\n> S.chain (n => s => s.slice (0, n)) (s => Math.ceil (s.length / 2)) ('slice')\n'sli'\n\n> S.chain (S.parseInt (10)) (S.Just ('123'))\nJust (123)\n\n> S.chain (S.parseInt (10)) (S.Just ('XXX'))\nNothing\n```\n\n#### <a name=\"join\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1500\">`join :: Chain m => m (m a) -⁠> m a`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.join`][].\nRemoves one level of nesting from a nested monadic structure.\n\n```javascript\n> S.join ([[1], [2], [3]])\n[1, 2, 3]\n\n> S.join ([[[1, 2, 3]]])\n[[1, 2, 3]]\n\n> S.join (S.Just (S.Just (1)))\nJust (1)\n\n> S.join (S.Pair ('foo') (S.Pair ('bar') ('baz')))\nPair ('foobar') ('baz')\n```\n\nReplacing `Chain m => m` with `Function x` produces the W combinator\nfrom combinatory logic:\n\n    Chain m => m (m a) -> m a\n    Function x (Function x a) -> Function x a\n    (x -> x -> a) -> (x -> a)\n\n```javascript\n> S.join (S.concat) ('abc')\n'abcabc'\n```\n\n#### <a name=\"chainRec\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1536\">`chainRec :: ChainRec m => TypeRep m -⁠> (a -⁠> m (Either a b)) -⁠> a -⁠> m b`</a>\n\nPerforms a [`chain`](#chain)-like computation with constant stack usage.\nSimilar to [`Z.chainRec`][], but curried and more convenient due to the\nuse of the Either type to indicate completion (via a Right).\n\n```javascript\n> S.chainRec (Array)\n.            (s => s.length === 2 ? S.map (S.Right) ([s + '!', s + '?'])\n.                                 : S.map (S.Left) ([s + 'o', s + 'n']))\n.            ('')\n['oo!', 'oo?', 'on!', 'on?', 'no!', 'no?', 'nn!', 'nn?']\n```\n\n#### <a name=\"extend\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1565\">`extend :: Extend w => (w a -⁠> b) -⁠> w a -⁠> w b`</a>\n\nCurried version of [`Z.extend`][].\n\n```javascript\n> S.extend (S.joinWith ('')) (['x', 'y', 'z'])\n['xyz', 'yz', 'z']\n\n> S.extend (f => f ([3, 4])) (S.reverse) ([1, 2])\n[4, 3, 2, 1]\n```\n\n#### <a name=\"duplicate\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1582\">`duplicate :: Extend w => w a -⁠> w (w a)`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.duplicate`][].\nAdds one level of nesting to a comonadic structure.\n\n```javascript\n> S.duplicate (S.Just (1))\nJust (Just (1))\n\n> S.duplicate ([1])\n[[1]]\n\n> S.duplicate ([1, 2, 3])\n[[1, 2, 3], [2, 3], [3]]\n\n> S.duplicate (S.reverse) ([1, 2]) ([3, 4])\n[4, 3, 2, 1]\n```\n\n#### <a name=\"extract\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1606\">`extract :: Comonad w => w a -⁠> a`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.extract`][].\n\n```javascript\n> S.extract (S.Pair ('foo') ('bar'))\n'bar'\n```\n\n#### <a name=\"contramap\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1620\">`contramap :: Contravariant f => (b -⁠> a) -⁠> f a -⁠> f b`</a>\n\n[Type-safe][sanctuary-def] version of [`Z.contramap`][].\n\n```javascript\n> S.contramap (s => s.length) (Math.sqrt) ('Sanctuary')\n3\n```\n\n### <span id=\"section:combinator\">❑ Combinator</span>\n\n#### <a name=\"I\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1636\">`I :: a -⁠> a`</a>\n\nThe I combinator. Returns its argument. Equivalent to Haskell's `id`\nfunction.\n\n```javascript\n> S.I ('foo')\n'foo'\n```\n\n#### <a name=\"K\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1654\">`K :: a -⁠> b -⁠> a`</a>\n\nThe K combinator. Takes two values and returns the first. Equivalent to\nHaskell's `const` function.\n\n```javascript\n> S.K ('foo') ('bar')\n'foo'\n\n> S.map (S.K (42)) (S.range (0) (5))\n[42, 42, 42, 42, 42]\n```\n\n#### <a name=\"T\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1677\">`T :: a -⁠> (a -⁠> b) -⁠> b`</a>\n\nThe T ([thrush][]) combinator. Takes a value and a function, and returns\nthe result of applying the function to the value. Equivalent to Haskell's\n`(&)` function.\n\n```javascript\n> S.T (42) (S.add (1))\n43\n\n> S.map (S.T (100)) ([S.add (1), Math.sqrt])\n[101, 10]\n```\n\n### <span id=\"section:function\">❑ Function</span>\n\n#### <a name=\"curry2\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1703\">`curry2 :: ((a, b) -⁠> c) -⁠> a -⁠> b -⁠> c`</a>\n\nCurries the given binary function.\n\n```javascript\n> S.map (S.curry2 (Math.pow) (10)) ([1, 2, 3])\n[10, 100, 1000]\n```\n\n#### <a name=\"curry3\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1724\">`curry3 :: ((a, b, c) -⁠> d) -⁠> a -⁠> b -⁠> c -⁠> d`</a>\n\nCurries the given ternary function.\n\n```javascript\n> const replaceString = S.curry3 ((what, replacement, string) =>\n.   string.replace (what, replacement)\n. )\n\n> replaceString ('banana') ('orange') ('banana icecream')\n'orange icecream'\n```\n\n#### <a name=\"curry4\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1751\">`curry4 :: ((a, b, c, d) -⁠> e) -⁠> a -⁠> b -⁠> c -⁠> d -⁠> e`</a>\n\nCurries the given quaternary function.\n\n```javascript\n> const createRect = S.curry4 ((x, y, width, height) =>\n.   ({x, y, width, height})\n. )\n\n> createRect (0) (0) (10) (10)\n{x: 0, y: 0, width: 10, height: 10}\n```\n\n#### <a name=\"curry5\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1780\">`curry5 :: ((a, b, c, d, e) -⁠> f) -⁠> a -⁠> b -⁠> c -⁠> d -⁠> e -⁠> f`</a>\n\nCurries the given quinary function.\n\n```javascript\n> const toUrl = S.curry5 ((protocol, creds, hostname, port, pathname) =>\n.   protocol + '//' +\n.   S.maybe ('') (S.flip (S.concat) ('@')) (creds) +\n.   hostname +\n.   S.maybe ('') (S.concat (':')) (port) +\n.   pathname\n. )\n\n> toUrl ('https:') (S.Nothing) ('example.com') (S.Just ('443')) ('/foo/bar')\n'https://example.com:443/foo/bar'\n```\n\n### <span id=\"section:composition\">❑ Composition</span>\n\n#### <a name=\"compose\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1817\">`compose :: Semigroupoid s => s b c -⁠> s a b -⁠> s a c`</a>\n\nCurried version of [`Z.compose`][].\n\nWhen specialized to Function, `compose` composes two unary functions,\nfrom right to left (this is the B combinator from combinatory logic).\n\nThe generalized type signature indicates that `compose` is compatible\nwith any [Semigroupoid][].\n\nSee also [`pipe`](#pipe).\n\n```javascript\n> S.compose (Math.sqrt) (S.add (1)) (99)\n10\n```\n\n#### <a name=\"pipe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1839\">`pipe :: Foldable f => f (Any -⁠> Any) -⁠> a -⁠> b`</a>\n\nTakes a sequence of functions assumed to be unary and a value of any\ntype, and returns the result of applying the sequence of transformations\nto the initial value.\n\nIn general terms, `pipe` performs left-to-right composition of a sequence\nof functions. `pipe ([f, g, h]) (x)` is equivalent to `h (g (f (x)))`.\n\n```javascript\n> S.pipe ([S.add (1), Math.sqrt, S.sub (1)]) (99)\n9\n```\n\n#### <a name=\"pipeK\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1863\">`pipeK :: (Foldable f, Chain m) => f (Any -⁠> m Any) -⁠> m a -⁠> m b`</a>\n\nTakes a sequence of functions assumed to be unary that return values\nwith a [Chain][], and a value of that Chain, and returns the result\nof applying the sequence of transformations to the initial value.\n\nIn general terms, `pipeK` performs left-to-right [Kleisli][] composition\nof an sequence of functions. `pipeK ([f, g, h]) (x)` is equivalent to\n`chain (h) (chain (g) (chain (f) (x)))`.\n\n```javascript\n> S.pipeK ([S.tail, S.tail, S.head]) (S.Just ([1, 2, 3, 4]))\nJust (3)\n```\n\n#### <a name=\"on\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1888\">`on :: (b -⁠> b -⁠> c) -⁠> (a -⁠> b) -⁠> a -⁠> a -⁠> c`</a>\n\nTakes a binary function `f`, a unary function `g`, and two\nvalues `x` and `y`. Returns `f (g (x)) (g (y))`.\n\nThis is the P combinator from combinatory logic.\n\n```javascript\n> S.on (S.concat) (S.reverse) ([1, 2, 3]) ([4, 5, 6])\n[3, 2, 1, 6, 5, 4]\n```\n\n### <span id=\"section:pair\">❑ Pair</span>\n\nPair is the canonical product type: a value of type `Pair a b` always\ncontains exactly two values: one of type `a`; one of type `b`.\n\nThe implementation is provided by [sanctuary-pair][].\n\n#### <a name=\"Pair\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1921\">`Pair :: a -⁠> b -⁠> Pair a b`</a>\n\nPair's sole data constructor. Additionally, it serves as the\nPair [type representative][].\n\n```javascript\n> S.Pair ('foo') (42)\nPair ('foo') (42)\n```\n\n#### <a name=\"pair\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1936\">`pair :: (a -⁠> b -⁠> c) -⁠> Pair a b -⁠> c`</a>\n\nCase analysis for the `Pair a b` type.\n\n```javascript\n> S.pair (S.concat) (S.Pair ('foo') ('bar'))\n'foobar'\n```\n\n#### <a name=\"fst\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1955\">`fst :: Pair a b -⁠> a`</a>\n\n`fst (Pair (x) (y))` is equivalent to `x`.\n\n```javascript\n> S.fst (S.Pair ('foo') (42))\n'foo'\n```\n\n#### <a name=\"snd\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1969\">`snd :: Pair a b -⁠> b`</a>\n\n`snd (Pair (x) (y))` is equivalent to `y`.\n\n```javascript\n> S.snd (S.Pair ('foo') (42))\n42\n```\n\n#### <a name=\"swap\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L1983\">`swap :: Pair a b -⁠> Pair b a`</a>\n\n`swap (Pair (x) (y))` is equivalent to `Pair (y) (x)`.\n\n```javascript\n> S.swap (S.Pair ('foo') (42))\nPair (42) ('foo')\n```\n\n### <span id=\"section:maybe\">❑ Maybe</span>\n\nThe Maybe type represents optional values: a value of type `Maybe a` is\neither Nothing (the empty value) or a Just whose value is of type `a`.\n\nThe implementation is provided by [sanctuary-maybe][].\n\n#### <a name=\"Maybe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2004\">`Maybe :: TypeRep Maybe`</a>\n\nMaybe [type representative][].\n\n#### <a name=\"Nothing\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2008\">`Nothing :: Maybe a`</a>\n\nThe empty value of type `Maybe a`.\n\n```javascript\n> S.Nothing\nNothing\n```\n\n#### <a name=\"Just\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2017\">`Just :: a -⁠> Maybe a`</a>\n\nConstructs a value of type `Maybe a` from a value of type `a`.\n\n```javascript\n> S.Just (42)\nJust (42)\n```\n\n#### <a name=\"isNothing\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2031\">`isNothing :: Maybe a -⁠> Boolean`</a>\n\nReturns `true` if the given Maybe is Nothing; `false` if it is a Just.\n\n```javascript\n> S.isNothing (S.Nothing)\ntrue\n\n> S.isNothing (S.Just (42))\nfalse\n```\n\n#### <a name=\"isJust\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2051\">`isJust :: Maybe a -⁠> Boolean`</a>\n\nReturns `true` if the given Maybe is a Just; `false` if it is Nothing.\n\n```javascript\n> S.isJust (S.Just (42))\ntrue\n\n> S.isJust (S.Nothing)\nfalse\n```\n\n#### <a name=\"maybe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2071\">`maybe :: b -⁠> (a -⁠> b) -⁠> Maybe a -⁠> b`</a>\n\nTakes a value of any type, a function, and a Maybe. If the Maybe is\na Just, the return value is the result of applying the function to\nthe Just's value. Otherwise, the first argument is returned.\n\nSee also [`maybe_`](#maybe_) and [`fromMaybe`](#fromMaybe).\n\n```javascript\n> S.maybe (0) (S.prop ('length')) (S.Just ('refuge'))\n6\n\n> S.maybe (0) (S.prop ('length')) (S.Nothing)\n0\n```\n\n#### <a name=\"maybe_\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2099\">`maybe_ :: (() -⁠> b) -⁠> (a -⁠> b) -⁠> Maybe a -⁠> b`</a>\n\nVariant of [`maybe`](#maybe) that takes a thunk so the default value\nis only computed if required.\n\n```javascript\n> function fib(n) { return n <= 1 ? n : fib (n - 2) + fib (n - 1); }\n\n> S.maybe_ (() => fib (30)) (Math.sqrt) (S.Just (1000000))\n1000\n\n> S.maybe_ (() => fib (30)) (Math.sqrt) (S.Nothing)\n832040\n```\n\n#### <a name=\"fromMaybe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2126\">`fromMaybe :: a -⁠> Maybe a -⁠> a`</a>\n\nTakes a default value and a Maybe, and returns the Maybe's value\nif the Maybe is a Just; the default value otherwise.\n\nSee also [`maybe`](#maybe), [`fromMaybe_`](#fromMaybe_), and\n[`maybeToNullable`](#maybeToNullable).\n\n```javascript\n> S.fromMaybe (0) (S.Just (42))\n42\n\n> S.fromMaybe (0) (S.Nothing)\n0\n```\n\n#### <a name=\"fromMaybe_\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2147\">`fromMaybe_ :: (() -⁠> a) -⁠> Maybe a -⁠> a`</a>\n\nVariant of [`fromMaybe`](#fromMaybe) that takes a thunk so the default\nvalue is only computed if required.\n\n```javascript\n> function fib(n) { return n <= 1 ? n : fib (n - 2) + fib (n - 1); }\n\n> S.fromMaybe_ (() => fib (30)) (S.Just (1000000))\n1000000\n\n> S.fromMaybe_ (() => fib (30)) (S.Nothing)\n832040\n```\n\n#### <a name=\"justs\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2167\">`justs :: (Filterable f, Functor f) => f (Maybe a) -⁠> f a`</a>\n\nDiscards each element that is Nothing, and unwraps each element that is\na Just. Related to Haskell's `catMaybes` function.\n\nSee also [`lefts`](#lefts) and [`rights`](#rights).\n\n```javascript\n> S.justs ([S.Just ('foo'), S.Nothing, S.Just ('baz')])\n['foo', 'baz']\n```\n\n#### <a name=\"mapMaybe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2187\">`mapMaybe :: (Filterable f, Functor f) => (a -⁠> Maybe b) -⁠> f a -⁠> f b`</a>\n\nTakes a function and a structure, applies the function to each element\nof the structure, and returns the \"successful\" results. If the result of\napplying the function to an element is Nothing, the result is discarded;\nif the result is a Just, the Just's value is included.\n\n```javascript\n> S.mapMaybe (S.head) ([[], [1, 2, 3], [], [4, 5, 6], []])\n[1, 4]\n\n> S.mapMaybe (S.head) ({x: [1, 2, 3], y: [], z: [4, 5, 6]})\n{x: 1, z: 4}\n```\n\n#### <a name=\"maybeToNullable\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2207\">`maybeToNullable :: Maybe a -⁠> Nullable a`</a>\n\nReturns the given Maybe's value if the Maybe is a Just; `null` otherwise.\n[Nullable][] is defined in [sanctuary-def][].\n\nSee also [`fromMaybe`](#fromMaybe).\n\n```javascript\n> S.maybeToNullable (S.Just (42))\n42\n\n> S.maybeToNullable (S.Nothing)\nnull\n```\n\n#### <a name=\"maybeToEither\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2230\">`maybeToEither :: a -⁠> Maybe b -⁠> Either a b`</a>\n\nConverts a Maybe to an Either. Nothing becomes a Left (containing the\nfirst argument); a Just becomes a Right.\n\nSee also [`eitherToMaybe`](#eitherToMaybe).\n\n```javascript\n> S.maybeToEither ('Expecting an integer') (S.parseInt (10) ('xyz'))\nLeft ('Expecting an integer')\n\n> S.maybeToEither ('Expecting an integer') (S.parseInt (10) ('42'))\nRight (42)\n```\n\n### <span id=\"section:either\">❑ Either</span>\n\nThe Either type represents values with two possibilities: a value of type\n`Either a b` is either a Left whose value is of type `a` or a Right whose\nvalue is of type `b`.\n\nThe implementation is provided by [sanctuary-either][].\n\n#### <a name=\"Either\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2261\">`Either :: TypeRep Either`</a>\n\nEither [type representative][].\n\n#### <a name=\"Left\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2265\">`Left :: a -⁠> Either a b`</a>\n\nConstructs a value of type `Either a b` from a value of type `a`.\n\n```javascript\n> S.Left ('Cannot divide by zero')\nLeft ('Cannot divide by zero')\n```\n\n#### <a name=\"Right\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2279\">`Right :: b -⁠> Either a b`</a>\n\nConstructs a value of type `Either a b` from a value of type `b`.\n\n```javascript\n> S.Right (42)\nRight (42)\n```\n\n#### <a name=\"isLeft\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2293\">`isLeft :: Either a b -⁠> Boolean`</a>\n\nReturns `true` if the given Either is a Left; `false` if it is a Right.\n\n```javascript\n> S.isLeft (S.Left ('Cannot divide by zero'))\ntrue\n\n> S.isLeft (S.Right (42))\nfalse\n```\n\n#### <a name=\"isRight\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2313\">`isRight :: Either a b -⁠> Boolean`</a>\n\nReturns `true` if the given Either is a Right; `false` if it is a Left.\n\n```javascript\n> S.isRight (S.Right (42))\ntrue\n\n> S.isRight (S.Left ('Cannot divide by zero'))\nfalse\n```\n\n#### <a name=\"either\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2333\">`either :: (a -⁠> c) -⁠> (b -⁠> c) -⁠> Either a b -⁠> c`</a>\n\nTakes two functions and an Either, and returns the result of\napplying the first function to the Left's value, if the Either\nis a Left, or the result of applying the second function to the\nRight's value, if the Either is a Right.\n\nSee also [`fromLeft`](#fromLeft) and [`fromRight`](#fromRight).\n\n```javascript\n> S.either (S.toUpper) (S.show) (S.Left ('Cannot divide by zero'))\n'CANNOT DIVIDE BY ZERO'\n\n> S.either (S.toUpper) (S.show) (S.Right (42))\n'42'\n```\n\n#### <a name=\"fromLeft\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2362\">`fromLeft :: a -⁠> Either a b -⁠> a`</a>\n\nTakes a default value and an Either, and returns the Left value\nif the Either is a Left; the default value otherwise.\n\nSee also [`either`](#either) and [`fromRight`](#fromRight).\n\n```javascript\n> S.fromLeft ('abc') (S.Left ('xyz'))\n'xyz'\n\n> S.fromLeft ('abc') (S.Right (123))\n'abc'\n```\n\n#### <a name=\"fromRight\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2385\">`fromRight :: b -⁠> Either a b -⁠> b`</a>\n\nTakes a default value and an Either, and returns the Right value\nif the Either is a Right; the default value otherwise.\n\nSee also [`either`](#either) and [`fromLeft`](#fromLeft).\n\n```javascript\n> S.fromRight (123) (S.Right (789))\n789\n\n> S.fromRight (123) (S.Left ('abc'))\n123\n```\n\n#### <a name=\"fromEither\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2408\">`fromEither :: b -⁠> Either a b -⁠> b`</a>\n\nTakes a default value and an Either, and returns the Right value\nif the Either is a Right; the default value otherwise.\n\nThe behaviour of `fromEither` is likely to change in a future release.\nPlease use [`fromRight`](#fromRight) instead.\n\n```javascript\n> S.fromEither (0) (S.Right (42))\n42\n\n> S.fromEither (0) (S.Left (42))\n0\n```\n\n#### <a name=\"lefts\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2432\">`lefts :: (Filterable f, Functor f) => f (Either a b) -⁠> f a`</a>\n\nDiscards each element that is a Right, and unwraps each element that is\na Left.\n\nSee also [`rights`](#rights).\n\n```javascript\n> S.lefts ([S.Right (20), S.Left ('foo'), S.Right (10), S.Left ('bar')])\n['foo', 'bar']\n```\n\n#### <a name=\"rights\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2449\">`rights :: (Filterable f, Functor f) => f (Either a b) -⁠> f b`</a>\n\nDiscards each element that is a Left, and unwraps each element that is\na Right.\n\nSee also [`lefts`](#lefts).\n\n```javascript\n> S.rights ([S.Right (20), S.Left ('foo'), S.Right (10), S.Left ('bar')])\n[20, 10]\n```\n\n#### <a name=\"tagBy\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2466\">`tagBy :: (a -⁠> Boolean) -⁠> a -⁠> Either a a`</a>\n\nTakes a predicate and a value, and returns a Right of the value if it\nsatisfies the predicate; a Left of the value otherwise.\n\n```javascript\n> S.tagBy (S.odd) (0)\nLeft (0)\n\n> S.tagBy (S.odd) (1)\nRight (1)\n```\n\n#### <a name=\"encase\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2487\">`encase :: Throwing e a b -⁠> a -⁠> Either e b`</a>\n\nTakes a function that may throw and returns a pure function.\n\n```javascript\n> S.encase (JSON.parse) ('[\"foo\",\"bar\",\"baz\"]')\nRight (['foo', 'bar', 'baz'])\n\n> S.encase (JSON.parse) ('[')\nLeft (new SyntaxError ('Unexpected end of JSON input'))\n```\n\n#### <a name=\"eitherToMaybe\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2513\">`eitherToMaybe :: Either a b -⁠> Maybe b`</a>\n\nConverts an Either to a Maybe. A Left becomes Nothing; a Right becomes\na Just.\n\nSee also [`maybeToEither`](#maybeToEither).\n\n```javascript\n> S.eitherToMaybe (S.Left ('Cannot divide by zero'))\nNothing\n\n> S.eitherToMaybe (S.Right (42))\nJust (42)\n```\n\n### <span id=\"section:logic\">❑ Logic</span>\n\n#### <a name=\"and\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2538\">`and :: Boolean -⁠> Boolean -⁠> Boolean`</a>\n\nBoolean \"and\".\n\n```javascript\n> S.and (false) (false)\nfalse\n\n> S.and (false) (true)\nfalse\n\n> S.and (true) (false)\nfalse\n\n> S.and (true) (true)\ntrue\n```\n\n#### <a name=\"or\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2566\">`or :: Boolean -⁠> Boolean -⁠> Boolean`</a>\n\nBoolean \"or\".\n\n```javascript\n> S.or (false) (false)\nfalse\n\n> S.or (false) (true)\ntrue\n\n> S.or (true) (false)\ntrue\n\n> S.or (true) (true)\ntrue\n```\n\n#### <a name=\"not\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2594\">`not :: Boolean -⁠> Boolean`</a>\n\nBoolean \"not\".\n\nSee also [`complement`](#complement).\n\n```javascript\n> S.not (false)\ntrue\n\n> S.not (true)\nfalse\n```\n\n#### <a name=\"complement\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2616\">`complement :: (a -⁠> Boolean) -⁠> a -⁠> Boolean`</a>\n\nTakes a unary predicate and a value of any type, and returns the logical\nnegation of applying the predicate to the value.\n\nSee also [`not`](#not).\n\n```javascript\n> Number.isInteger (42)\ntrue\n\n> S.complement (Number.isInteger) (42)\nfalse\n```\n\n#### <a name=\"boolean\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2636\">`boolean :: a -⁠> a -⁠> Boolean -⁠> a`</a>\n\nCase analysis for the `Boolean` type. `boolean (x) (y) (b)` evaluates\nto `x` if `b` is `false`; to `y` if `b` is `true`.\n\n```javascript\n> S.boolean ('no') ('yes') (false)\n'no'\n\n> S.boolean ('no') ('yes') (true)\n'yes'\n```\n\n#### <a name=\"ifElse\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2661\">`ifElse :: (a -⁠> Boolean) -⁠> (a -⁠> b) -⁠> (a -⁠> b) -⁠> a -⁠> b`</a>\n\nTakes a unary predicate, a unary \"if\" function, a unary \"else\"\nfunction, and a value of any type, and returns the result of\napplying the \"if\" function to the value if the value satisfies\nthe predicate; the result of applying the \"else\" function to the\nvalue otherwise.\n\nSee also [`when`](#when) and [`unless`](#unless).\n\n```javascript\n> S.ifElse (x => x < 0) (Math.abs) (Math.sqrt) (-1)\n1\n\n> S.ifElse (x => x < 0) (Math.abs) (Math.sqrt) (16)\n4\n```\n\n#### <a name=\"when\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2693\">`when :: (a -⁠> Boolean) -⁠> (a -⁠> a) -⁠> a -⁠> a`</a>\n\nTakes a unary predicate, a unary function, and a value of any type, and\nreturns the result of applying the function to the value if the value\nsatisfies the predicate; the value otherwise.\n\nSee also [`unless`](#unless) and [`ifElse`](#ifElse).\n\n```javascript\n> S.when (x => x >= 0) (Math.sqrt) (16)\n4\n\n> S.when (x => x >= 0) (Math.sqrt) (-1)\n-1\n```\n\n#### <a name=\"unless\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2717\">`unless :: (a -⁠> Boolean) -⁠> (a -⁠> a) -⁠> a -⁠> a`</a>\n\nTakes a unary predicate, a unary function, and a value of any type, and\nreturns the result of applying the function to the value if the value\ndoes not satisfy the predicate; the value otherwise.\n\nSee also [`when`](#when) and [`ifElse`](#ifElse).\n\n```javascript\n> S.unless (x => x < 0) (Math.sqrt) (16)\n4\n\n> S.unless (x => x < 0) (Math.sqrt) (-1)\n-1\n```\n\n### <span id=\"section:array\">❑ Array</span>\n\n#### <a name=\"array\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2743\">`array :: b -⁠> (a -⁠> Array a -⁠> b) -⁠> Array a -⁠> b`</a>\n\nCase analysis for the `Array a` type.\n\n```javascript\n> S.array (S.Nothing) (head => tail => S.Just (head)) ([])\nNothing\n\n> S.array (S.Nothing) (head => tail => S.Just (head)) ([1, 2, 3])\nJust (1)\n\n> S.array (S.Nothing) (head => tail => S.Just (tail)) ([])\nNothing\n\n> S.array (S.Nothing) (head => tail => S.Just (tail)) ([1, 2, 3])\nJust ([2, 3])\n```\n\n#### <a name=\"head\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2773\">`head :: Foldable f => f a -⁠> Maybe a`</a>\n\nReturns Just the first element of the given structure if the structure\ncontains at least one element; Nothing otherwise.\n\n```javascript\n> S.head ([1, 2, 3])\nJust (1)\n\n> S.head ([])\nNothing\n\n> S.head (Cons (1) (Cons (2) (Cons (3) (Nil))))\nJust (1)\n\n> S.head (Nil)\nNothing\n```\n\n#### <a name=\"last\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2806\">`last :: Foldable f => f a -⁠> Maybe a`</a>\n\nReturns Just the last element of the given structure if the structure\ncontains at least one element; Nothing otherwise.\n\n```javascript\n> S.last ([1, 2, 3])\nJust (3)\n\n> S.last ([])\nNothing\n\n> S.last (Cons (1) (Cons (2) (Cons (3) (Nil))))\nJust (3)\n\n> S.last (Nil)\nNothing\n```\n\n#### <a name=\"tail\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2838\">`tail :: (Applicative f, Foldable f, Monoid (f a)) => f a -⁠> Maybe (f a)`</a>\n\nReturns Just all but the first of the given structure's elements if the\nstructure contains at least one element; Nothing otherwise.\n\n```javascript\n> S.tail ([1, 2, 3])\nJust ([2, 3])\n\n> S.tail ([])\nNothing\n\n> S.tail (Cons (1) (Cons (2) (Cons (3) (Nil))))\nJust (Cons (2) (Cons (3) (Nil)))\n\n> S.tail (Nil)\nNothing\n```\n\n#### <a name=\"init\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2872\">`init :: (Applicative f, Foldable f, Monoid (f a)) => f a -⁠> Maybe (f a)`</a>\n\nReturns Just all but the last of the given structure's elements if the\nstructure contains at least one element; Nothing otherwise.\n\n```javascript\n> S.init ([1, 2, 3])\nJust ([1, 2])\n\n> S.init ([])\nNothing\n\n> S.init (Cons (1) (Cons (2) (Cons (3) (Nil))))\nJust (Cons (1) (Cons (2) (Nil)))\n\n> S.init (Nil)\nNothing\n```\n\n#### <a name=\"take\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2906\">`take :: (Applicative f, Foldable f, Monoid (f a)) => Integer -⁠> f a -⁠> Maybe (f a)`</a>\n\nReturns Just the first N elements of the given structure if N is\nnon-negative and less than or equal to the size of the structure;\nNothing otherwise.\n\n```javascript\n> S.take (0) (['foo', 'bar'])\nJust ([])\n\n> S.take (1) (['foo', 'bar'])\nJust (['foo'])\n\n> S.take (2) (['foo', 'bar'])\nJust (['foo', 'bar'])\n\n> S.take (3) (['foo', 'bar'])\nNothing\n\n> S.take (3) (Cons (1) (Cons (2) (Cons (3) (Cons (4) (Cons (5) (Nil))))))\nJust (Cons (1) (Cons (2) (Cons (3) (Nil))))\n```\n\n#### <a name=\"drop\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2961\">`drop :: (Applicative f, Foldable f, Monoid (f a)) => Integer -⁠> f a -⁠> Maybe (f a)`</a>\n\nReturns Just all but the first N elements of the given structure if\nN is non-negative and less than or equal to the size of the structure;\nNothing otherwise.\n\n```javascript\n> S.drop (0) (['foo', 'bar'])\nJust (['foo', 'bar'])\n\n> S.drop (1) (['foo', 'bar'])\nJust (['bar'])\n\n> S.drop (2) (['foo', 'bar'])\nJust ([])\n\n> S.drop (3) (['foo', 'bar'])\nNothing\n\n> S.drop (3) (Cons (1) (Cons (2) (Cons (3) (Cons (4) (Cons (5) (Nil))))))\nJust (Cons (4) (Cons (5) (Nil)))\n```\n\n#### <a name=\"takeLast\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L2993\">`takeLast :: (Applicative f, Foldable f, Monoid (f a)) => Integer -⁠> f a -⁠> Maybe (f a)`</a>\n\nReturns Just the last N elements of the given structure if N is\nnon-negative and less than or equal to the size of the structure;\nNothing otherwise.\n\n```javascript\n> S.takeLast (0) (['foo', 'bar'])\nJust ([])\n\n> S.takeLast (1) (['foo', 'bar'])\nJust (['bar'])\n\n> S.takeLast (2) (['foo', 'bar'])\nJust (['foo', 'bar'])\n\n> S.takeLast (3) (['foo', 'bar'])\nNothing\n\n> S.takeLast (3) (Cons (1) (Cons (2) (Cons (3) (Cons (4) (Nil)))))\nJust (Cons (2) (Cons (3) (Cons (4) (Nil))))\n```\n\n#### <a name=\"dropLast\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3026\">`dropLast :: (Applicative f, Foldable f, Monoid (f a)) => Integer -⁠> f a -⁠> Maybe (f a)`</a>\n\nReturns Just all but the last N elements of the given structure if\nN is non-negative and less than or equal to the size of the structure;\nNothing otherwise.\n\n```javascript\n> S.dropLast (0) (['foo', 'bar'])\nJust (['foo', 'bar'])\n\n> S.dropLast (1) (['foo', 'bar'])\nJust (['foo'])\n\n> S.dropLast (2) (['foo', 'bar'])\nJust ([])\n\n> S.dropLast (3) (['foo', 'bar'])\nNothing\n\n> S.dropLast (3) (Cons (1) (Cons (2) (Cons (3) (Cons (4) (Nil)))))\nJust (Cons (1) (Nil))\n```\n\n#### <a name=\"takeWhile\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3059\">`takeWhile :: (a -⁠> Boolean) -⁠> Array a -⁠> Array a`</a>\n\nDiscards the first element that does not satisfy the predicate,\nand all subsequent elements.\n\nSee also [`dropWhile`](#dropWhile).\n\n```javascript\n> S.takeWhile (S.odd) ([3, 3, 3, 7, 6, 3, 5, 4])\n[3, 3, 3, 7]\n\n> S.takeWhile (S.even) ([3, 3, 3, 7, 6, 3, 5, 4])\n[]\n```\n\n#### <a name=\"dropWhile\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3086\">`dropWhile :: (a -⁠> Boolean) -⁠> Array a -⁠> Array a`</a>\n\nRetains the first element that does not satisfy the predicate,\nand all subsequent elements.\n\nSee also [`takeWhile`](#takeWhile).\n\n```javascript\n> S.dropWhile (S.odd) ([3, 3, 3, 7, 6, 3, 5, 4])\n[6, 3, 5, 4]\n\n> S.dropWhile (S.even) ([3, 3, 3, 7, 6, 3, 5, 4])\n[3, 3, 3, 7, 6, 3, 5, 4]\n```\n\n#### <a name=\"size\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3113\">`size :: Foldable f => f a -⁠> NonNegativeInteger`</a>\n\nReturns the number of elements of the given structure.\n\n```javascript\n> S.size ([])\n0\n\n> S.size (['foo', 'bar', 'baz'])\n3\n\n> S.size (Nil)\n0\n\n> S.size (Cons ('foo') (Cons ('bar') (Cons ('baz') (Nil))))\n3\n\n> S.size (S.Nothing)\n0\n\n> S.size (S.Just ('quux'))\n1\n\n> S.size (S.Pair ('ignored!') ('counted!'))\n1\n```\n\n#### <a name=\"all\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3145\">`all :: Foldable f => (a -⁠> Boolean) -⁠> f a -⁠> Boolean`</a>\n\nReturns `true` [iff][] all the elements of the structure satisfy the\npredicate.\n\nSee also [`any`](#any) and [`none`](#none).\n\n```javascript\n> S.all (S.odd) ([])\ntrue\n\n> S.all (S.odd) ([1, 3, 5])\ntrue\n\n> S.all (S.odd) ([1, 2, 3])\nfalse\n```\n\n#### <a name=\"any\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3168\">`any :: Foldable f => (a -⁠> Boolean) -⁠> f a -⁠> Boolean`</a>\n\nReturns `true` [iff][] any element of the structure satisfies the\npredicate.\n\nSee also [`all`](#all) and [`none`](#none).\n\n```javascript\n> S.any (S.odd) ([])\nfalse\n\n> S.any (S.odd) ([2, 4, 6])\nfalse\n\n> S.any (S.odd) ([1, 2, 3])\ntrue\n```\n\n#### <a name=\"none\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3191\">`none :: Foldable f => (a -⁠> Boolean) -⁠> f a -⁠> Boolean`</a>\n\nReturns `true` [iff][] none of the elements of the structure satisfies\nthe predicate.\n\nProperties:\n\n  - `forall p :: a -> Boolean, xs :: Foldable f => f a.\n     S.none (p) (xs) = S.not (S.any (p) (xs))`\n\n  - `forall p :: a -> Boolean, xs :: Foldable f => f a.\n     S.none (p) (xs) = S.all (S.complement (p)) (xs)`\n\nSee also [`all`](#all) and [`any`](#any).\n\n```javascript\n> S.none (S.odd) ([])\ntrue\n\n> S.none (S.odd) ([2, 4, 6])\ntrue\n\n> S.none (S.odd) ([1, 2, 3])\nfalse\n```\n\n#### <a name=\"append\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3222\">`append :: (Applicative f, Semigroup (f a)) => a -⁠> f a -⁠> f a`</a>\n\nReturns the result of appending the first argument to the second.\n\nSee also [`prepend`](#prepend).\n\n```javascript\n> S.append (3) ([1, 2])\n[1, 2, 3]\n\n> S.append (3) (Cons (1) (Cons (2) (Nil)))\nCons (1) (Cons (2) (Cons (3) (Nil)))\n\n> S.append ([1]) (S.Nothing)\nJust ([1])\n\n> S.append ([3]) (S.Just ([1, 2]))\nJust ([1, 2, 3])\n```\n\n#### <a name=\"prepend\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3252\">`prepend :: (Applicative f, Semigroup (f a)) => a -⁠> f a -⁠> f a`</a>\n\nReturns the result of prepending the first argument to the second.\n\nSee also [`append`](#append).\n\n```javascript\n> S.prepend (1) ([2, 3])\n[1, 2, 3]\n\n> S.prepend (1) (Cons (2) (Cons (3) (Nil)))\nCons (1) (Cons (2) (Cons (3) (Nil)))\n\n> S.prepend ([1]) (S.Nothing)\nJust ([1])\n\n> S.prepend ([1]) (S.Just ([2, 3]))\nJust ([1, 2, 3])\n```\n\n#### <a name=\"joinWith\" href=\"https://github.com/sanctuary-js/sanctuary/blob/v3.1.0/index.js#L3277\">`joinWith :: String -⁠> Array String -⁠> String`</a>\n\nJoins the strings of the second argument separated by the first argument.\n\nProperties:\n\n  - `forall s :: String, t :: String.\n     S.joinWith (s) (S.splitOn (s) (t)) = t`\n\nSee also [`splitOn`](#s","maintainers":[{"email":"dc@davidchambers.me","name":"davidchambers"},{"email":"aldwin@avaq.it","name":"avaq"}],"time":{"modified":"2022-06-26T15:51:30.958Z","created":"2015-01-22T21:59:53.697Z","0.1.0":"2015-01-22T21:59:53.697Z","0.2.0":"2015-01-28T23:21:54.313Z","0.3.0":"2015-02-02T19:08:51.232Z","0.4.0":"2015-02-18T23:04:04.469Z","0.5.0":"2015-05-26T06:07:35.013Z","0.6.0":"2015-06-16T00:16:56.416Z","0.7.0":"2015-09-22T08:53:56.710Z","0.7.1":"2015-09-23T22:44:32.158Z","0.8.0":"2016-01-25T22:15:13.611Z","0.9.0":"2016-02-25T19:12:46.486Z","0.9.1":"2016-03-10T22:52:29.643Z","0.10.0":"2016-04-11T00:40:47.697Z","0.11.0":"2016-05-31T05:32:44.875Z","0.11.1":"2016-05-31T06:58:31.152Z","0.12.0":"2017-02-12T21:03:21.065Z","0.12.1":"2017-02-15T13:14:42.981Z","0.12.2":"2017-02-26T17:10:51.804Z","0.13.0":"2017-05-31T15:38:47.571Z","0.13.1":"2017-05-31T18:46:58.336Z","0.13.2":"2017-06-07T01:50:23.498Z","0.14.0":"2017-12-18T22:09:32.634Z","0.14.1":"2017-12-23T00:37:54.204Z","0.15.0":"2018-06-04T13:54:53.208Z","0.15.1":"2019-02-17T09:00:10.430Z","1.0.0":"2019-03-09T22:59:24.840Z","1.1.0":"2019-04-05T12:14:43.144Z","2.0.0":"2019-04-27T20:02:19.761Z","2.0.1":"2019-11-03T18:47:13.623Z","2.0.2":"2020-01-13T21:24:06.977Z","3.0.0":"2020-01-19T22:55:38.235Z","3.1.0":"2020-08-09T10:41:22.377Z"},"homepage":"https://github.com/sanctuary-js/sanctuary#readme","repository":{"type":"git","url":"git://github.com/sanctuary-js/sanctuary.git"},"bugs":{"url":"https://github.com/sanctuary-js/sanctuary/issues"},"license":"MIT","readmeFilename":"README.md","users":{"nuxdie":true,"ristostevcev":true,"scottfreecode":true,"whathejoe":true}}