@@ -82,14 +82,90 @@ const sample = <T>(container: Gettable<T>) => container.get()
8282export type Signal < T > = Gettable < T > & Updates < void > & Cancellable
8383export type SignalSubject < T > = Gettable < T > & Updates < void > & Subject < T >
8484
85+ export type Effect = {
86+ < A > (
87+ upstreams : [ Signal < A > ] ,
88+ perform : ( a : A ) => void
89+ ) : Cancel
90+
91+ < A , B > (
92+ upstreams : [ Signal < A > , Signal < B > ] ,
93+ perform : ( a : A , b : B ) => void
94+ ) : Cancel
95+
96+ < A , B , C > (
97+ upstreams : [ Signal < A > , Signal < B > , Signal < C > ] ,
98+ perform : ( a : A , b : B , c : C ) => void
99+ ) : Cancel
100+
101+ < A , B , C , D > (
102+ upstreams : [ Signal < A > , Signal < B > , Signal < C > , Signal < D > ] ,
103+ perform : ( a : A , b : B , c : C , d : D ) => void
104+ ) : Cancel
105+
106+ < A , B , C , D , E > (
107+ upstreams : [ Signal < A > , Signal < B > , Signal < C > , Signal < D > , Signal < E > ] ,
108+ perform : ( a : A , b : B , c : C , d : D , e : E ) => void
109+ ) : Cancel
110+
111+ < A , B , C , D , E , F > (
112+ upstreams : [
113+ Signal < A > ,
114+ Signal < B > ,
115+ Signal < C > ,
116+ Signal < D > ,
117+ Signal < E > ,
118+ Signal < F >
119+ ] ,
120+ perform : ( a : A , b : B , c : C , d : D , e : E , f : F ) => void
121+ ) : Cancel
122+
123+ < A , B , C , D , E , F , G > (
124+ upstreams : [
125+ Signal < A > ,
126+ Signal < B > ,
127+ Signal < C > ,
128+ Signal < D > ,
129+ Signal < E > ,
130+ Signal < F > ,
131+ Signal < G >
132+ ] ,
133+ perform : ( a : A , b : B , c : C , d : D , e : E , f : F , g : G ) => void
134+ ) : Cancel
135+
136+ < A , B , C , D , E , F , G , H > (
137+ upstreams : [
138+ Signal < A > ,
139+ Signal < B > ,
140+ Signal < C > ,
141+ Signal < D > ,
142+ Signal < E > ,
143+ Signal < F > ,
144+ Signal < G > ,
145+ Signal < H >
146+ ] ,
147+ perform : ( a : A , b : B , c : C , d : D , e : E , f : F , g : G , h : H ) => void
148+ ) : Cancel
149+
150+ (
151+ upstreams : Array < Signal < any > > ,
152+ perform : ( ...values : Array < any > ) => void
153+ ) : Cancel
154+ }
155+
85156/** React to a signal, producing an effect any time it changes */
86- export const effect = < T > (
87- signal : Signal < T > ,
88- effect : Send < T >
157+ export const effect : Effect = (
158+ upstreams : Array < Signal < any > > ,
159+ perform : ( ... values : Array < any > ) => void
89160) => {
90- const job = ( ) => effect ( signal . get ( ) )
161+ const job = ( ) => perform ( ...upstreams . map ( sample ) )
162+ const schedule = ( ) => withReads ( job )
163+
91164 job ( )
92- return signal [ __updates__ ] ( ( ) => withReads ( job ) )
165+
166+ return combineCancels (
167+ upstreams . map ( signal => signal [ __updates__ ] ( schedule ) )
168+ )
93169}
94170
95171export const state = < T > ( initial : T ) => {
0 commit comments