@@ -13,7 +13,13 @@ const effects = new WeakMap;
1313 */
1414const onGC = dispose => dispose ( ) ;
1515
16- export default effect => {
16+ let remove = true ;
17+
18+ /**
19+ * @param {Function } effect the reactive `effect` callback provided by a 3rd party library.
20+ * @returns
21+ */
22+ export const attach = effect => {
1723 /**
1824 * Render with smart updates within a generic container.
1925 * If the `what` is a function, it automatically create
@@ -24,20 +30,28 @@ export default effect => {
2430 * @returns {T }
2531 */
2632 return ( where , what ) => {
27- let dispose = effects . get ( where ) ;
28- if ( dispose ) {
29- drop ( dispose ) ;
30- dispose ( ) ;
31- }
32- if ( typeof what === 'function' ) {
33- const wr = new WeakRef ( where ) ;
34- dispose = effect ( ( ) => { render ( wr . deref ( ) , what ( ) , false ) } ) ;
35- effects . set ( where , dispose ) ;
36- return create ( dispose , onGC , { return : where } ) ;
37- }
38- else {
39- effects . delete ( where ) ;
40- return render ( where , what , false ) ;
41- }
33+ remove = typeof what !== 'function' ;
34+ detach ( where ) ;
35+
36+ if ( remove ) return render ( where , what , false ) ;
37+ remove = true ;
38+
39+ const wr = new WeakRef ( where ) ;
40+ const dispose = effect ( ( ) => { render ( wr . deref ( ) , what ( ) , false ) } ) ;
41+ effects . set ( where , dispose ) ;
42+ return create ( dispose , onGC , { return : where } ) ;
4243 } ;
4344} ;
45+
46+ /**
47+ * Allow manual cleanup of subscribed signals.
48+ * @param {Element } where a reference container previously used to render signals.
49+ */
50+ export const detach = where => {
51+ const dispose = effects . get ( where ) ;
52+ if ( dispose ) {
53+ if ( remove ) effects . delete ( where ) ;
54+ drop ( dispose ) ;
55+ dispose ( ) ;
56+ }
57+ } ;
0 commit comments