closures 0.7.3 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -46,7 +46,7 @@ npm install closures
46
46
 
47
47
  ## Examples
48
48
 
49
- [Counter Example](https://flems.io/#0=N4IgZglgNgpgziAXAbVAOwIYFsZJAOgAsAXLKEAGhAGMB7NYmBvEAXwvW10QICsEqdBk2J4hcYgAJgkwhUkYADovn0ASjCy0AbjEmtJAXknUotOAFcATvADcAHTSOwFtNWIR6kgILKAFACU0o6SkjbE1miSfiGhsn4A5AAmENr4WmjmihjUMAkUsXHxCYQAjPmSCd6ScBBYirAKygkBBVFF8QDCtK6MVvIyEGgQHhhQ3b2IkgAM+gGFkvPtAQ5orI6OAPSbNXUNenT19CJwzq7unlEAIj0ARrB+MnS9c8Ht4ZHFhABMFc8MkgAVJJvitHOsnGhtjViBhGC4oCZaEc0Cczm4PF4JsIrI9JEMRhAxtipKwgsBYrApP8pMYCaNxj0GKtYupNDoYH5AkYAHxvIriWiwfBmADmiQAqmgtL0YElJCSYFYWqtQmSWe8YBErFFuYY+cgFoREj8-kziK0jSaAMwVZJ3WBJRAtNpFY03Cz3GADJEvMmuuLGhK3CzEYj0CoyeimCDUADWUz1fJpkgA1MZSvp5AkhtQbDgGC1YgBdVYQxxKRR+Y2+RStSRJWjUCwF4j4W60JIATxWlBAcBgsAu9AQPGmiGmAFprd9EN8AOxsDggTA4PD4ahwAQ0eiMZg8dL0LI5PQyMC7ydgbDQLtTDLH3K2fR9gdDzFoUcgcfWgBsbGLVBQEMcajqgK5cGIZiWDY27WOQPAkMQihwIg2yuIocaihuyKbKY5jWPAAAC0z4PO+DfJsKQSLhUEEXA6RDPg-B9sQXaKNw-Z5hAiiiFQ2TENQhDwEgyCidMVCGKUFDUIYwDsCAAHIJOUngApFDICpCCKeJICGPYICIYoqFqaU84UKZFAACylJZVk2YpyA6Wgcb6VQinKVQWnqSpYBqY5EnAHAhC0AA7jw7k+X5ml+TpFA5KIAEWRZlkAKxSalpQOTpcIwOF6keapinRdpVAUIQNhgHlSmRUVnkxVQ7CEIYJk-uZrWWT+ACcVldVlVAwPg2isexbn5SpAD6UVUHG9W6TA+owAAZIt3wmWZFnzpZ4mbdMfUgN8hiHQNQ1sd6fkFTNtUgJNJVzfqwBUpIxCGLgAHfClFDvRQ84pa1P0-ntEBgH4AAch2GBaHw6pI50qZd3lUDd6k6X4A2CdASQaGAKxA34anWtaFAExQIOlOJpO7ep-kgAEUNRLD01Tdds2oxuhAY2t5lmSDlkgyTvN7amXaowEATyRFVAAKJM2os0vfdVKcxZnXTLZKuWYDwNg4dkNap8DMgNLV2y7drPo1AmMwNjti4-jhPE51P6tY7ANUzptN69DBtGwjIAm8jVBm+zFtK+t0yq+Z4ca27VBCyLYujdVVD+xpVAAMpy6jFDEBQVgBKHkfznzZNF3tWvg2g+cS37TMZ6b3ptujBelKUaXma3mUxyAorEIQthoKmqZV2Nye1yzDdsxAzfvetM97WgAF56w4sjyAde+z71OGFnFr6tPIPiaU3wH2XoPg3nBvr6nhvj9nk-N9avPmY-IN7T3fdWIPw9J2vTObyjE8m6JXWutVK3xzJgL2rnCgld7pM30qYDAW4AByXB9Lg2IMtPwz0EFQCQacGmicdIAEJpjnwAPyvTalZD6NkQagPoXtTkFpEBoGWgbLy19fK3WQMQYslD8ADmbilH65kREpUBiGRgyC0542rpwmqAcQC8IAjnC+wCuZiM6utFK2imHYNzgnA2AAVJmAA1TO3o0AUAgKNJK60fzHzasfJhMCbHSUTgVbhvtOE6UMHnBWVD7FtWtN1UoP5Ql7QCIEqQHCmbeK3sAPC0Fm4-hSofNJlMxJUDQBoLQugqpeKZr4hqNtgbaFRqknmbUeZ7T8BUmAos6bAHwK0uJV0EmxWGrlKSmQki5UbNQO2RNCbhO0W1PRXc-BYHjs01p+B2m+06aVbpiBemdgGU2YZxNTI-ikrszu2SDIYxsGgQpKlTFXQsabWgk8Q4aIst8b41oPpPJeXtSQUBiE63YdXFOKkr4o36FAVoXIC5PLSZ9b4aS6n9FoDA1oLS2nyPibNbOp01kwI2WpL6uKXmtWeb9KJVh8CKAsEFORq9Lm+2uUo1GKiEXgsstaMy3xmXziibYOZyLV4KKoMsygqzbLmxxa815qVbJspStHI5ZyrDL1ttXJG194bU3jg9LUTKQbgLZdq+eMAQqSAALJKE8Yo6+JTdK3MULQKsw9gnvXSZ9FK6SoHUBWI9RZXC5YDXGsQLlQSQHOs6jq3R3w9rPRziY8xt9rG2I4RQBJPkKCWrFjYEyYTurQseXsjlXc02ezQEihZKKOlotWXzEVb0xWfQiTqute1g6W0qtGq5LMc6V2koQcFaTJW9ojZEYtXrzVdIxSpB5rL5zTAJVO12sqNn6SMdXWl19biWOgZXcFFNPoUyYWgb5ENfmrxXSpNd9dSVWFtV5B1nVLJZtvZ1N+vdbDEC-gbE9VAz10pgAyklBdrTTCeUTQD4au6DgHPiYGBtlVw3HqLDVCVNEWQA9K4D0qmGtAgIEVo76mZfrVSS82SR-1jKJmMvaPIEOSFoM1auABJJm3hb5qJgf+p54CZxPKiXAv5Y967ZzNYzK6yqgWi0E7-K6-9A7eisDiqS3wpIzkhUpiRUzvTws7bhq6+GgVuIgKLNjINuoziM1A-TrRaArx-gxq6THbrbxk24-9AGOMub2rQWwj1qDiaTXVW6ZS-BVloPaoNBMREjJEXtZJBEfPFLlrc6LznSYjNJntOjSQcNKqZqq0TR6f4waE3Syui0TK0I+o-cORMtpZOpvgP1AAfer1A8tFKuqmgIVHEPBMfl9HrqmjnED8O6m2LXzXFSUVg56EB8Cin-alVqj8iVdymzNrUlKf6+f7LNUWWC0AQzmz+Pmj9Dt7Qhh6rUMNS1LLlmgPwJLFCXrmyDe2vNrRRLKrR1edGs58pAN4LOAqKAJZMqM+26SOPg72hbNOsJGDnL89d26rBEB+AS+zf9KVntE0x29ru0PYfzWHfytFwXWC4zQP+n8lXfzhz2qcz7P9qXXxXSjWxGXxP-PTizW5FPEqtXCVZb407BfTojSIPSIBXJad9jp6TQP74TsF1TpXNWdJSCgBQJIHiDZgBTcUxNaK5AWAoCoDAGbzLdXm+lX6hzqZG5N3FBnBVN4qRTqz1oXZDDeFk4r1K85CZ+9x0cpg78CpZaujliSaARQh660GjqAGeoAb2gAHkMKKZaWA0-Qey7NWwARcbaGQFgAuHVwtl7zUcs7hfkA54j7NYsB6LRA1Lz+ecZkOrt7qTJNAxeAI67i-ZqwyAQoAWa6329PVb17QAnAfxI+x+jf5ctTbcBlqWvwHGGAnvDrUE39vnFfMnGWSneJE-tOu67-3z2InhUlGGCL1gACTVS-zgU1ZN-tvYpNS7AvwwAAPLOHXDxX7OADxQHYLCgEKQeCgLAQeWwHFe9D-F5ZA-ramHvWvJVACTbOMWfOWYfWbRKcBI+D-N-Ug0DI5AgxfErauMAFfYpdfWaa-cGIZN6cSIXD-ZLE-VLLuLfG-eRB-ZAArcAQQyPNSF-RKUHKyA+cBXmQDPaQAs6WgkA-XbzCA1oUUScSccTYQsQrQ2wKhIDIDXmDgkw1XKgCwWSVgTzbPcPX2MQzzL+HvUvEGCJaQiJU7EFBA2gwfe-YfUfTXJ3HyegtrRg26a-OTT6dKFWDvGIvaLsJvchCwTA1eVfJgvg4sRAKNX3ENWIhcbvQwXvJIfvK7b1ezIvYoj7UvTqJ1O9V1LuP-A2b7b0XXbzX7f7b0MAtQknTLVeTnCTb9MqcTVVCaFmR-Q-HdKyR2PmO9E7LuQgA9DhLBWRTo1oMxIbPXDpLBSWAHVoW4DY9Q4eNlT6WydJSrM48w5RUfIIqgYxPwTbdYy1IHXon+fowFOXOQA2EYxGMY4vHFHVcBdJFlCgIEyvamQeVgcDPQOvew2afQqEy7JDMydJSFFEtAnSWPQgZSchL4pmETQOX-UUVMTKELTRdJcZcksEnSEKNPUUfPCQqlGNU2fwgCYLAuNKCyDkqk0qX-a4z43jK6d4kALOOQOsOxINNKR+EE0oR+PaWwLPG466fPX7OMfPAVQQp-cTX7AVJvLBS+H7NYv+XYigWXYU3vTU2-Q4tSayOyaU3RO0x9LufpfxZ4+HEAJnFSFnQOfoDLaw7xYJFKBcVqQM+cOdamc4d8REn+fDFSToW+eZdRJEkE74TqQmQM1MunDrR6XnX2GxfAxyUsFvPncyPmFKADUs8szWPwYhA2HM6+KeW6RrYhKsWspmBspRAIRrDAdbAqSuRrOslSfTRrds2rBrerVsq6EcnSC9K9HE6uAcqgKciSagRAH3ImYzbqMs44rcmVamIKIGQbF43sts-AmPNAHudk38U4q8vdd+HkUochIdeck826LtE5JgVc1gUVZ1EEllZEv8p9QgR8+ZCc32JcygIjdNRXaVEgmCig6mXaZHUC+stFCwEWA2LMi7RDa+ZaAAPz8DrL8QGnbPf1KE3OZTTIor2n0nwEXQNgC1wuwpUm-ndiowNjXOvmwqIsEUiIF2lXtP4sdOD0ESAlyB7JUiYpyVmmJICHwBsAaHZJP0BKUo+UXW8NXgXJAHAo3DwS3EVM0u0sQS3DnNXg4okukv0kkH0m-K+hdXOLOMBnPPEqksnKYKMrgACDdLMqoC4tKnmiCWLlLPTJBPTP0R0mrkkpXG2y-Orn8sa30hSG0H0hiqUUVQ0pfKUWv2+WQsHPSIPwAmJiAxdUDJCsDPiLUs9WrhHJUloDljQsaXIVKDygDKp2DNar2nIVnH9TSp-mqqoFqvsx1gCF7jXJavC1+kiy7iLROnYjdL6pAAGqUQoD9UQG9C33ZPnBshBM2t3LV1WooD4LdIMryq7BN0e2grfw+hEXenc2QiOuXhjMXOXjjPCPCBMmIMBM2ikhEWsgjQwCGHlh5ANkepABerpXQTUroA2pKvEXgqcgkCjIKm8EMBBoAHFDAwbqYDD8AAAxEyfZb60Mzcom+eCgAaA2JqW4Mm9IL3amtkfJfy-Ua1clY0Rpam05fpbykASsOWFwHMp1FuEEg+cSTHC-I5LOLmmBKw7bNi+coHJmeFcgezJFTmIq0mYM9WunDAMKA2UodgJW32aPLADANACwMYDQJIKwbW9gYjIffAAAEgNntoAAVJZjE6NjFxorgAB5I1caNQSWHGzzDBchAiwwO49TVoEle2l2t2j2r232-2wO2SCqVhCgbQPpXKGAdgElRgf-YgboYQBgCXVyNQO7NxC0TyvwKAOSq2AA8u70GujOjZCgGuiqZ41uwaTOl6BOAaKwVwQwPm4cW7RzPbOSTCqQRW2SeZWxeZNYQI6O2O92z2n2v2gOoOnqiadegLGulIGwC4XQOfYtXeiAfejwQ+igOe-APemAA++ARrOSKzHSJIRYt6UoPmEGUskGJ1THeo4PbUKIGjVtGlW+EFQI9kzqIzEEyBoSreaOp2125ehOo1WaJOvGxKD+igKnaYD6bB9Eny8XfSKXAU32IU8u+FC0cUzRKnUJLB6YSJLuWuy27WxUyK7BHuuWSjJIWu-01lKSKncLAR7kkACqeu-oA2KhTitFbh5u-pAuKnURBR-BkAbh9ukFA2ZeJmTXLujZCGZeampqToamrAQwVGum3JdkXQQG5milRpWaMkXsRKWyZXKnVMuhjM-vV8W+98T8ccPZMs-8VgIAA)
49
+ [Counter](https://flems.io/#0=N4IgZglgNgpgziAXAbVAOwIYFsZJAOgAsAXLKEAGhAGMB7NYmBvEAXwvW10QICsEqdBk2J4hcYgAJgkwhUkYADovn0ASjCy0AbjEmtJAXknUotOAFcATvADcAHTSOwFtNWIR6kgILKAFACU0o6SkjbE1miSfiGhsn4A5AAmENr4WmjmihjUMAkUsXHxCYQAjPmSCd6ScBBYirAKygkBBVFF8QDCtK6MVvIyEGgQHhhQ3b2IkgAM+gGFkvPtAQ5orI6OAPSbNXUNenT19CJwzq7unlEAIj0ARrB+MnS9c8Ht4ZHFhABMFc8MkgAVJJvitHOsnGhtjViBhGC4oCZaEc0Cczm4PF4JsIrI9JEMRhAxtipKwgsBYrApP8pMYCaNxj0GKtYupNDoYH5AkYAHxvIriWiwfBmADmiQAqmgtL0YElJCSYFYWqtQmSWe8YBErFFuYY+cgFoREj8-kziK0jSaAMwVZJ3WBJRAtNpFY03Cz3GADJEvMmuuLGhK3CzEYj0CoyeimCDUADWUz1fJpkgA1MZSvp5AkhtQbDgGC1YgBdVYQxxKRR+Y2+RStSRJWjUCwF4j4W60JIATxWlBAcBgsAu9AQPGmiGmAFprd9EN8AOxsDggTA4PD4ahwAQ0eiMZg8dL0LI5PQyMC7ydgbDQLtTDLH3K2fR9gdDzFoUcgcfWgBsbGLVBQEMcajqgK5cGIZiWDY27WOQPAkMQihwIg2yuIocaihuyKbKY5jWPAAAC0z4PO+DfJsKQSLhUEEXA6RDPg-B9sQXaKNw-Z5hAiiiFQ2TENQhDwEgyCidMVCGKUFDUIYwDsCAAHIJOUngApFDICpCCKeJICGPYICIYoqFqaU84UKZFAACylJZVk2YpyA6Wgcb6VQinKVQWnqSpYBqY5EnAHAhC0AA7jw7k+X5ml+TpFA5KIAEWRZlkAKxSalpQOTpcIwOF6keapinRdpVAUIQNhgHlSmRUVnkxVQ7CEIYJk-uZrWWT+ACcVldVlVAwPg2isexbn5SpAD6UVUHG9W6TA+owAAZIt3wmWZFnzpZ4mbdMfUgN8hiHQNQ1sd6fkFTNtUgJNJVzfqwBUpIxCGLgAHfClFDvRQ84pa1P0-ntEBgH4AAch2GBaHw6pI50qZd3lUDd6k6X4A2CdASQaGAKxA34anWtaFAExQIOlOJpO7ep-kgAEUNRLD01Tdds2oxuhAY2t5lmSDlkgyTvN7amXaowEATyRFVAAKJM2os0vfdVKcxZnXTLZKuWYDwNg4dkNap8DMgNLV2y7drPo1AmMwNjti4-jhPE51P6tY7ANUzptN69DBtGwjIAm8jVBm+zFtK+t0yq+Z4ca27VBCyLYujdVVD+xpVAAMpy6jFDEBQVgBKHkfznzZNF3tWvg2g+cS37TMZ6b3ptujBelKUaXma3mUxyAorEIQthoKmqZV2Nye1yzDdsxAzfvetM97WgAF56w4sjyAde+z71OGFnFr6tPIPiaU3wH2XoPg3nBvr6nhvj9nk-N9avPmY-IN7T3fdWIPw9J2vTObyjE8m6JXWutVK3xzJgL2rnCgld7pM30qYDAW4AByXB9Lg2IMtPwz0EFQCQacGmicdIAEJpjnwAPyvTalZD6NkQagPoXtTkFpEBoGWgbLy19fK3WQMQYslD8ADmbilH65kREpUBiGRgyC0542rpwmqAcQC8IAjnC+wCuZiM6utFK2imHYNzgnA2AAVJmAA1TO3o0AUAgKNJK60fzHzasfJhMCbHSUTgVbhvtOE6UMHnBWVD7FtWtN1UoP5Ql7QCIEqQHCmbeK3sAPC0Fm4-hSofNJlMxJUDQBoLQugqpeKZr4hqNtgbaFRqknmbUeZ7T8BUmAos6bAHwK0uJV0EmxWGrlKSmQki5UbNQO2RNCbhO0W1PRXc-BYHjs01p+B2m+06aVbpiBemdgGU2YZxNTI-ikrszu2SDIYxsGgQpKlTFXQsabWgk8Q4aIst8b41oPpPJeXtSQUBiE63YdXFOKkr4o36FAVoXIC5PLSZ9b4aS6n9FoDA1oLS2nyPibNbOp01kwI2WpL6uKXmtWeb9KJVh8CKAsEFORq9Lm+2uUo1GKiEXgsstaMy3xmXziibYOZyLV4KKoMsygqzbLmxxa815qVbJspStHI5ZyrDL1ttXJG194bU3jg9LUTKQbgLZdq+eMAQqSAALJKE8Yo6+JTdK3MULQKsw9gnvXSZ9FK6SoHUBWI9RZXC5YDXGsQLlQSQHOs6jq3R3w9rPRziY8xt9rG2I4RQBJPkKCWrFjYEyYTurQseXsjlXc02ezQEihZKKOlotWXzEVb0xWfQiTqute1g6W0qtGq5LMc6V2koQcFaTJW9ojZEYtXrzVdIxSpB5rL5zTAJVO12sqNn6SMdXWl19biWOgZXcFFNPoUyYWgb5ENfmrxXSpNd9dSVWFtV5B1nVLJZtvZ1N+vdbDEC-gbE9VAz10pgAyklBdrTTCeUTQD4au6DgHPiYGBtlVw3HqLDVCVNEWQA9K4D0qmGtAgIEVo76mZfrVSS82SR-1jKJmMvaPIEOSFoM1auABJJm3hb5qJgf+p54CZxPKiXAv5Y967ZzNYzK6yqgWi0E7-K6-9A7eisDiqS3wpIzkhUpiRUzvTws7bhq6+GgVuIgKLNjINuoziM1A-TrRaArx-gxq6THbrbxk24-9AGOMub2rQWwj1qDiaTXVW6ZS-BVloPaoNBMREjJEXtZJBEfPFLlrc6LznSYjNJntOjSQcNKqZqq0TR6f4waE3Syui0TK0I+o-cORMtpZOpvgP1AAfer1A8tFKuqmgIVHEPBMfl9HrqmjnED8O6m2LXzXFSUVg56EB8Cin-alVqj8iVdymzNrUlKf6+f7LNUWWC0AQzmz+Pmj9Dt7Qhh6rUMNS1LLlmgPwJLFCXrmyDe2vNrRRLKrR1edGs58pAN4LOAqKAJZMqM+26SOPg72hbNOsJGDnL89d26rBEB+AS+zf9KVntE0x29ru0PYfzWHfytFwXWC4zQP+n8lXfzhz2qcz7P9qXXxXSjWxGXxP-PTizW5FPEqtXCVZb407BfTojSIPSIBXJad9jp6TQP74TsF1TpXNWdJSCgBQJIHiDZgBTcUxNaK5AWAoCoDAGbzLdXm+lX6hzqZG5N3FBnBVN4qRTqz1oXZDDeFk4r1K85CZ+9x0cpg78CpZaujliSaARQh660GjqAGeoAb2gAHkMKKZaWA0-Qey7NWwARcbaGQFgAuHVwtl7zUcs7hfkA54j7NYsB6LRA1Lz+ecZkOrt7qTJNAxeAI67i-ZqwyAQoAWa6329PVb17QAnAfxI+x+jf5ctTbcBlqWvwHGGAnvDrUE39vnFfMnGWSneJE-tOu67-3z2InhUlGGCL1gACTVS-zgU1ZN-tvYpNS7AvwwAAPLOHXDxX7OADxQHYLCgEKQeCgLAQeWwHFe9D-F5ZA-ramHvWvJVACTbOMWfOWYfWbRKcBI+D-N-Ug0DI5AgxfErauMAFfYpdfWaa-cGIZN6cSIXD-ZLE-VLLuLfG-eRB-ZAArcAQQyPNSF-RKUHKyA+cBXmQDPaQAs6WgkA-XbzCA1oUUScSccTYQsQrQ2wKhIDIDXmDgkw1XKgCwWSVgTzbPcPX2MQzzL+HvUvEGCJaQiJU7EFBA2gwfe-YfUfTXJ3HyegtrRg26a-OTT6dKFWDvGIvaLsJvchCwTA1eVfJgvg4sRAKNX3ENWIhcbvQwXvJIfvK7b1ezIvYoj7UvTqJ1O9V1LuP-A2b7b0XXbzX7f7b0MAtQknTLVeTnCTb9MqcTVVCaFmR-Q-HdKyR2PmO9E7LuQgA9DhLBWRTo1oMxIbPXDpLBSWAHVoW4DY9Q4eNlT6WydJSrM48w5RUfIIqgYxPwTbdYy1IHXon+fowFOXOQA2EYxGMY4vHFHVcBdJFlCgIEyvamQeVgcDPQOvew2afQqEy7JDMydJSFFEtAnSWPQgZSchL4pmETQOX-UUVMTKELTRdJcZcksEnSEKNPUUfPCQqlGNU2fwgCYLAuNKCyDkqk0qX-a4z43jK6d4kALOOQOsOxINNKR+EE0oR+PaWwLPG466fPX7OMfPAVQQp-cTX7AVJvLBS+H7NYv+XYigWXYU3vTU2-Q4tSayOyaU3RO0x9LufpfxZ4+HEAJnFSFnQOfoDLaw7xYJFKBcVqQM+cOdamc4d8REn+fDFSToW+eZdRJEkE74TqQmQM1MunDrR6XnX2GxfAxyUsFvPncyPmFKADUs8szWPwYhA2HM6+KeW6RrYhKsWspmBspRAIRrDAdbAqSuRrOslSfTRrds2rBrerVsq6EcnSC9K9HE6uAcqgKciSagRAH3ImYzbqMs44rcmVamIKIGQbF43sts-AmPNAHudk38U4q8vdd+HkUochIdeck826LtE5JgVc1gUVZ1EEllZEv8p9QgR8+ZCc32JcygIjdNRXaVEgmCig6mXaZHUC+stFCwEWA2LMi7RDa+ZaAAPz8DrL8QGnbPf1KE3OZTTIor2n0nwEXQNgC1wuwpUm-ndiowNjXOvmwqIsEUiIF2lXtP4sdOD0ESAlyB7JUiYpyVmmJICHwBsAaHZJP0BKUo+UXW8NXgXJAHAo3DwS3EVM0u0sQS3DnNXg4okukv0kkH0m-K+hdXOLOMBnPPEqksnKYKMrgACDdLMqoC4tKnmiCWLlLPTJBPTP0R0mrkkpXG2y-Orn8sa30hSG0H0hiqUUVQ0pfKUWv2+WQsHPSIPwAmJiAxdUDJCsDPiLUs9WrhHJUloDljQsaXIVKDygDKp2DNar2nIVnH9TSp-mqqoFqvsx1gCF7jXJavC1+kiy7iLROnYjdL6pAAGqUQoD9UQG9C33ZPnBshBM2t3LV1WooD4LdIMryq7BN0e2grfw+hEXenc2QiOuXhjMXOXjjPCPCBMmIMBM2ikhEWsgjQwCGHlh5ANkepABerpXQTUroA2pKvEXgqcgkCjIKm8EMBBoAHFDAwbqYDD8AAAxEyfZb60Mzcom+eCgAaA2JqW4Mm9IL3amtkfJfy-Ua1clY0Rpam05fpbykASsOWFwHMp1FuEEg+cSTHC-I5LOLmmBKw7bNi+coHJmeFcgezJFTmIq0mYM9WunDAMKA2UodgJW32aPLADANACwMYDQJIKwbW9gYjIffAAAEgNntoAAVJZjE6NjFxorgAB5I1caNQSWHGzzDBchAiwwO49TVoEle2l2t2j2r232-2wO2SCqVhCgbQPpXKGAdgElRgf-YgboYQBgCXVyNQO7NxC0TyvwKAOSq2AA8u70GujOjZCgGuiqZ41uwaTOl6BOAaKwVwQwPm4cW7RzPbOSTCqQRW2SeZWxeZNYQI6O2O92z2n2v2gOoOnqiadegLGulIGwC4XQOfYtXeiAfejwQ+igOe-APemAA++ARrOSKzHSJIRYt6UoPmEGUskGJ1THeo4PbUKIGjVtGlW+EFQI9kzqIzEEyBoSreaOp2125ehOo1WaJOvGxKD+igKnaYD6bB9Eny8XfSKXAU32IU8u+FC0cUzRKnUJLB6YSJLuWuy27WxUyK7BHuuWSjJIWu-01lKSKncLAR7kkACqeu-oA2KhTitFbh5u-pAuKnURBR-BkAbh9ukFA2ZeJmTXLujZCGZeampqToamrAQwVGum3JdkXQQG5milRpWaMkXsRKWyZXKnVMuhjM-vV8W+98T8ccPZMs-8VgIAA)
50
50
 
51
51
  [Todo List](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwFYA0IAZhAgM7IDaoAdgIZiJIgYAWALmLCAQMYD21NvEHIQAHigQAbgAJoAXgA6IWgAdVygHyLqMmTrEB6SVM3cQpeAh5sIA8kzRIsIAL54a9RswBW5XgJCIkz81KRsMsAyLHgyaqqxAgBK8GB8UvAyrjLyMjywfKQArgBO8KQA3Do6CBFsfFCFOTIUOnpRjdTwSDKEtLCWsUIAHmw9AORgtADWmbS9CGCkMvDD9KoI41l4bZEynd29-YMyI2My4wDutKQspyyZkrflW+67HQKHfQPwQ6vnV3603ujz4AHNSK8dABdKrUHSEIrUGx2XS0GAACgAlJFdvVGqQMKoircMcBdnoDj1viczhNxjtdFksXDXNVqIjkbYBHkELQStjcUz8U1ciLCcRYEIBRF5JoZABCNgYA4snRs+EcpEonkAQXUgvJTNqMjKUwg1AtYOa4owkulGNl8qVKs+WIwCGoYLYLAqenZejKbFKuhYGPGJgwaWohVUtB48AZFNODUKUbUjtTOW0TL0ejDEekSdzefz4YtxOV0dj8cTsSNpcbpwAnqpDuMeA8eNMAEZ8YbFpulzvwbvwKA9EWurqMod5gSd2hew5k078sHwCKuHFyoVz0tTg429ebjAjsdQOH7rLJ0vbxm3vMFitFKsCGsJhl7-dsVvts6DvuGy1iwfCwFA8AlBMlwsLQERdOOyz1DIPagl0AD8gFzk8tA9ggE4po006-I+pZSP0RSHFOZyzvuAgvucq5sCeW47vK1H-MeJQbsq5GwJRpHMo+WLJlitH+iWBaqF+Zq0BaVoyAA1BcpqpHJlpehg4xicmBY9q+9TUF+UQLrAEDdj06JQNsFxWdp4nROG+lsIZxkyKZ5nTD0+TwPyNkdnyJTabsarUBqOjxBiYb6qoYn7HwPBFAwggYDxACiizCGwABCzYAJJQOG8TaSy5iWNY3JhKIWAAAxIDVbgeCAdAMKIZ6kP4IChEEbBtdWpBxgmeyEIEAC0fSQLAzY9P1g3wH6rhlVYo6VQ4IB1QAzCgbjQgQZnUNMDhUM1XiiPkhSlOU5ilFwTDsGwqikEghiGEiqjTGCZ58GAhjncUZSkAAAjVGAAOzYMYEDhL9BT-eUUYWhgfjmL+baiKQPAlBAqi9QQcZsCOR0UBQNUEPIaB4Dw8jAO4IC7RQo0U0QdN4BQTPkPTpMgEoID3aoz0s2goN4ELeAACxoGL4uS-TJMEAdygEPTjMEBzrNM4QLNy9zwC3HwlxMMrGta+zWtc3g8a9btoui2LOAU3baCy1zcHdFrKvM-TpucwQeAsGUhCG6zHua17qtmwQ7gsPIgsoCLcdiygACc4vJ87BDwBgUio787tMwA+ibBDTBH3PwHK8AAGSVy41vC6LoNi6Tjc1enIBYPIneZ9nf5K8HTMl2HICFz7ZdysAJpsPIiC7bgeBz6DOBx4vKBtxAhAYgAHJ38hsFiQYhjIefF0Xw+lximediQUApIQLLrxiLMbRteDP3gm9oKTH+t6z2v75uh9j4gEHurAgI9WZcwvmeFg19Bb12FpvMWm935ILbopZsF8sRYlpkbAgaVT5JFLtPcetQ4Ei2FknGqUtKFizXhvbenc94HxKLoIB+Ch6ENHlAq+4Fb73w3k-F+b8k4oDjiI1ev8ub-2DCwo+uCQDsNASAThECCDcJgeBMhNsapUJFjo2hkiCDoMwdgvuDMmYqLZgQAAykQi+eA2B4BKFiLR9caqg2QZ-Dxbd6E72oC4+Rlima2K4b8ZUV9XEizQPbKJ9s27el9NQRSikAn9wIEEmx58wnQIgJEtAuB64FLbtQXazjXA4LSSAEJSjFHa3kPYveco8lYE3qTfJrSfFbx3s4oB1SrEKKyQ4nJeSNpIJFqMze8SfQVBKMk1J5jMlD1qZA7JES67kJFnbLAmycBYDbk4vA-jx6n2UPkG4pAAByXhlA7zYNXR0PMzkdWUGJUuCoardPQjPeO4t8CS03vXJBoM27wEdFiJA1Bq5ALVv00OqiQAUDYNCL5GBLB5JwIvEWGKcBr2cvAC51jH7yJhcbUeiLdqOJ6esm2OAk711pcCwxIBQWUtMUAgAKqfAAanY341A8AQD7jbeuKAWnxxaSCw5ArKZmJDqfGFXN5DOJId84V8cNopzQCgDVbcsQqoiNC0+cK6nAD+qUPJKAcBtMtT-YmXNqApDSBkIOCzPZKIVZHCoD8pAXwtYg+OiC24Yh9fALBzDqDAAwFGw1Q9jXmxzkgCmMYIJIEaDwQRr8X5arpfHOlQawAmPDZG6NxKjWlwcX+RNhyGjdDTRmt+Qt0DkPQG3DRUAyjUBdR7TlQ8eVcL4DkzR1LhZYCwBtfAo7x1txkLABUjCoWBNPn0yBJQ8CwDEhiIlGzRajstfPLAlqg2rr4IcsSxaMAxqUXG32Cak01pZnPR94645jqXrqkoRISRhg5dyrJ5LT2RKwGLDaI7gOMrtQQFkRao0XtLbG8tCapY8IfROiddspZAZwAYiDzUkAlHKQ-IB4D+kgO1iYiem5ANIO2UBzeeymVdEuDIAAsmoWVpL3VEIHaoPgqhsSAZwFa+egnbXa0piyE0l7YVEMzvnNgMzVXwOE0nGjtL6M4ano4n9vbBn8sFdCvAxqNZ4A9SAbBZRBaapTgend6BwN-1cNBktlSSUEGvdwBNyDkOz1Q-PbVNH-OtuvrfLtTMe1KL7fCx0p7KYsEA5ajDCW24yIjTBqTHGxO3qFUprAoMaovryxInDyb4AvIqa6yL-Sey8oOf4wD3957fxBdQOdu8F2VMq0zaroSiQlF42rNVWAk5i2s8NpOUzfRsDmUAzrBButRfgP+j9kSNo1VHa-Nb6ntZWEsHIAR8jiMDyyVgijVtt3C1W1hjbWGQViQgNiV58jZsgHm2Rj9PCoAreza-bNbdNCnfcjHeReVT66kGZSw5K3R3bI2tD3VxzF1D2XWosJ7GT5D2IyurBaOqmn2WSjpxD6KZYAprDvdZOcVMvsSe-xOPnuvZXVKiAWCoebxTrDtn+zmdiT4OVj2IOh5g9HvU34q7+UrdWzDyXbc+AVBNDwHHRnw6jy9RvPjfBUlqufhizNGK25mrKIr+VXGzywyKBLj+maP5twKo9yph30dRece111DvgHn38ZXQWfz8CjJ0a-JuomuYYDkwAH1DzwF3cqh6mZO5PFbYs56jNwMljEPB75R4y97eF9yp4QFSgnpeAe31Mrz6lTcW7XVK4sKXLB9zqC7wTygZBozm9t13hJzcciXNluF9QDEH7VB9YT5vIRSCNq6r9kDypeV7GuZALqex7m8ADvTdbLNQirUw6323cC1jmJCFC8rq9pdXBIAxKvmBK2cCj9fjfifTK98H-Lultz5aNeuAftQFbKB-dbR0W3B2tPq6uFv0pVpAoKlAHbq6hkrjv2hgN-tbHHFquLLVAnGgclllDzIrDNqfAzgTpfrksOqgb-iQUHgQBELAHgFADKkAoQCZvKoZuWjEEUHgAkLQJZiLCnHbE2jwU7EyiwWwRbMAR7LUhYufMzngM2PILqCUJEnbKDC-AoQ-jhsIAkh7AdqfKRoqtQB6GoWdmqonKtqnKtm3GIPIGCNXGAOYURloaXBUFiN6hQGAPIZasLInHrkyh3k4bYUPNoUrK1nvOvK4aDO4SgKEUGlTNQM4btHQcbsLiUBQJcLtJHq4cNqnMNm3LtKQEqkkSkZnm5tXNXqQNXKZhgLMNIZ3DwOUfAM2A+sgmKmLHlqTE0QAV4fINURUfMh7PPu5vIFIDEVPvIaDCTuLCMfwThlPs2HkfIMMPYnQTKvPqQDKsvhrngJcMkngGAMkhUA+qNmMeOgcZTjhlERQERrtNXtMNkUQokWCILNsvkmMSMU8VtlzLcfkV7vIoQEUfKqUaXDUZUR0Q+qTLVGMZbk0dbkyl0dCv0RQG7oQLCf4SzNHILBvuLK0tskgmtm3HMbnF8YsYwQrqsWJGCKNKNDjm7kiWSRUN8ututtRi0XRuQSAEUNTK4HLjYZoX4fYbAHMlEfIZvNquidqu3uursV8fEfCrkckdQSIRrD8THn8aPACUTvPA7JQu4RqW3M2IEehEUGcRKTHv8RUdCEgFpsQSNrluLCpvZpAqcVALEXBifsLgMQ6UMRaUnEJiNlam3DMUArPr8PQQrvPovr8MsUSe-tAR7LAcjiAPYjEEAqRgXOfAMS4bPA0cgiNs3taW3gIa1tCvcoSmGWJFymngwbGvcmlEvmJD2GWcSakkBvPFLFav7i2cyX6fIuyhiNXqWaZivlGeIUjoMgmfIkmWAimc4Q+jRtslaiBngLObaUYopK4DtpkL4UolSaNDST8N3mqlanuvuccdtl6D6IzOhImafJjmotMWCIpE7Jrkplajmk+YuSAJcOYWCA4SiZ2b+lwokTKRrpEvbKLMBa+VITMSOZUjGcOWwXbnuWgKMvOQhdhtrBUNYXKWAg4fPtMA4X0amY6T3vBqPIEfcr0nPiWXjtWXgPgXGdEWAARa6r0ZGakhLNLEhbSuxeNkyhBEqv2UfiAKAUzOAWoqulAeyXCnublnHLsqDEVtrNqJVN3q6q9kzAAMKDIwZUrnbzlDYvy7JJwqHazOIA6IFKICo3EkywjBFIEizII4CrZ2UOV0IYgKhAKmX9JEHwrh4Kh8ZuWnyeV-zh60CV4ez+Lh7uVMzM7h4BXB5h6h5+VDwxUEC9b9bnnyIRUEBJXcw8B4ZPzs4pz2WNmFUoVcy3DrxsDYg44ZUgBZVKp6EnlAVbTNlNXNYJKaBoDoTnoJVKJZWxbXwdp4aLQ+bCbzkgbCz2URFMoJKdVpbpX+XlofYWbEFYaPErWvEECtxn7dUeXlpFCYJAJYgA5nb9LVwAB+GI7liqmcnloxaABVwGelD1bcygGALyQCquGIp1x1TM8yUiAOQCchQ8x1V1qKqpKBWGHFENXFqhqKZkCYIVTM318spcd57oZQGwQFTRM5WN06Ly4plS1VWVpu5yGFzU81ypTypAaVlSgNSiwNRiyg+gIAKGI1ImpMbNa8XoCNyNiV-xlN4KANp89N3A5cqqnidl+l85+lIKGIXM8iSNZNo82CQCot4eygJgygQ18KhGc1vNypFRc621kVxptRGa62gmuyUtuy2peNkm8iAVTMfARCe1oa6ETgQFv+0lntbc6EWAZpH1QCDtBATtwujCWIPotNe5bh85bhxSwAPcbY-FQdIAId8KeAcmSAvwswQFoMks85udJVFBmdeAFR-FhNJtzYbBw+y1Ix+AGKKeTK-WZd5SKlmV5S6lypQY9xIsM5jcFMGKEsyW6kxCZg8irdIAHdUWNyeN-AOdlt2K61zU4QSlHsuo8g49AA4vIJPahZnAAGKCwUxoD92yUFWn3FJ4CZxALRw9iX1RgyF33JCpDpCi1yjcZfqYJ30doQS039LxBEKcgsxCbH3zmtLs1gNBqi6nyHJsm17-XpUr6nwnpcDC7FpkLm0fzSWYOAG0AGxAJoDuAoNKK6FTDUBFD9ApDtq4PuCfYJEYAAAkQC9DAACmlOynlOyvnAACIADyzG+cSQaUe9cuty6EF18gXZvwaxH69DLDbDHD3DfDAjQj1MAcEKeAUgJWmd7gH6ZwqlgQWBygisSQA+Uqe84KGIsAGAAcsxpjvwVjmjNaa61j8A9BaxDjJW08pimcJQSI8gnIOo-eouMDNMh1JoyD1MMGgqMGYUspMjcj7DnDvD-DgjwjOtSiyjaTG8VjkgZQKIGQOR56OTEAeTtgBTeAMTKoJTK00g5Q4eNM5WXMUA+Zs8aAyCm8dlm8QmN+PpTKACsifApNglBAwlcZ9jYkUA0+e5ScbO85Mz0NdSMjTDrDiTijzGpcmTgs7TeAv+NU+AuzR5XMPU2B5giOSisZpjJ6e82WGyv+GqOzNUOqTKLjVDlwpNCtDyoaRC-2UALjElI6FMv+OuQLr5Njcxq6KtQt5avzjjEEkSv+mKCLhzBAvzAca63RTM5S0DMLnjbA5Sd90cqld9YA8gG9j9Dqz9GQI979pIXzo824pU1sUspBv+BlDzBl0IsR5UNT9gogdU6A9lO0rgQAA)
52
52
 
package/dist/closures.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  let NIL = void 0,
2
2
  noop = _ => {},
3
3
  propDirective = prop => ({
4
- mount(el, value) {
4
+ mount(el, value = '') {
5
5
  el[prop] = value;
6
6
  },
7
- patch(el, newValue, oldValue) {
7
+ patch(el, newValue = '', oldValue) {
8
8
  if (newValue !== oldValue) el[prop] = newValue;
9
9
  },
10
10
  unmount(el) {
@@ -21,6 +21,7 @@ let NIL = void 0,
21
21
  innerHTML: propDirective('innerHTML')
22
22
  }
23
23
  },
24
+ RERENDERS = [],
24
25
  ON_REMOVES = [],
25
26
  CLOSURE_TO_FN = new WeakMap(),
26
27
  ON_CREATE_KEY = 'oncreate',
@@ -32,9 +33,9 @@ let NIL = void 0,
32
33
  NS_ATTRS = { show: XLINK_NS, actuate: XLINK_NS, href: XLINK_NS },
33
34
  REF_SINGLE = 1, // ref with single dom node
34
35
  VTYPE_ELEMENT = 1,
36
+ VTYPE_FUNCTION = 2,
35
37
  REF_ARRAY = 4, // ref with array of nodes
36
38
  REF_PARENT = 8, // ref with a child ref
37
- VTYPE_FUNCTION = 2,
38
39
  RETAIN_KEY = '=',
39
40
  generateClosureId = _ => NUM++,
40
41
  isFn = x => typeof x === 'function',
@@ -91,6 +92,7 @@ let replaceDom = (parent, newRef, oldRef) => {
91
92
 
92
93
  let setDomAttribute = (el, attr, value, isSVG) => {
93
94
  if (attr === 'className') attr = 'class';
95
+ if (value === NIL) value = '';
94
96
  if (value === true) el.setAttribute(attr, '');
95
97
  else if (value === false) el.removeAttribute(attr);
96
98
  else (isSVG && NS_ATTRS[attr])
@@ -102,7 +104,7 @@ let mountAttributes = (el, props, env) => {
102
104
  for (let key in props) {
103
105
  if (key === 'key' || key === 'children' || key === ON_CREATE_KEY || key in env.directives) continue;
104
106
  else if (key.startsWith('on'))
105
- el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.redraw(); };
107
+ el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.rerender(); };
106
108
  else setDomAttribute(el, key, props[key], env.isSVG);
107
109
  }
108
110
  };
@@ -118,7 +120,7 @@ let patchAttributes = (el, newProps, oldProps, env) => {
118
120
 
119
121
  if (oldValue !== newValue)
120
122
  key.startsWith('on')
121
- ? el[key.toLowerCase()] = ev => { newValue(ev); !env.manualRedraw && env.redraw(); }
123
+ ? el[key.toLowerCase()] = ev => { newValue(ev); !env.manualRedraw && env.rerender(); }
122
124
  : setDomAttribute(el, key, newValue, env.isSVG);
123
125
  }
124
126
 
@@ -517,8 +519,6 @@ function h(_t, ...children) {
517
519
  let vtype =
518
520
  isStr(_t)
519
521
  ? VTYPE_ELEMENT
520
- : _t && isFn(_t.mount)
521
- ? VTYPE_COMPONENT
522
522
  : isFn(_t)
523
523
  ? VTYPE_FUNCTION
524
524
  : NIL;
@@ -527,7 +527,7 @@ function h(_t, ...children) {
527
527
 
528
528
  // returns a vnode
529
529
  return {
530
- vtype, // (number) VTYPE_ELEMENT | VTYPE_COMPONENT | VTYPE_FUNCTION
530
+ vtype, // (number) VTYPE_ELEMENT | VTYPE_FUNCTION
531
531
  _t, // (string | object | function)
532
532
  key: props.key, // string
533
533
  props // object
@@ -557,20 +557,31 @@ function app(vnode, parentDomNode, opts = {}) {
557
557
  parentDomNode.textContent = '';
558
558
  insertDom(parentDomNode, ref, NIL);
559
559
 
560
- return env.redraw = (newVnode = vnode) => {
561
- rootRef.ref = patchInPlace(
562
- parentDomNode,
563
- newVnode,
564
- rootRef.vnode,
565
- rootRef.ref,
566
- env
567
- );
560
+ // not passing a new vnode will rerender the app in place
561
+ return RERENDERS.push(
562
+ env.rerender = (newVnode = vnode) => {
563
+ rootRef.ref = patchInPlace(
564
+ parentDomNode,
565
+ newVnode,
566
+ rootRef.vnode,
567
+ rootRef.ref,
568
+ env
569
+ );
570
+
571
+ rootRef.vnode = newVnode;
572
+ }
573
+ ) && env.rerender;
574
+ }
568
575
 
569
- rootRef.vnode = newVnode;
570
- };
576
+ // "global" redraw
577
+ // will rerender all mounted apps
578
+ const redraw = _ => {
579
+ for (let i = 0; i < RERENDERS.length; i++)
580
+ RERENDERS[i]();
571
581
  }
572
582
  exports.Fragment = Fragment;
573
583
  exports.app = app;
574
584
  exports.h = h;
575
585
  exports.m = m;
576
- exports.onRemove = onRemove;
586
+ exports.onRemove = onRemove;
587
+ exports.redraw = redraw;
package/dist/closures.js CHANGED
@@ -1,10 +1,10 @@
1
1
  let NIL = void 0,
2
2
  noop = _ => {},
3
3
  propDirective = prop => ({
4
- mount(el, value) {
4
+ mount(el, value = '') {
5
5
  el[prop] = value;
6
6
  },
7
- patch(el, newValue, oldValue) {
7
+ patch(el, newValue = '', oldValue) {
8
8
  if (newValue !== oldValue) el[prop] = newValue;
9
9
  },
10
10
  unmount(el) {
@@ -21,6 +21,7 @@ let NIL = void 0,
21
21
  innerHTML: propDirective('innerHTML')
22
22
  }
23
23
  },
24
+ RERENDERS = [],
24
25
  ON_REMOVES = [],
25
26
  CLOSURE_TO_FN = new WeakMap(),
26
27
  ON_CREATE_KEY = 'oncreate',
@@ -32,9 +33,9 @@ let NIL = void 0,
32
33
  NS_ATTRS = { show: XLINK_NS, actuate: XLINK_NS, href: XLINK_NS },
33
34
  REF_SINGLE = 1, // ref with single dom node
34
35
  VTYPE_ELEMENT = 1,
36
+ VTYPE_FUNCTION = 2,
35
37
  REF_ARRAY = 4, // ref with array of nodes
36
38
  REF_PARENT = 8, // ref with a child ref
37
- VTYPE_FUNCTION = 2,
38
39
  RETAIN_KEY = '=',
39
40
  generateClosureId = _ => NUM++,
40
41
  isFn = x => typeof x === 'function',
@@ -91,6 +92,7 @@ let replaceDom = (parent, newRef, oldRef) => {
91
92
 
92
93
  let setDomAttribute = (el, attr, value, isSVG) => {
93
94
  if (attr === 'className') attr = 'class';
95
+ if (value === NIL) value = '';
94
96
  if (value === true) el.setAttribute(attr, '');
95
97
  else if (value === false) el.removeAttribute(attr);
96
98
  else (isSVG && NS_ATTRS[attr])
@@ -102,7 +104,7 @@ let mountAttributes = (el, props, env) => {
102
104
  for (let key in props) {
103
105
  if (key === 'key' || key === 'children' || key === ON_CREATE_KEY || key in env.directives) continue;
104
106
  else if (key.startsWith('on'))
105
- el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.redraw(); };
107
+ el[key.toLowerCase()] = ev => { props[key](ev); !env.manualRedraw && env.rerender(); };
106
108
  else setDomAttribute(el, key, props[key], env.isSVG);
107
109
  }
108
110
  };
@@ -118,7 +120,7 @@ let patchAttributes = (el, newProps, oldProps, env) => {
118
120
 
119
121
  if (oldValue !== newValue)
120
122
  key.startsWith('on')
121
- ? el[key.toLowerCase()] = ev => { newValue(ev); !env.manualRedraw && env.redraw(); }
123
+ ? el[key.toLowerCase()] = ev => { newValue(ev); !env.manualRedraw && env.rerender(); }
122
124
  : setDomAttribute(el, key, newValue, env.isSVG);
123
125
  }
124
126
 
@@ -517,8 +519,6 @@ export function h(_t, ...children) {
517
519
  let vtype =
518
520
  isStr(_t)
519
521
  ? VTYPE_ELEMENT
520
- : _t && isFn(_t.mount)
521
- ? VTYPE_COMPONENT
522
522
  : isFn(_t)
523
523
  ? VTYPE_FUNCTION
524
524
  : NIL;
@@ -527,7 +527,7 @@ export function h(_t, ...children) {
527
527
 
528
528
  // returns a vnode
529
529
  return {
530
- vtype, // (number) VTYPE_ELEMENT | VTYPE_COMPONENT | VTYPE_FUNCTION
530
+ vtype, // (number) VTYPE_ELEMENT | VTYPE_FUNCTION
531
531
  _t, // (string | object | function)
532
532
  key: props.key, // string
533
533
  props // object
@@ -557,15 +557,25 @@ export function app(vnode, parentDomNode, opts = {}) {
557
557
  parentDomNode.textContent = '';
558
558
  insertDom(parentDomNode, ref, NIL);
559
559
 
560
- return env.redraw = (newVnode = vnode) => {
561
- rootRef.ref = patchInPlace(
562
- parentDomNode,
563
- newVnode,
564
- rootRef.vnode,
565
- rootRef.ref,
566
- env
567
- );
560
+ // not passing a new vnode will rerender the app in place
561
+ return RERENDERS.push(
562
+ env.rerender = (newVnode = vnode) => {
563
+ rootRef.ref = patchInPlace(
564
+ parentDomNode,
565
+ newVnode,
566
+ rootRef.vnode,
567
+ rootRef.ref,
568
+ env
569
+ );
570
+
571
+ rootRef.vnode = newVnode;
572
+ }
573
+ ) && env.rerender;
574
+ }
568
575
 
569
- rootRef.vnode = newVnode;
570
- };
576
+ // "global" redraw
577
+ // will rerender all mounted apps
578
+ export const redraw = _ => {
579
+ for (let i = 0; i < RERENDERS.length; i++)
580
+ RERENDERS[i]();
571
581
  }
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r){t[e]=r},patch(t,r,n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=new WeakMap,d=1,c={},s="http://www.w3.org/1999/xlink",f={show:s,actuate:s,href:s},h=e=>"function"==typeof e,u=e=>"string"==typeof e,p=e=>null!==e&&"object"==typeof e,a=e=>Array.isArray(e),y=e=>JSON.stringify(e),v=e=>null===e||!1===e||e===t||a(e)&&0===e.length||e&&"="===e._t,w=e=>a(e)&&e.length>0,m=e=>u(e)||"number"==typeof e,g=e=>e&&1===e.vtype,k=e=>e&&2===e.vtype,_=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return _(e.childRef);if(4===t)return _(e.children[0]);throw Error("Unknown ref type "+y(e))},R=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return R(e.childRef);if(4===t)return R(e.children[e.children.length-1]);throw Error("Unknown ref type "+y(e))},S=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)S(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+y(t));for(let n=0;n<t.children.length;n++)S(e,t.children[n],r)}},E=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)E(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+y(t));for(let r=0;r<t.children.length;r++)E(e,t.children[r])}},N=(e,t,r,n)=>{"className"===t&&(t="class"),!0===r?e.setAttribute(t,""):!1===r?e.removeAttribute(t):n&&f[t]?e.setAttributeNS(f[t],t,r):e.setAttribute(t,r)},V=(e,n,i,c,s=r)=>{let f={closureId:i,closure:c,onRemove:s};if(v(e))return{...f,type:1,node:document.createComment("NULL")};if(m(e))return{...f,type:1,node:document.createTextNode(e)};if(g(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),h(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.redraw()}:N(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:V(o.children,n);return l!==t&&S(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...f,type:1,node:r,children:l}}if(w(e)){let t=0,r=[];for(;t<e.length;t++)r.push(V(e[t],n));return{...f,type:4,children:r}}if(k(e)){let t=e._t(e.props);if(h(t)){let i=d++,c=l.get(e._t)||new Map,s=o.pop()||r;c.set(i,t),l.set(e._t,c);let f=e._t;return e._t=t,V(e,n,i,f,s)}return{...f,type:8,childRef:V(t,n),childState:t}}if(e instanceof Node)return{...f,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},b=(e,r,n)=>{if(g(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&b(e.props.children,r.children,n);else if(w(e))for(let t=0;t<e.length;t++)b(e[t],r.children[t],n);else if(k(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=l.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&l.delete(e),i()),b(r.childState,r.childRef,n)}},x=(e,t,r,n,i)=>{let o=A(e,t,r,n,i);return o!==n&&(((e,t,r)=>{S(e,t,_(r)),E(e,r)})(e,o,n),b(r,n,i)),o},A=(e,r,n,o,d={...i})=>{if(r&&"="===r._t)return o;let c,s;if(p(o)&&(c=o.closure,s=o.closureId),k(r)&&k(n)&&(r._t===n._t||c&&s)){let t,n=r._t,i=l.get(c);i&&s&&(t=i.get(s))&&(n=t);let f=n(r.props),h=A(e,f,o.childState,o.childRef,d);return h!==o.childRef?{type:8,childRef:h,childState:f}:(o.childState=f,o)}if(n===r||v(r)&&v(n))return o;if(m(r)&&m(n))return o.node.nodeValue=r,o;if(g(r)&&g(n)&&r._t===n._t){"svg"!==r._t||d.isSVG||(d={...d,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.redraw()}:N(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,d);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=V(i,d),S(o.node,o.children)):i===t?(o.node.textContent="",b(e,o.children,d),o.children=t):o.children=x(o.node,i,e,o.children,d),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,d),o}return w(r)&&w(n)?(((e,r,n,i,o)=>{let l,d,c,s,f,h,u,p,a=R(i),y=Array(r.length),v=i.children,w=0,m=0,g=r.length-1,k=n.length-1;for(;w<=g&&m<=k;)if(v[m]!==t)if(v[k]!==t)if(c=n[m],s=r[w],c&&s&&s.key===c.key)f=v[m],h=y[w]=x(e,s,c,f,o),w++,m++;else if(c=n[k],s=r[g],c&&s&&s.key===c.key)f=v[k],h=y[g]=x(e,s,c,f,o),g--,k--;else{if(u===t)for(l=m,u={};l<=k;l++)c=n[l],c&&c.key!==t&&(u[c.key]=l);s=r[w],d=s&&s.key!==t?u[s.key]:t,d!==t?(c=n[d],f=v[d],h=y[w]=A(e,s,c,f,o),S(e,h,_(v[m])),h!==f&&(E(e,f),b(c,f,o)),v[d]=t):(h=y[w]=V(s,o),S(e,h,_(v[m]))),w++}else k--;else m++;for(p=g<r.length-1?_(y[g+1]):a;w<=g;)h=V(r[w],o),y[w]=h,S(e,h,p),w++;for(;m<=k;)f=v[m],f!==t&&(E(e,f),b(n[m],f,o)),m++;i.children=y})(e,r,n,o,d),o):r instanceof Node&&n instanceof Node?(o.node=r,o):V(r,d)};function C(e,...r){let n,i=r[0];if(!i||!p(i)||a(i)||i._t||i.props?i=c:r.shift(),i=r.length>1?{...i,children:r}:1===r.length?{...i,children:r[0]}:i,u(e)&&~(n=e.indexOf("."))){let t=e.slice(n+1).replace(/\./g," ");i.class=i.class?t+" "+String(i.class):t,e=e.slice(0,n)}if(i.key!=i.key)throw new Error("Invalid NaN key");let o=u(e)?1:e&&h(e.mount)?VTYPE_COMPONENT:h(e)?2:t;if(o===t)throw new Error("Invalid VNode type");return{vtype:o,_t:e,key:i.key,props:i}}C.retain=e=>C("=");const G=C;e.Fragment=e=>e.children,e.app=function(e,r,n={}){let o,l={...i,manualRedraw:n.manualRedraw},d=r.$_REF;if(l.directives={...l.directives,...n.directives||{}},d!==t)throw Error("App already mounted on this node");return o=V(e,l),d=r.$_REF={ref:o,vnode:e},r.textContent="",S(r,o,t),l.redraw=(t=e)=>{d.ref=x(r,t,d.vnode,d.ref,l),d.vnode=t}},e.h=C,e.m=G,e.onRemove=e=>o.push(e)}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.closures={})}(this,(function(e){let t=void 0,r=e=>{},n=e=>({mount(t,r=""){t[e]=r},patch(t,r="",n){r!==n&&(t[e]=r)},unmount(r){r[e]=t}}),i={isSVG:!1,redraw:r,directives:{selected:n("selected"),checked:n("checked"),value:n("value"),innerHTML:n("innerHTML")}},o=[],l=[],d=new WeakMap,c=1,s={},f="http://www.w3.org/1999/xlink",h={show:f,actuate:f,href:f},p=e=>"function"==typeof e,u=e=>"string"==typeof e,a=e=>null!==e&&"object"==typeof e,y=e=>Array.isArray(e),v=e=>JSON.stringify(e),w=e=>null===e||!1===e||e===t||y(e)&&0===e.length||e&&"="===e._t,m=e=>y(e)&&e.length>0,g=e=>u(e)||"number"==typeof e,k=e=>e&&1===e.vtype,R=e=>e&&2===e.vtype,S=e=>{let t=e.type;if(1===t)return e.node;if(8===t)return S(e.childRef);if(4===t)return S(e.children[0]);throw Error("Unknown ref type "+v(e))},_=e=>{let t=e.type;if(1===t)return e.node.nextSibling;if(8===t)return _(e.childRef);if(4===t)return _(e.children[e.children.length-1]);throw Error("Unknown ref type "+v(e))},E=(e,t,r)=>{let n=t.type;if(1===n)e.insertBefore(t.node,r);else if(8===n)E(e,t.childRef,r);else{if(4!==n)throw Error("Unknown ref type "+v(t));for(let n=0;n<t.children.length;n++)E(e,t.children[n],r)}},N=(e,t)=>{let r=t.type;if(1===r)e.removeChild(t.node);else if(8===r)N(e,t.childRef);else{if(4!==r)throw Error("Unknown ref type "+v(t));for(let r=0;r<t.children.length;r++)N(e,t.children[r])}},V=(e,r,n,i)=>{"className"===r&&(r="class"),n===t&&(n=""),!0===n?e.setAttribute(r,""):!1===n?e.removeAttribute(r):i&&h[r]?e.setAttributeNS(h[r],r,n):e.setAttribute(r,n)},b=(e,n,i,o,s=r)=>{let f={closureId:i,closure:o,onRemove:s};if(w(e))return{...f,type:1,node:document.createComment("NULL")};if(g(e))return{...f,type:1,node:document.createTextNode(e)};if(k(e)){let r,{_t:i,props:o}=e;"svg"!==i||n.isSVG||(n={...n,isSVG:!0}),r=n.isSVG?document.createElementNS("http://www.w3.org/2000/svg",i):document.createElement(i),p(o.oncreate)&&o.oncreate(r),((e,t,r)=>{for(let n in t)"key"===n||"children"===n||"oncreate"===n||n in r.directives||(n.startsWith("on")?e[n.toLowerCase()]=e=>{t[n](e),!r.manualRedraw&&r.rerender()}:V(e,n,t[n],r.isSVG))})(r,o,n);let l=o.children===t?o.children:b(o.children,n);return l!==t&&E(r,l),((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].mount(e,t[n])})(r,o,n),{...f,type:1,node:r,children:l}}if(m(e)){let t=0,r=[];for(;t<e.length;t++)r.push(b(e[t],n));return{...f,type:4,children:r}}if(R(e)){let t=e._t(e.props);if(p(t)){let i=c++,o=d.get(e._t)||new Map,s=l.pop()||r;o.set(i,t),d.set(e._t,o);let f=e._t;return e._t=t,b(e,n,i,f,s)}return{...f,type:8,childRef:b(t,n),childState:t}}if(e instanceof Node)return{...f,type:1,node:e};if(e===t)throw Error("mount: vnode is undefined");throw Error("mount: Invalid vnode")},x=(e,r,n)=>{if(k(e))((e,t,r)=>{for(let n in t)n in r.directives&&r.directives[n].unmount(e,t[n])})(r.node,e.props,n),e.props.children!==t&&x(e.props.children,r.children,n);else if(m(e))for(let t=0;t<e.length;t++)x(e[t],r.children[t],n);else if(R(e)){let e=r.closure,t=r.closureId,i=r.onRemove,o=d.get(e);o&&t&&o.get(t)&&(o.delete(t),!o.size&&d.delete(e),i()),x(r.childState,r.childRef,n)}},A=(e,t,r,n,i)=>{let o=G(e,t,r,n,i);return o!==n&&(((e,t,r)=>{E(e,t,S(r)),N(e,r)})(e,o,n),x(r,n,i)),o},G=(e,r,n,o,l={...i})=>{if(r&&"="===r._t)return o;let c,s;if(a(o)&&(c=o.closure,s=o.closureId),R(r)&&R(n)&&(r._t===n._t||c&&s)){let t,n=r._t,i=d.get(c);i&&s&&(t=i.get(s))&&(n=t);let f=n(r.props),h=G(e,f,o.childState,o.childRef,l);return h!==o.childRef?{type:8,childRef:h,childState:f}:(o.childState=f,o)}if(n===r||w(r)&&w(n))return o;if(g(r)&&g(n))return o.node.nodeValue=r,o;if(k(r)&&k(n)&&r._t===n._t){"svg"!==r._t||l.isSVG||(l={...l,isSVG:!0}),((e,r,n,i)=>{let o;for(o in r){if("key"===o||"children"===o||"oncreate"===o||o in i.directives)continue;let t=n[o],l=r[o];t!==l&&(o.startsWith("on")?e[o.toLowerCase()]=e=>{l(e),!i.manualRedraw&&i.rerender()}:V(e,o,l,i.isSVG))}for(o in n)"key"===o||"children"===o||o in r||o in i.directives||(o.startsWith("on")?e[o.toLowerCase()]=t:e.removeAttribute(o))})(o.node,r.props,n.props,l);let e=n.props.children,i=r.props.children;return e===t?i!==t&&(o.children=b(i,l),E(o.node,o.children)):i===t?(o.node.textContent="",x(e,o.children,l),o.children=t):o.children=A(o.node,i,e,o.children,l),((e,t,r,n)=>{let i;for(i in t)i in n.directives&&n.directives[i].patch(e,t[i],r[i]);for(i in r)i in n.directives&&!(i in t)&&n.directives[i].unmount(e,r[i])})(o.node,r.props,n.props,l),o}return m(r)&&m(n)?(((e,r,n,i,o)=>{let l,d,c,s,f,h,p,u,a=_(i),y=Array(r.length),v=i.children,w=0,m=0,g=r.length-1,k=n.length-1;for(;w<=g&&m<=k;)if(v[m]!==t)if(v[k]!==t)if(c=n[m],s=r[w],c&&s&&s.key===c.key)f=v[m],h=y[w]=A(e,s,c,f,o),w++,m++;else if(c=n[k],s=r[g],c&&s&&s.key===c.key)f=v[k],h=y[g]=A(e,s,c,f,o),g--,k--;else{if(p===t)for(l=m,p={};l<=k;l++)c=n[l],c&&c.key!==t&&(p[c.key]=l);s=r[w],d=s&&s.key!==t?p[s.key]:t,d!==t?(c=n[d],f=v[d],h=y[w]=G(e,s,c,f,o),E(e,h,S(v[m])),h!==f&&(N(e,f),x(c,f,o)),v[d]=t):(h=y[w]=b(s,o),E(e,h,S(v[m]))),w++}else k--;else m++;for(u=g<r.length-1?S(y[g+1]):a;w<=g;)h=b(r[w],o),y[w]=h,E(e,h,u),w++;for(;m<=k;)f=v[m],f!==t&&(N(e,f),x(n[m],f,o)),m++;i.children=y})(e,r,n,o,l),o):r instanceof Node&&n instanceof Node?(o.node=r,o):b(r,l)};function C(e,...r){let n,i=r[0];if(!i||!a(i)||y(i)||i._t||i.props?i=s:r.shift(),i=r.length>1?{...i,children:r}:1===r.length?{...i,children:r[0]}:i,u(e)&&~(n=e.indexOf("."))){let t=e.slice(n+1).replace(/\./g," ");i.class=i.class?t+" "+String(i.class):t,e=e.slice(0,n)}if(i.key!=i.key)throw new Error("Invalid NaN key");let o=u(e)?1:p(e)?2:t;if(o===t)throw new Error("Invalid VNode type");return{vtype:o,_t:e,key:i.key,props:i}}C.retain=e=>C("=");const L=C;e.Fragment=e=>e.children,e.app=function(e,r,n={}){let l,d={...i,manualRedraw:n.manualRedraw},c=r.$_REF;if(d.directives={...d.directives,...n.directives||{}},c!==t)throw Error("App already mounted on this node");return l=b(e,d),c=r.$_REF={ref:l,vnode:e},r.textContent="",E(r,l,t),o.push(d.rerender=(t=e)=>{c.ref=A(r,t,c.vnode,c.ref,d),c.vnode=t})&&d.rerender},e.h=C,e.m=L,e.onRemove=e=>l.push(e),e.redraw=e=>{for(let e=0;e<o.length;e++)o[e]()}}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "closures",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "description": "Minimalist virtual dom library",
5
5
  "type": "module",
6
6
  "main": "dist/closures.cjs",
@@ -18,7 +18,7 @@
18
18
  ],
19
19
  "devDependencies": {
20
20
  "bundt": "1.1.5",
21
- "flitch": "0.7.2",
21
+ "flitch": "0.7.3",
22
22
  "jsdom": "^15.1.1"
23
23
  },
24
24
  "keywords": [