@@ -184,6 +184,78 @@ public static UnityEngine.Events.UnityAction UnityAction<T>(T state, Func<T, Uni
184
184
return ( ) => asyncAction ( state ) . Forget ( ) ;
185
185
}
186
186
187
+ /// <summary>
188
+ /// Create async void(UniTaskVoid) UnityAction.
189
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg) => { /* */ } ))
190
+ /// </summary>
191
+ public static UnityEngine . Events . UnityAction < T > UnityAction < T > ( Func < T , UniTaskVoid > asyncAction )
192
+ {
193
+ return ( arg ) => asyncAction ( arg ) . Forget ( ) ;
194
+ }
195
+
196
+ /// <summary>
197
+ /// Create async void(UniTaskVoid) UnityAction.
198
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1) => { /* */ } ))
199
+ /// </summary>
200
+ public static UnityEngine . Events . UnityAction < T0 , T1 > UnityAction < T0 , T1 > ( Func < T0 , T1 , UniTaskVoid > asyncAction )
201
+ {
202
+ return ( arg0 , arg1 ) => asyncAction ( arg0 , arg1 ) . Forget ( ) ;
203
+ }
204
+
205
+ /// <summary>
206
+ /// Create async void(UniTaskVoid) UnityAction.
207
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2) => { /* */ } ))
208
+ /// </summary>
209
+ public static UnityEngine . Events . UnityAction < T0 , T1 , T2 > UnityAction < T0 , T1 , T2 > ( Func < T0 , T1 , T2 , UniTaskVoid > asyncAction )
210
+ {
211
+ return ( arg0 , arg1 , arg2 ) => asyncAction ( arg0 , arg1 , arg2 ) . Forget ( ) ;
212
+ }
213
+
214
+ /// <summary>
215
+ /// Create async void(UniTaskVoid) UnityAction.
216
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3) => { /* */ } ))
217
+ /// </summary>
218
+ public static UnityEngine . Events . UnityAction < T0 , T1 , T2 , T3 > UnityAction < T0 , T1 , T2 , T3 > ( Func < T0 , T1 , T2 , T3 , UniTaskVoid > asyncAction )
219
+ {
220
+ return ( arg0 , arg1 , arg2 , arg3 ) => asyncAction ( arg0 , arg1 , arg2 , arg3 ) . Forget ( ) ;
221
+ }
222
+
223
+ // <summary>
224
+ /// Create async void(UniTaskVoid) UnityAction.
225
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg, CancellationToken cancellationToken) => { /* */ } ))
226
+ /// </summary>
227
+ public static UnityEngine . Events . UnityAction < T > UnityAction < T > ( Func < T , CancellationToken , UniTaskVoid > asyncAction , CancellationToken cancellationToken )
228
+ {
229
+ return ( arg ) => asyncAction ( arg , cancellationToken ) . Forget ( ) ;
230
+ }
231
+
232
+ /// <summary>
233
+ /// Create async void(UniTaskVoid) UnityAction.
234
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, CancellationToken cancellationToken) => { /* */ } ))
235
+ /// </summary>
236
+ public static UnityEngine . Events . UnityAction < T0 , T1 > UnityAction < T0 , T1 > ( Func < T0 , T1 , CancellationToken , UniTaskVoid > asyncAction , CancellationToken cancellationToken )
237
+ {
238
+ return ( arg0 , arg1 ) => asyncAction ( arg0 , arg1 , cancellationToken ) . Forget ( ) ;
239
+ }
240
+
241
+ /// <summary>
242
+ /// Create async void(UniTaskVoid) UnityAction.
243
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, CancellationToken cancellationToken) => { /* */ } ))
244
+ /// </summary>
245
+ public static UnityEngine . Events . UnityAction < T0 , T1 , T2 > UnityAction < T0 , T1 , T2 > ( Func < T0 , T1 , T2 , CancellationToken , UniTaskVoid > asyncAction , CancellationToken cancellationToken )
246
+ {
247
+ return ( arg0 , arg1 , arg2 ) => asyncAction ( arg0 , arg1 , arg2 , cancellationToken ) . Forget ( ) ;
248
+ }
249
+
250
+ /// <summary>
251
+ /// Create async void(UniTaskVoid) UnityAction.
252
+ /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3, CancellationToken cancellationToken) => { /* */ } ))
253
+ /// </summary>
254
+ public static UnityEngine . Events . UnityAction < T0 , T1 , T2 , T3 > UnityAction < T0 , T1 , T2 , T3 > ( Func < T0 , T1 , T2 , T3 , CancellationToken , UniTaskVoid > asyncAction , CancellationToken cancellationToken )
255
+ {
256
+ return ( arg0 , arg1 , arg2 , arg3 ) => asyncAction ( arg0 , arg1 , arg2 , arg3 , cancellationToken ) . Forget ( ) ;
257
+ }
258
+
187
259
#endif
188
260
189
261
/// <summary>
@@ -202,6 +274,22 @@ public static UniTask<T> Defer<T>(Func<UniTask<T>> factory)
202
274
return new UniTask < T > ( new DeferPromise < T > ( factory ) , 0 ) ;
203
275
}
204
276
277
+ /// <summary>
278
+ /// Defer the task creation just before call await.
279
+ /// </summary>
280
+ public static UniTask Defer < TState > ( TState state , Func < TState , UniTask > factory )
281
+ {
282
+ return new UniTask ( new DeferPromiseWithState < TState > ( state , factory ) , 0 ) ;
283
+ }
284
+
285
+ /// <summary>
286
+ /// Defer the task creation just before call await.
287
+ /// </summary>
288
+ public static UniTask < TResult > Defer < TState , TResult > ( TState state , Func < TState , UniTask < TResult > > factory )
289
+ {
290
+ return new UniTask < TResult > ( new DeferPromiseWithState < TState , TResult > ( state , factory ) , 0 ) ;
291
+ }
292
+
205
293
/// <summary>
206
294
/// Never complete.
207
295
/// </summary>
@@ -465,6 +553,93 @@ public UniTaskStatus UnsafeGetStatus()
465
553
}
466
554
}
467
555
556
+ sealed class DeferPromiseWithState < TState > : IUniTaskSource
557
+ {
558
+ Func < TState , UniTask > factory ;
559
+ TState argument ;
560
+ UniTask task ;
561
+ UniTask . Awaiter awaiter ;
562
+
563
+ public DeferPromiseWithState ( TState argument , Func < TState , UniTask > factory )
564
+ {
565
+ this . argument = argument ;
566
+ this . factory = factory ;
567
+ }
568
+
569
+ public void GetResult ( short token )
570
+ {
571
+ awaiter . GetResult ( ) ;
572
+ }
573
+
574
+ public UniTaskStatus GetStatus ( short token )
575
+ {
576
+ var f = Interlocked . Exchange ( ref factory , null ) ;
577
+ if ( f != null )
578
+ {
579
+ task = f ( argument ) ;
580
+ awaiter = task . GetAwaiter ( ) ;
581
+ }
582
+
583
+ return task . Status ;
584
+ }
585
+
586
+ public void OnCompleted ( Action < object > continuation , object state , short token )
587
+ {
588
+ awaiter . SourceOnCompleted ( continuation , state ) ;
589
+ }
590
+
591
+ public UniTaskStatus UnsafeGetStatus ( )
592
+ {
593
+ return task . Status ;
594
+ }
595
+ }
596
+
597
+ sealed class DeferPromiseWithState < TState , TResult > : IUniTaskSource < TResult >
598
+ {
599
+ Func < TState , UniTask < TResult > > factory ;
600
+ TState argument ;
601
+ UniTask < TResult > task ;
602
+ UniTask < TResult > . Awaiter awaiter ;
603
+
604
+ public DeferPromiseWithState ( TState argument , Func < TState , UniTask < TResult > > factory )
605
+ {
606
+ this . argument = argument ;
607
+ this . factory = factory ;
608
+ }
609
+
610
+ public TResult GetResult ( short token )
611
+ {
612
+ return awaiter . GetResult ( ) ;
613
+ }
614
+
615
+ void IUniTaskSource . GetResult ( short token )
616
+ {
617
+ awaiter . GetResult ( ) ;
618
+ }
619
+
620
+ public UniTaskStatus GetStatus ( short token )
621
+ {
622
+ var f = Interlocked . Exchange ( ref factory , null ) ;
623
+ if ( f != null )
624
+ {
625
+ task = f ( argument ) ;
626
+ awaiter = task . GetAwaiter ( ) ;
627
+ }
628
+
629
+ return task . Status ;
630
+ }
631
+
632
+ public void OnCompleted ( Action < object > continuation , object state , short token )
633
+ {
634
+ awaiter . SourceOnCompleted ( continuation , state ) ;
635
+ }
636
+
637
+ public UniTaskStatus UnsafeGetStatus ( )
638
+ {
639
+ return task . Status ;
640
+ }
641
+ }
642
+
468
643
sealed class NeverPromise < T > : IUniTaskSource < T >
469
644
{
470
645
static readonly Action < object > cancellationCallback = CancellationCallback ;
0 commit comments